gpt4 book ai didi

sql-server - 在 Node.js 中防止 SQL 注入(inject)的最佳方法

转载 作者:太空宇宙 更新时间:2023-11-04 00:37:26 25 4
gpt4 key购买 nike

这是设置。

我正在使用 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 请求,并用一堆垃圾填充数据库。

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

最佳答案

这里有一些建议:

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

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

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

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

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

  1. 尝试执行诸如手动将单引号插入用户输入之类的操作。
  2. 在该特定路径上运行 sqlmap 等工具来测试 SQL 注入(inject)。这将为您提供相当稳健的测试,而无需深入了解 SQL 注入(inject)技术。
  3. 与经验丰富的 Node.js 安全专家安排应用程序安全评估。 (我的联系方式是 liftsecurity.io)

重申一下 - 不要相信用户会向您提供过程代码 - 制作单独的路由并自己插入该数据,在进一步处理之前对所有用户输入进行 URI 编码,并使用请求选项对象,例如:{qs:{name:value}} 而不是字符串插值。

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

希望这有帮助!

关于sql-server - 在 Node.js 中防止 SQL 注入(inject)的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38375910/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com