Ale*_*ark 5 ruby ruby-on-rails sanitize ruby-on-rails-2 rails-activerecord
我对使用问号之间的差异感到困惑,例如
Foo.find(:all, :conditions => ['bar IN (?)', @dangerous])
Run Code Online (Sandbox Code Playgroud)
并使用sprintf样式字段类型,例如
Bar.find(:all, :conditions => ['qux IN (%s)', @dangerous])
Run Code Online (Sandbox Code Playgroud)
消毒投入.是否有任何安全优势,如果你知道你正在寻找一个数字 - 比如一个ID - 而不是一个字符串,在使用%d over?,或者你只是在字符串出现时要求一个大的讨厌错误?
Rails 3和4中的更新.where语法是否会发生这种变化?
%s适用于字符串。主要区别是%s不添加引号。从ActiveRecord::QueryMethods.where:
最后,您可以在模板中使用 sprintf 样式的 % 转义符。这与之前的方法略有不同;您有责任确保模板中的值得到正确引用。这些值将传递到连接器以进行引用,但调用者负责确保它们在生成的 SQL 中用引号引起来。引用后,使用与 Ruby 核心方法相同的转义符插入值
Kernel::sprintf。
例子:
User.where(["name = ? and email = ?", "Joe", "joe@example.com"])
# SELECT * FROM users WHERE name = 'Joe' AND email = 'joe@example.com';
User.where(["name = '%s' and email = '%s'", "Joe", "joe@example.com"])
# SELECT * FROM users WHERE name = 'Joe' AND email = 'joe@example.com';
Run Code Online (Sandbox Code Playgroud)
更新:
您正在传递一个数组。%s似乎需要.to_s论证,所以这可能不会按预期工作:
User.where("name IN (%s)", ["foo", "bar"])
# SELECT * FROM users WHERE (name IN ([\"foo\", \"bar\"]))
User.where("name IN (?)", ["foo", "bar"])
# SELECT * FROM users WHERE (name IN ('foo','bar'))
Run Code Online (Sandbox Code Playgroud)
对于简单的查询,您可以使用哈希符号:
User.where(name: ["foo", "bar"])
# SELECT * FROM users WHERE name IN ('foo', 'bar')
Run Code Online (Sandbox Code Playgroud)