在 Rails 中保护 SQL 注入

Posted

技术标签:

【中文标题】在 Rails 中保护 SQL 注入【英文标题】:Protecting SQL injection in Rails 【发布时间】:2014-10-17 15:36:24 【问题描述】:

所以..有人试图进入我的服务器..

从日志中我看到他们正在尝试进行一些基于 php 的攻击,但我仍然想减轻这种情况..

他们正试图通过这个 URL 注入 SQL

/sign_in?t=login'+union+select+char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33)+--+

所以在 Rails 环境中,这在 params 哈希中作为

"t"=>"login' union select char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33),char(38,126,33) -- "

由于我将t 参数列入白名单,所以这里没有问题,但如果我忘记将那里列入白名单,我想确保其他网址都可以

首先,我不确定他们试图通过这种攻击达到什么目的。

第二,关于

Model.find params[:id]

Rails 在这种情况下会清理输入吗?还是我必须自己做?

【问题讨论】:

【参考方案1】:

只要不使用纯字符串构建自己的条件,比如:

User.where("t LIKE '%#params[:t]%'")

相反,它应该是以下数组条件:

User.where("t = ?", params[:t])

我认为这在大多数 Rails 应用程序中是非常安全的。

未来阅读:http://guides.rubyonrails.org/security.html#sql-injection

所以,如果您使用正确的 Rails 方法(它会为您处理清洁部分),我认为您不需要自己转义字符串

【讨论】:

User.where("t = ?", "%#params[:t]%") 安全吗? 是的。它将给出与User.where("t = ?", params[:t]) 相同的结果

以上是关于在 Rails 中保护 SQL 注入的主要内容,如果未能解决你的问题,请参考以下文章

Rails SQL注入?

如何在 order rails 查询中修复 sql 注入

以下代码片段是不是容易受到 Rails 5 中 SQL 注入的影响?

这个 Rails 3 搜索是不是容易受到 SQL 注入的攻击?

Rails Brakeman:Arel 的 SQL 注入

在codeigniter中逃避足够的防止sql注入的保护