Sql server 防止nodejs中sql注入的最佳方法
这是设置 我正在使用ajax发送一篇帖子,其中我将过程的参数发送到nodejs服务器。在这种情况下,用户名和代码 此POST调用request.get以访问执行使用这两个参数的过程的web服务 比如说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
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对象,而不仅仅是插入字符串。完成后,您可以采取以下任何或所有步骤来帮助验证:
{qs:{name:value}}
,而不是字符串插值
有了这些保护,您可能就没事了,因为这里似乎正在使用存储过程。但是,除非您能在web服务的文档中找到对此的确认,否则确保这一点的唯一方法是通过我上面建议的方法之一
希望这有帮助 最好的方法是不要动态地传递要执行的过程的名称。至少你应该用一些加密来混淆。如何“在我的web服务上转义输入数据”?如果你能在web服务上发布一些使用唯一令牌的参考资料,我将非常感激。