我在做我自己的API,我想知道:如何保护收到的参数?
示例:
- 我有一个带有
brand
和color
属性的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怎么办?你怎么处理这个问题?
非常感谢:)
2条答案
按热度按时间j13ufse21#
您的问题中的示例都自动防止SQL注入。
官方Rails指南中的相关引用:
7.2.1引言
SQL注入攻击的目的是通过操纵Web应用程序参数来影响数据库查询。SQL注入攻击的一个常见目标是绕过授权,另一个目标是进行数据操纵或阅读任意数据。下面是如何在查询中不使用用户输入数据的示例:
然后在同一文档中:
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()
方法中,必须手动应用。你可以使用位置处理器来清理被污染的字符串,而不是传递字符串,如下所示:
第一个参数是一个带问号的SQL片段。第二个和第三个参数将用变量的值替换问号。
您也可以使用命名处理程序,其值将从所使用的散列中获取:
此外,您可以拆分和链接对您的用例有效的条件:
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报告了一个重大错误后,我更新了这个回复。