从Rails 4.0开始,这仍然是防止MYSQL注入攻击的最佳方法吗?



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

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 方法可以提供帮助。

最新更新