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

Ruby on rails 4 从Rails 4.0开始,这仍然是防止MYSQL注入攻击的最佳方法吗?,ruby-on-rails-4,Ruby On Rails 4,在这里,我只是使用一个替换字符,并向数组发送活动记录 string_one = Ryan string_two = Smith @x = Client.find(:all, conditions: [“first_name: ?, last_name = ?”, string_one, string_two ]) 如果您使用ActiveRecord函数来提供参数,则可以很好地防止SQL注入攻击。前 @x = Client.find(:all, conditions: [“first_name

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

string_one = Ryan
string_two = Smith

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

如果您使用ActiveRecord函数来提供参数,则可以很好地防止SQL注入攻击。前

@x = Client.find(:all, conditions: [“first_name: ?, last_name = ?”, 
                  string_one, string_two ])
客户端#find将正确引用字符串#one的值,以防止(无意或恶意)操纵发送到数据库的实际SQL。大多数ORM和参数化机制都是如此

您可能会遇到麻烦的地方是像这样构建原始SQL:

@x = Client.find_by_sql("SELECT foo WHERE first_name=#{string_one}")
@x = Client.where('birthdate > ? OR birthdate IS NULL', 21.years.ago)

在这种情况下,“string_one”可以包含任意SQL。当您构建这样的原始SQL时,您必须小心防止这种情况;有一个#清理方法可以提供帮助。

在Rails 3和4中通常会看到这样的语法:

@x = Client.where(first_name: string_one, last_name: string_two)
如果您需要执行比
x=”更复杂的
WHERE
过滤器?y=?
,则参数化字符串通常按如下方式编码:

@x = Client.find_by_sql("SELECT foo WHERE first_name=#{string_one}")
@x = Client.where('birthdate > ? OR birthdate IS NULL', 21.years.ago)

但是,是的,您在问题中提供的语法是安全的,不受SQL注入的影响,正如本答案中提供的语法一样。

您所说的“rails攻击”是什么意思?我指的是MYSQL注入!我认为Client.find(:all,:conditions…)在Rails 4中已被弃用,但仍然可以安全地抵御攻击。首选方案是链式方法。在第二个示例中,如何将变量传递到查询中?将变量作为附加参数传递。
21.years.ago
就是一个例子,它被用在
占位符中。对不起,我想这可能更清楚没问题!但也许可以为未来的观众修改答案?