ActiveRecord的“order”方法是否通过散列易受SQL注入攻击?

时间:2014-12-10 10:02:22

标签: ruby-on-rails activerecord

(HERE)添加相同的问题,我打算使用hash而不是string作为参数。说,

User.order(params[:column].to_sym => params[:direction].to_sym)

从页面传递params[:column]params[:direction]以对表(Reference)进行排序。我甚至将.to_sym添加到两个参数中,以便它被强制为符号而不是字符串只是为了安全(虽然我不确定这是否是必要的)

现在,我想知道这种方法是否安全。

P.S。尝试过ransack gem,但是我无法进行嵌套查询。所以我写了自己的可自定义的。

2 个答案:

答案 0 :(得分:2)

我认为至少仍然可以使用Denail of Service攻击。 http://brakemanscanner.org/docs/warning_types/denial_of_service/index.html

引用来自一个名为brakeman的漂亮宝石,它在rails应用程序中找到了有价值的东西。

一般情况下,我建议您使用the other issue you posted中的@dmcnally方法。

这是我在自己的项目中所做的一个例子:

SORT = {  newest: { created_at: :desc },
          cheapest: { price: :asc },
          most_expensive: { price: :desc }
}.stringify_keys

然后使用SORT[param[:sort]]获取排序顺序。你也可以通过使用两个单独的哈希方向和列来实现这一点,就像你想象的那样。如果你使用制动器,你将能够有一点但安全,因为它找到了大多数类似的东西。

答案 1 :(得分:1)

符号不能保护您免受SQL注入,查询参数化可以保护您免受SQL注入 - 这只能在值侧,而不是在列名侧。从另一篇文章中得出的结论是“在调用.order”时“在列名中使用插值字符串是不安全的”,而不是“在调用.order时使用字符串不安全”,

您的示例使用散列定义排序 - 该散列被转换为AR中的参数化SQL查询,因此只要您清理列名称它就是安全的。一种自由的做法是:

raise "Unknown column name #{params[:column]}" unless YourModel.column_names.include?(params[:column])

PS你的例子中.to_sym的作用是它允许第三方在ruby vm上定义一个新符号。符号永远不会被垃圾收集,所以攻击者可以发送许多不同的值,以便你的ruby进程占用系统内存 - 从而打开你的ddos攻击。最后的演员没有做任何事情,因为如果你看here你会注意到你的价值被投入到字符串中:)