在nodejs中保护自己免受sql注入的最佳方法

时间:2016-07-14 13:43:26

标签: sql-server node.js security stored-procedures sql-injection

这是设置。

我正在使用ajax发送POST,我将程序的参数发送到nodejs服务器。在这种特殊情况下,用户名和代码。

此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(){});
});

前端用户无法看到我的webservice网址,我的request.get url或我的程序名称,但他仍然可以看到正在发送的参数(用户名,代码) 他可以改变这些参数,使他能够执行一个他不应该执行的程序。

他也可以多次调用POST请求,如果是插入过程,则用一堆垃圾填满数据库。

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

2 个答案:

答案 0 :(得分:1)

这里有一些建议:

不要在这种程度上进行元编程。在每个程序的应用程序上创建单独的路由,然后自己注入这些“代码”。这将允许您执行诸如验证用户输入以确保它不是传入的垃圾数据,以及速率限制特定路由以确保数据库未充满垃圾。

您还可以创建允许“代码”的白名单数组,并确保whitelist.instanceOf(procedure) != -1,但这不允许您进行每路径输入验证。

即使您手动包含该程序,仍然存在问题。在现有代码中,调用外部服务会在procedureName之前放置'req.params.username'参数。对于大多数HTTP解析框架,参数是先到先得。在看到这段代码之后我会尝试的第一个攻击之一就是注入 '&procedureName=something_i_shouldnt_be_able_to_call'  进入我的用户名。这将导致忽略您包含的procedureName属性,而将使用我提交的属性。您可以通过在字符串插值之前放置基于用户输入的params last和对用户输入进行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
  4. 重申 - 不要相信用户给你过程代码 - 制作单独的路由并自己插入数据,URI在进一步处理之前编码所有用户输入,并使用请求选项对象,如:{qs:{name:value}}字符串插值。

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

    希望这有帮助!

答案 1 :(得分:0)

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

相关问题