Ruby on rails Rails方法易受SQL注入攻击?

Ruby on rails Rails方法易受SQL注入攻击?,ruby-on-rails,activerecord,sql-injection,Ruby On Rails,Activerecord,Sql Injection,哪些Rails方法容易受到SQL注入的攻击,其形式是什么 例如,我知道使用字符串参数的位置易受攻击: Model.where("name = #{params[:name]}") # unsafe # unsafe params[:order] = "1; --\n drop table users;\n --" Model.order("#{params[:order]} ASC") # safe order_clause = sanitize(params[:order]) Model.

哪些Rails方法容易受到SQL注入的攻击,其形式是什么

例如,我知道使用字符串参数的位置易受攻击:

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

# safe
order_clause = sanitize(params[:order])
Model.order(order_clause)
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]]
但参数化字符串或散列不是:

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

我最想知道的是where、order、limit和join,但我想知道可能是攻击向量的任何其他方法。

一般来说:如果您让用户在没有转义代码的情况下将任何文本输入并保存到数据库中,可能会损害您的系统。尤其是当这些文本可能包含标记/代码片段时。

在Rails中,where、order、limit和join都有易受攻击的形式。但是,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]])
命令

字符串形式易受攻击:

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

# safe
order_clause = sanitize(params[:order])
Model.order(order_clause)
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]]
极限

Limit没有易受攻击的表单,因为Rails预先将输入强制转换为整数

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

字符串形式易受攻击:

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

# safe
order_clause = sanitize(params[:order])
Model.order(order_clause)
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]]

更全面的信息可以在上找到。

我知道纯粹的链接发布是不受欢迎的。但在这种情况下,它比任何其他答案都要快:无论何时混合SQL片段和用户数据,您都可能容易受到SQL注入的攻击。我认为所有方法都是如此,就像您为where提供的示例一样。如果你不使用,你会很脆弱吗?漏洞是有限度的。Rails将执行的SQL操作数限制为1。因此,用户不能以一个字母结束您的选择;然后写一个全新的陈述。我同意,与其看具体的方法,还不如理解输入。也看到