我有一个简单的问题:
我正在使用此查询来查找 ID 为 2、5 和 6 且附加参数为 false 的多个对象:
Reply.where(:event_id => [2, 5, 6], :looked_at => false)
这非常有效,但我认为它在 SQL 注入方面确实不安全。我将如何将其重新格式化为更安全的查询?
我知道如何用一个参数来做到这一点,但是一旦我传入一个数组,它就不再起作用了。
我有一个简单的问题:
我正在使用此查询来查找 ID 为 2、5 和 6 且附加参数为 false 的多个对象:
Reply.where(:event_id => [2, 5, 6], :looked_at => false)
这非常有效,但我认为它在 SQL 注入方面确实不安全。我将如何将其重新格式化为更安全的查询?
我知道如何用一个参数来做到这一点,但是一旦我传入一个数组,它就不再起作用了。
Reply.where(:event_id => untrusted_array, :looked_at => false)
是安全的。
Reply.where("event_id IN (#{untrusted_array.join(','}) AND looked_at = FALSE")
不安全
Ruby on Rails 有一个针对特殊 SQL 字符的内置过滤器,它将转义 ' 、 " 、 NULL 字符和换行符。使用 Model.find(id) 或 Model.find_by_some thing(something) 会自动应用此对策。但在 SQL片段,尤其是在条件片段(where("..."))、connection.execute() 或 Model.find_by_sql() 方法中,必须手动应用。