首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails 3:无sql注入的查询

Rails 3:无sql注入的查询
EN

Stack Overflow用户
提问于 2010-07-31 20:24:33
回答 4查看 934关注 0票数 1

我喜欢新的Rail 3!

新的查询语法太棒了:

代码语言:javascript
复制
users = User.where(:name => 'Bob', :last_name => 'Brown')

但是当我们需要做像这样的事情时

代码语言:javascript
复制
SELECT * FROM Users WHERE Age >= const AND Money > const2

我们必须使用

代码语言:javascript
复制
users = User.where('Age >= ? and money > ?', const, const2)

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

代码语言:javascript
复制
users = User.where('Age >= #{const} and money > #{const2}')

我喜欢C#/LINQ版本

代码语言:javascript
复制
var users = DB.Where(u => u.Age >= const && u.Money > const2);

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-08-01 01:25:56

使用rails进行新的查询不会受到SQL注入的影响。参数中的所有引号都将转义。

Rails 3 AR已经获得了LINQ已经有一段时间的延迟执行。这使您可以链接任何查询方法。当你想要一个OR的时候,你唯一需要把两个或更多的部分放到一个地方的时候。

除此之外,还有许多不同的方法来执行您的查询。

代码语言:javascript
复制
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)
票数 6
EN

Stack Overflow用户

发布于 2010-07-31 20:49:38

你可能会对MetaWhere感兴趣,你可以用它来写:

代码语言:javascript
复制
users = User.where(:age >= const, :money > const2)
票数 3
EN

Stack Overflow用户

发布于 2010-07-31 20:35:47

在Rails 3中,您可以将这些选择链接在一起。我不了解具体的语法,但这是一个很好的开始:http://railscasts.com/episodes/202-active-record-queries-in-rails-3

基本概念是您可以将作用域或where子句等链接在一起:

这里的元代码:

代码语言:javascript
复制
users = User.where(:age_of_consent).where(:has_credit)

scope :age_of_consent where("age >= ?", 18)
scope :has_credit where("credit > ?", 10)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3378081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档