【问题标题】:The best way to secure yourself against sql injection in nodejs在nodejs中保护自己免受sql注入的最佳方法
【发布时间】:2016-11-17 11:19:09
【问题描述】:

这是设置。

我正在使用 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 url、我的 request.get url 或我的过程名称,但他仍然可以看到正在发送的参数(用户名、代码) 他可以更改这些参数,使他能够执行他不应该执行的程序。

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

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

【问题讨论】:

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

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


【解决方案1】:

这里有一些建议:

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

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

即使您手动包含该过程,仍然存在问题。在您现有的代码中,对外部服务的调用将“req.params.username”参数放在procedureName 之前。对于大多数 HTTP 解析框架来说,参数是先来先服务的。看到这段代码后我会尝试的第一个攻击是注入 '&procedureName=something_i_shouldnt_be_able_to_call' 进入我的用户名。这将导致您包含的过程名称属性被忽略,而我提交的属性将被使用。您可以通过将基于用户输入的参数放在最后并在字符串插值之前对用户输入进行 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 服务的文档中找到对此的确认,否则确定这一点的唯一方法是通过我上面建议的方法之一。

希望这会有所帮助!

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 如何“逃避我的网络服务上的输入数据”?
    • 另外,如果您能发布一些在网络服务上使用独特令牌的参考资料,我将非常感激。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    • 2020-05-06
    • 1970-01-01
    • 2010-11-04
    • 2010-12-24
    • 2014-01-15
    • 1970-01-01
    相关资源
    最近更新 更多