ruby 如何清理Rails API参数

8iwquhpp  于 2023-04-20  发布在  Ruby
关注(0)|答案(2)|浏览(130)

我在做我自己的API,我想知道:如何保护收到的参数?
示例:

  • 我有一个带有brandcolor属性的Car模型。

我的端点在payload中接收到这些参数。我在我的数据库中搜索这个接收到的payload:

car = Car.where(color: params[:color])
# or
car = Car.find_by(brand: params[:brand])
# or writing
Car.first.update!(brand: params[:brand])

但是我很担心如果有人试图利用SQL或XSS怎么办?你怎么处理这个问题?
非常感谢:)

j13ufse2

j13ufse21#

您的问题中的示例都自动防止SQL注入。
官方Rails指南中的相关引用:

7.2.1引言

SQL注入攻击的目的是通过操纵Web应用程序参数来影响数据库查询。SQL注入攻击的一个常见目标是绕过授权,另一个目标是进行数据操纵或阅读任意数据。下面是如何在查询中不使用用户输入数据的示例:

Project.where("name = '#{params[:name]}'")

然后在同一文档中:

7.2.4对策

Ruby on Rails有一个内置的特殊SQL字符过滤器,它将转义'",NULL字符和换行符。使用Model.find(id)Model.find_by_some thing(something)自动应用此对策。但是在SQL片段中,特别是在条件片段(where("...")),connection.execute()Model.find_by_sql()方法中,必须手动应用。
你可以使用位置处理器来清理被污染的字符串,而不是传递字符串,如下所示:

Model.where("zip_code = ? AND quantity >= ?", entered_zip_code, entered_quantity).first

第一个参数是一个带问号的SQL片段。第二个和第三个参数将用变量的值替换问号。
您也可以使用命名处理程序,其值将从所使用的散列中获取:

values = { zip: entered_zip_code, qty: entered_quantity }
Model.where("zip_code = :zip AND quantity >= :qty", values).first

此外,您可以拆分和链接对您的用例有效的条件:

Model.where(zip_code: entered_zip_code).where("quantity >= ?", entered_quantity).first
pxiryf3j

pxiryf3j2#

在大多数情况下,Rails会处理SQL注入。但是,您应该避免将字符串作为参数传递给Active Records方法。避免以下情况:
Car.where(“color = ‘#{params[:color]'”)
这是不愉快的看到;)
使用数组或哈希:
car = Car.where(color: params[:color])
car = Car.where(["color = ?", params[:color])
通过这样做,活动记录将自动转义不需要的字符,防止SQL注入。
更多信息,请参阅Rails文档:https://guides.rubyonrails.org/security.html#sql-injection-countermeasures
在@spickermann报告了一个重大错误后,我更新了这个回复。

相关问题