在 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 5 中 SQL 注入的影响?