在 rails 中,推荐的方法来清理用户输入以包含订单

In rails, what is the recommended way to sanitize user input for order inclusion

提问人:Tezyn 提问时间:7/8/2021 最后编辑:Tezyn 更新时间:7/8/2021 访问量:484

问:

我了解where方法的哈希和参数化方法,但是我在尝试将输入运行到order()中时遇到了问题。

具体来说,我正在尝试使用 .因为这包括一个带有用作原始 sql 的参数的方法,所以我收到以下警告。.order(["levenshtein(lower(name), ?)",[@form.name.downcase]])

Dangerous query method (method whose arguments are used as raw SQL) called with non-attribute argument(s): 
"levenshtein(lower(name), ?)". Non-attribute arguments will be disallowed in Rails 6.1. 
This method should not be called with user-provided values, such as request parameters or model attributes. 
Known-safe values can be passed by wrapping them in Arel.sql().

为了解决这个问题,我尝试实现sanitize_sql_for_order并将我的顺序更改为 .它似乎正在正确逃脱,但我不断收到与上述相同的警告。.order(MyClass.sanitize_sql_for_order(["levenshtein(lower(name), ?)",[@form.name.downcase]]))ORDER BY levenshtein(lower(name), 'test ''2')

我知道我可以包装我的原始 sql,但即使这样也特别指出它不应该与用户输入一起使用。请注意,sanitize_sql_for_order 方法在其处理过程中调用 Arel.sql。Arel.sql()

rails 推荐使用用户输入进行 order 语句的方式是什么,以便它正确地转义它以防止 SQL 注入。

ruby-on-rails sql-order-by SQL注入 清理

评论

0赞 Sebastián Palma 7/8/2021
您是如何实现该部件的?Arel.sql(...)
0赞 Tezyn 7/8/2021
@SebastianPalma .order(MyClass.sanitize_sql_for_order([Arel.sql(“levenshtein(lower(name), ?)”),[@form.name.downcase]])) 它确实删除了警告,但由于 arel 文档说它仅适用于已知的安全 sql,我不认为这是最好的方法。
0赞 Sebastián Palma 7/8/2021
尝试删除 ,只留下 Arel.sql 里面。MyClass.sanitize_sql_for_order(...)order
0赞 Tezyn 7/9/2021
@SebastianPalma感谢您的回复。它确实通过将警告包装在 Arel.sql() 中来消除警告。但是,这是清理用户提供的输入的“正确”方法,还是在包含数据进行结果排序时对其进行清理的“正确”方法?
0赞 Sebastián Palma 7/9/2021
据我所知,这已经“够了”。您可以查看这个永无止境的 Github 问题。

答: 暂无答案