2016-07-14 320 views
1

这是设置。确保自己免受nodejs中sql注入的最佳方式

我使用AJAX的,我派人程序服务器的NodeJS的参数发送POST。在这个特定的情况下,用户名和代码。

这POST调用来request.GET中执行使用这两个参数的过程的Web服务。

例如

app.post('url/:username/:code', function(req,res,next){ 

var procedure = 'EXECUTE procedureName'+req.params.code; 

    request.get('myWslink/myService.asmx/service? 
    callback=&userName='+req.params.username+'&procedureName='+procedure, function(){}); 
}); 

前端用户无法看到我的web服务的URL,我的网址request.GET中或我的过程名,但他仍然可以看到正在发送的参数(用户名,密码) 他能改变这些参数使他能够执行他不应该执行的程序。

他还可以调用一个POST请求一堆次,并用一堆垃圾填满的数据库,如果它是一个插入过程。

保护自己免受这些攻击的最佳方法是什么?

+0

最好的办法是不动态传递过程的名称来执行。至少你应该使用一些加密来混淆。 –

回答

1

这里有几点建议:

不要在这个程度上进行元编程。为每个程序在你的申请上分开路线,然后自己注入这些“代码”。这将允许您执行诸如验证用户输入以确保不会传入垃圾数据以及限制特定路由的比率以确保数据库未填满垃圾。

您还可以创建允许的“代码”白名单阵列,并确保whitelist.instanceOf(procedure) != -1,但这不会让你做的每路输入验证。

即使您手动包含该过程,仍然存在问题。在您现有的代码中,调用外部服务将'req.params.username'参数放在procedureName之前。对于大多数HTTP解析框架,参数先到先得。我在看到此代码后尝试的第一次攻击之一是将 '&procedureName=something_i_shouldnt_be_able_to_call' 注入我的用户名。这会导致您包含的procedureName属性被忽略,而我提交的那个将被用来代替。您可以通过将基于用户输入的参数放在最后并在字符串插值之前将用户输入URI编码,或者将查询字符串包含为名为'qs'的对象来阻止此操作。passed into the options argument to request.

无论这是否创建SQL注入漏洞完全取决于Web服务如何分析参数并执行该过程。最佳情况是服务URI解码每个参数,然后将这些参数作为参数传递给PDO或准备好的语句。我的猜测是它正在使用PDO,只要它被调用。

所以,我最终会建议这里是URI编码每个用户输入提供的参数,并使用上面提到的QS对象传递到请求选项,而不是仅仅插字符串。完成之后,您可以采取以下任意或全部步骤来验证:

  1. 尝试执行诸如手动向用户输入中注入单引号的操作。
  2. 在该特定路由上运行一个像sqlmap这样的工具来测试SQL注入。这将给你一个相当强大的测试,而不需要深入了解SQL注入技术。
  3. 使用经验丰富的node.js安全专业人员安排应用程序安全评估。 (我可以在liftsecurity.io

要重申 - 不要相信用户给你的程序代码 - 使独立路线和自己插入数据,URI编码进一步处理之前,所有的用户输入,并使用请求选项对象,如:{qs:{name:value}}而不是字符串插值。

有了这些保护,你可能会很好,因为它似乎在这里使用存储过程。除非您可以在Web服务的文档中找到对此的确认,否则唯一可以确定的方法是通过我上面建议的方法之一。

希望这会有所帮助!

0

为了防止SQL注入,你可以逃脱你的web服务的输入数据。 ,为避免数据库中存在多个虚假条目,您可以为每个帖子请求添加一个唯一标记,并在您的web服务上验证该标记。如果标记合法,则允许插入,如果不是,则避免插入。 您正在使用Web服务,因为我认为您必须将这些标记保留在数据库中以进行验证。

+0

如何在我的web服务上逃避输入数据? –

+0

另外,如果你可以发布一些引用来处理web服务上的独特的标记,我会非常感激。 –