Rails方法容易受到SQL注入?

时间:2015-03-05 17:29:55

标签: ruby-on-rails activerecord sql-injection

什么是易受SQL注入攻击的Rails方法,以什么形式?

例如,我知道带有字符串参数的where容易受到攻击:

Model.where("name = #{params[:name}") # unsafe

但是参数化字符串或哈希不是:

Model.where("name = ?", params[:name]) # safe
Model.where(name: params[:name]) # safe

我主要想知道whereorderlimitjoins,但想知道任何其他可能是攻击媒介的方法。

2 个答案:

答案 0 :(得分:3)

在Rails中,whereorderlimitjoins都有易受攻击的形式。但是,Rails将执行的SQL操作数限制为1,因此漏洞有限。攻击者无法结束语句并执行新的任意语句。

<强>其中

哪里有一个易受攻击的形式:字符串。

# string, unsafe
Model.where("name = '#{params[:name]}'")

# hash/parameterized string/array, safe
Model.where(name: params[:name])
Model.where("name = ?", params[:name])
Model.where(["name = ?", params[:name]])

<强>顺序

字符串形式易受攻击:

# unsafe
params[:order] = "1; --\n drop table users;\n --"
Model.order("#{params[:order]} ASC")

# safe
order_clause = sanitize(params[:order])
Model.order(order_clause)

<强>限制

Limit没有易受攻击的形式,因为Rails预先将输入转换为Integer。

Model.limit("1; -- \n SELECT password from users; -- ")
=> ArgumentError: invalid value for Integer(): "1; -- \n SELECT password from users; -- "

<强>加入

字符串形式易受攻击:

params[:table] = "WHERE false <> $1; --"
Model.where(:user_id => 1).joins(params[:table])
=> SELECT "models".* FROM "models" WHERE false <> $1 -- WHERE "models"."user_id" = $1 [["user_id", 1]]

可以在rails-sqli.org找到更全面的信息。

答案 1 :(得分:2)

通常:如果您让用户输入并将任何文本保存到数据库中,而无需转义代码,则可能会损害您的系统。特别是如果这些文本可能包含标签/代码片段。