Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 防止nodejs中sql注入的最佳方法_Sql Server_Node.js_Security_Stored Procedures_Sql Injection - Fatal编程技术网

Sql server 防止nodejs中sql注入的最佳方法

Sql server 防止nodejs中sql注入的最佳方法,sql-server,node.js,security,stored-procedures,sql-injection,Sql Server,Node.js,Security,Stored Procedures,Sql Injection,这是设置 我正在使用ajax发送一篇帖子,其中我将过程的参数发送到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

这是设置

我正在使用ajax发送一篇帖子,其中我将过程的参数发送到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请求,如果是insert过程,则用一堆垃圾填充数据库


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

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

这里有一些建议:

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

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

即使手动包含该过程,仍然存在问题。在现有代码中,对外部服务的调用将'req.params.username'参数放在procedureName之前。对于大多数HTTP解析框架,参数都是先到先服务的。看到这段代码后,我首先尝试的攻击之一是注入
”&procedureName=一些我不应该调用的东西
输入我的用户名。这将导致忽略包含的procedureName属性,而使用我提交的属性。您可以通过将基于用户输入的参数放在最后,并在字符串插值之前对用户输入进行URI编码,或者将查询字符串包含为名为“qs”的对象来防止这种情况

这是否会创建SQL注入漏洞完全取决于web服务解析参数和执行过程的方式。最佳情况是服务URI解码每个参数,然后将这些参数作为参数传递给PDO或准备好的语句。我的猜测是,考虑到它的调用方式,它正在使用PDO

因此,我在这里的最终建议是对每个用户输入提供的参数进行URI编码,并使用上面提到的传递到请求选项中的qs对象,而不仅仅是插入字符串。完成后,您可以采取以下任何或所有步骤来帮助验证:

  • 尝试手动将单引号插入用户输入
  • 在该特定路径上运行类似sqlmap的工具来测试SQL注入。这将为您提供相当健壮的测试,而不需要深入了解SQL注入技术
  • 与经验丰富的node.js安全专家一起安排应用程序安全评估。(我的电话号码是)
  • 重申一下——不要相信用户会给你过程代码——自己创建单独的路由并插入数据,URI在进一步处理之前对所有用户输入进行编码,并使用请求选项对象,如:
    {qs:{name:value}}
    ,而不是字符串插值

    有了这些保护,您可能就没事了,因为这里似乎正在使用存储过程。但是,除非您能在web服务的文档中找到对此的确认,否则确保这一点的唯一方法是通过我上面建议的方法之一


    希望这有帮助

    最好的方法是不要动态地传递要执行的过程的名称。至少你应该用一些加密来混淆。如何“在我的web服务上转义输入数据”?如果你能在web服务上发布一些使用唯一令牌的参考资料,我将非常感激。