ActiveRecord的"order"方法是否容易受到SQL注入攻击?

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的建议的方法.

谢谢大家.


dmc*_*lly 9

简短的回答是你需要消毒你的输入.

如果您计划插入的字符串来自不受信任的来源(例如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)