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

时间:2013-09-21 01:40:38

标签: ruby-on-rails-4

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

string_one = Ryan
string_two = Smith

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

2 个答案:

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