这是设置。
我正在使用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请求,如果是插入过程,则用一堆垃圾填满数据库。
保护自己免受这些攻击的最佳方法是什么?
答案 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对象,而不是仅仅插入字符串。完成后,您可以采取任何或所有这些步骤来帮助验证:
重申 - 不要相信用户给你过程代码 - 制作单独的路由并自己插入数据,URI在进一步处理之前编码所有用户输入,并使用请求选项对象,如:{qs:{name:value}}
字符串插值。
有了这些保护措施,你可能会很好,因为它似乎在这里使用存储过程。但是,除非您可以在Web服务的文档中找到对此的确认,否则唯一的方法是通过我上面建议的方法之一。
希望这有帮助!
答案 1 :(得分:0)
为了防止sql注入,您可以转义Web服务上的输入数据。 并且为了避免数据库中的多个虚假条目,您可以为每个发布请求添加一个唯一标记,并在您的Web服务上验证该标记,如果该标记是合法的,则允许插入,如果不是,则避免该插入。 您正在使用Web服务,因此我认为您必须将这些令牌保留在数据库中以进行验证。