如何使用 POST 请求防止 ruby on rails 中的 SQL 注入

how to prevent SQL injection in ruby on rails with post request

提问人:Hemant Goyal 提问时间:5/23/2018 更新时间:5/23/2018 访问量:457

问:

我在 ROR 代码中收到一个安全错误,当我在代码上运行 OWASP Zed 攻击代理 (ZAP) 工具时,可以在一个 post 请求中注入 SQL。 我有一个不带任何参数的get_auth_token方法,ZAP工具在此请求中添加了一个查询参数,并且在执行修饰符请求时,页面加载正常,这是一个问题

下面是添加了查询参数的修改后的 url

https://example.com/api/sessions/get_auth_token?query=query+AND+1%3D1+--+

get_auth_token实现如下所示

def get_auth_token
  user = User.find_by(id: session[:user_id], disabled: false) 
 if session[:user_id]
  if user
  token = AuthToken.issue(user_id:user.username)
  session[:user_id] = user.id
  session[:username] = user.username
  session[:project_id] = user.get_setting('xyz', nil)
  User.update(user.id, :token=>token)

我不想将此请求转换为 GET。我看过很多防止SQL注入的例子,它们都集中在接受一些参数的方法上。我的方法不接受任何参数。如何确保它不接受任何外部参数来防止此SQL注入

Ruby-on-Rails Ruby-on-Rails-3 SQL注入

评论

0赞 Unixmonkey 5/24/2018
这看起来可能是误报。如果可能,请发布该工具声称的内容。我见过运行请求并记录其输出的工具,然后使用额外的 SQL-injection-trying 参数运行相同的请求,如果结果不同(即使只是时间戳差异),它认为注入有效。在这种情况下,您似乎正在生成并返回一个新的身份验证令牌,该令牌在请求之间会有所不同。
0赞 Hemant Goyal 5/25/2018
该工具声称页面结果由于外部查询参数而被修改。即使结果没有被修改,我也想确保如果传递了外部参数,我的应用程序会引发错误。
0赞 Unixmonkey 5/25/2018
你总是可以做这样的事情,但是在代码中乱扔无用的东西来取悦工具并不理想。您可以在应用程序范围内配置,以在任何不允许的参数上引发错误,然后在每个控制器上使用 strong_parameters,但这仍然可能无法满足此工具,因为 500 的呈现方式与没有参数的请求不同。这些工具很愚蠢,旨在帮助您审核自己,但只有您完全了解您的应用程序。raise if params[:query]config.action_controller.raise_on_unfiltered_parameters = true

答: 暂无答案