0

在这里,我只是使用替换字符,并发送活动记录数组。

string_one = Ryan
string_two = Smith

@x = Client.find(:all, conditions: [“first_name: ?, last_name = ?”, string_one, string_two ])
4

2 回答 2

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 注入是安全的,就像这个答案中提供的语法一样。

于 2013-09-21T03:30:01.163 回答
0

如果您使用 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 方法可以提供帮助。

于 2013-09-21T02:48:48.230 回答