这里我只是使用替换字符,并发送活动记录数组。
string_one = Ryan
string_two = Smith
@x = Client.find(:all, conditions: [“first_name: ?, last_name = ?”, string_one, string_two ])
答案 0 :(得分:1)
您通常会在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注入是安全的,本答案中提供的语法也是如此。
答案 1 :(得分:0)
如果使用ActiveRecord函数提供参数,则可以很好地防止SQL注入攻击。离。
@x = Client.find(:all, conditions: [“first_name: ?, last_name = ?”,
string_one, string_two ])
Client#find将正确引用string_one的值,以防止(无意或恶意)操纵发送到DB的实际SQL。大多数ORM和参数化机制都是如此。
你可能遇到麻烦的地方就是建立这样的原始SQL:
@x = Client.find_by_sql("SELECT foo WHERE first_name=#{string_one}")
在这种情况下,'string_one'可以包含任意SQL。当你像这样构建原始SQL时,你必须小心防止这种情况;有#sanitize方法可以提供帮助。