Mik*_*ike 15 sql ruby-on-rails-4
我知道在调用时使用插值字符串是不安全的.where.
例如:
Client.where("orders_count = #{params[:orders]}")
应改写为:
Client.where("orders_count = ?", params[:orders])
调用时使用插值字符串是否安全.order?如果没有,应该如何重写以下内容?
Client.order("#{some_value_1}, #{some_value_2}")
Mik*_*ike 17
是的,ActiveRecord的的"秩序"的方法是容易受到SQL注入.
不,这不是安全打电话时使用插值的字符串.order.
我的问题的上述答案已得到Aaron Patterson的证实,他将我指向http://rails-sqli.org/#order.从该页面:
在ORDER BY子句中利用SQL注入很棘手,但CASE语句可用于测试其他字段,将sort列切换为true或false.虽然可能需要许多查询,但攻击者可以确定该字段的值.
因此,手动检查任何order安全的东西是很重要的; 也许通过使用类似于@dmcnally的建议的方法.
谢谢大家.
简短的回答是你需要消毒你的输入.
如果您计划插入的字符串来自不受信任的来源(例如Web浏览器),那么您需要先将它们映射到可信值.你可以通过哈希来做到这一点:
# Mappings from known values to SQL
order_mappings = {
'first_name_asc' => 'first_name ASC',
'first_name_desc' => 'first_name DESC',
'last_name_asc' => 'last_name ASC',
'last_name_desc' => 'last_name DESC',
}
# Ordering options passed in as an array from some source:
order_options = ['last_name_asc', 'first_name_asc']
# Map them to the correct SQL:
order = order_options.map{|o| order_mappings[o] }.compact.join(', ')
Client.order(order)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6806 次 |
| 最近记录: |