gpt4 book ai didi

ruby-on-rails - Rails 方法易受 SQL 注入(inject)攻击?

转载 作者:行者123 更新时间:2023-12-04 03:35:21 25 4
gpt4 key购买 nike

易受 SQL 注入(inject)攻击的 Rails 方法有哪些,以何种形式存在?

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

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

但是参数化的字符串或散列不是:
Model.where("name = ?", params[:name]) # safe
Model.where(name: params[:name]) # safe

我最想知道 where , order , limitjoins ,但想知道任何其他可能成为攻击媒介的方法。

最佳答案

在 Rails 中,where , order , limitjoins都有脆弱的形式。但是,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 没有易受攻击的形式,因为 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 上找到。 .

关于ruby-on-rails - Rails 方法易受 SQL 注入(inject)攻击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28884030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com