Rails 3:sql注入免费查询

Ale*_*lex 1 linq ruby-on-rails

我喜欢新的Rail 3!

新的查询语法非常棒:

users = User.where(:name => 'Bob', :last_name => 'Brown')
Run Code Online (Sandbox Code Playgroud)

但是当我们需要做类似的事情时

SELECT * FROM Users WHERE Age >= const AND Money > const2
Run Code Online (Sandbox Code Playgroud)

我们必须使用

users = User.where('Age >= ? and money > ?', const, const2)
Run Code Online (Sandbox Code Playgroud)

这不是很酷.由于SQL注入,以下查询不安全:

users = User.where('Age >= #{const} and money > #{const2}')
Run Code Online (Sandbox Code Playgroud)

我喜欢C#/ LINQ版本

var users = DB.Where(u => u.Age >= const && u.Money > const2);
Run Code Online (Sandbox Code Playgroud)

有没有办法在Rails中做这样的事情?

Sam*_*uel 6

使用rails进行的新查询不易受SQL注入攻击.参数中的任何引号都会被转义.

Rails 3 AR已经获得了LINQ已经有一段时间的延迟执行.这允许您链接任何查询方法.你需要将2个或更多部件放在一个地方的唯一时间OR.

除此之外,还有许多不同的方法可以进行查询.

Users.where('age >= ?', age).where('money > ?', money)
Users.where('age >= ? and money > ?', age, money)

class User < ActiveRecord::Base
  scope :aged, lambda { |age| where('age >= ?', age) }
  scope :enough_money, lambda { |money| where('money > ?', money) }

  scope :can_admit, lambda { |age, money| aged(age).enough_money(money) }
end

Users.aged(18).enough_money(200)
Users.can_admit(18, 200)
Run Code Online (Sandbox Code Playgroud)