【问题标题】:rails: how to use database bindings in whererails:如何在 where 中使用数据库绑定
【发布时间】:2012-01-08 08:55:26
【问题描述】:

在 Rails 中,如果我尝试使用 where 获取对象:

Customer.where(:name => "abc")

日志文件显示没有使用数据库绑定。

WHERE "apps"."name" = 'abc'

现在如果我创建一个新对象

Customer.create(:name => "abc", :field => 1)

rails 使用参数

INSERT INTO "customers" ("name", "field") VALUES (?, ?) 

如何让 rails 在 where 也使用数据库参数绑定?

下面的语句也产生同样的 where

Customer.where("name = ?", "abc")

【问题讨论】:

    标签: ruby-on-rails database parameters sql-injection where-clause


    【解决方案1】:

    在 Rails 3.1 中,使用了准备好的语句,因此您会看到如下查询:

    SELECT * FROM customers WHERE customers.name = ? [["name", "abc"]]
    

    据我所知,这适用于 Postgres 而不是 MySql。

    在任何情况下,您都不必担心 SQL 注入。请阅读 Rails 内置的 SQL 注入保护措施:http://guides.rubyonrails.org/security.html#sql-injection

    【讨论】:

    • 如果是这种情况,看起来像是 ORM 的事情,在 WHERE 子句中使用占位符的性能提升是微不足道的,但对于重复的 INSERT 语句之类的事情,这是值得的。准备好的语句不是零成本的东西。
    • @Sean - 我正在使用开发 sqlite,但我仍然看到准备好的创建语句,但没有看到 where
    • @tadman - 我更关心安全性。正如您所说,性能提升将是最小的
    • @tadman,有关 Rails 3.1 中准备好的语句的更多信息,请参阅本文:patshaughnessy.net/2011/10/22/…
    • 您可以使用.where(:name => "abc").where("name = ?", "abc")。两者都是正确的。重要的是您允许 Rails 进行绑定。不要做类似.where("name = #{params[:foo]}") 的事情,因为这会让你很脆弱。相反,您可以使用.where(:name => params[:foo]) 或带有问号的表单。
    猜你喜欢
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    相关资源
    最近更新 更多