易受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
,但想知道其他可能是攻击媒介的方法。
在Rails中,where
,order
,limit
和joins
都具有易受攻击的形式。但是,Rails将执行的SQL操作的数量限制为1,因此漏洞受到限制。攻击者无法结束一条语句并执行新的任意一条。
[Where
具有一种易受攻击的形式:字符串。
# 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
Limit没有易受攻击的形式,因为Rails事先将输入强制转换为Integer。
Model.limit("1; -- \n SELECT password from users; -- ")
=> ArgumentError: invalid value for Integer(): "1; -- \n SELECT password from users; -- "
Joins
字符串形式易受攻击:
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上找到更全面的信息。
通常:如果让用户输入任何文本并将其保存到数据库中而没有转义代码,则可能会损害系统。特别是如果这些文本可能包含标签/代码段。