在这里,我只是使用替换字符,并向数组发送活动记录。
string_one = Ryan
string_two = Smith
@x = Client.find(:all, conditions: [“first_name: ?, last_name = ?”, string_one, string_two ])
你通常会在 Rails 3 和 4 中看到这样的语法:
@x = Client.where(first_name: string_one, last_name: string_two)
如果你需要做比x = ? AND y = ?
更复杂的WHERE
过滤器,那么参数化字符串通常编码如下:
@x = Client.where('birthdate > ? OR birthdate IS NULL', 21.years.ago)
但是,是的,您在问题中提供的语法可以安全地进行SQL注入,就像本答案中提供的语法一样。
如果您使用 ActiveRecord 函数来提供参数,则可以很好地抵御 SQL 注入攻击。 前任。
@x = Client.find(:all, conditions: [“first_name: ?, last_name = ?”,
string_one, string_two ])
Client#find 将正确引用string_one的值,以防止(无意或恶意)操纵发送到数据库的实际 SQL。 对于大多数ORM和参数化机制来说都是如此。
你可能会遇到麻烦的地方是像这样构建原始 SQL:
@x = Client.find_by_sql("SELECT foo WHERE first_name=#{string_one}")
在这种情况下,"string_one"可以包含任意 SQL。 当你构建这样的原始SQL时,你必须小心防止这种情况;有一种 #sanitize 方法可以提供帮助。