在这里,我只是使用替换字符,并发送活动记录数组。
string_one = Ryan
string_two = Smith
@x = Client.find(:all, conditions: [“first_name: ?, last_name = ?”, string_one, string_two ])
在这里,我只是使用替换字符,并发送活动记录数组。
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)
如果你需要做WHERE
比 更复杂的过滤器x = ? AND y = ?
,那么参数化的字符串通常是这样编码的:
@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 方法可以提供帮助。