什么是易受SQL注入攻击的Rails方法,以什么形式?
例如,我知道带有字符串参数的where
容易受到攻击:
Model.where("name = #{params[:name}") # unsafe
但是参数化字符串或哈希不是:
Model.where("name = ?", params[:name]) # safe
Model.where(name: params[:name]) # safe
我主要想知道where
,order
,limit
和joins
,但想知道任何其他可能是攻击媒介的方法。
答案 0 :(得分:3)
在Rails中,where
,order
,limit
和joins
都有易受攻击的形式。但是,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)
通常:如果您让用户输入并将任何文本保存到数据库中,而无需转义代码,则可能会损害您的系统。特别是如果这些文本可能包含标签/代码片段。