Rails方法容易受到SQL注入的攻击吗?

问题描述 投票:4回答:2

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

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

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

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

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

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

ruby-on-rails activerecord sql-injection
2个回答
4
投票

在Rails中,whereorderlimitjoins都具有易受攻击的形式。但是,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上找到更全面的信息。


2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.