这个 Rails 3 搜索是不是容易受到 SQL 注入的攻击?

Posted

技术标签:

【中文标题】这个 Rails 3 搜索是不是容易受到 SQL 注入的攻击?【英文标题】:Is this Rails 3 search vulnerable to SQL injection?这个 Rails 3 搜索是否容易受到 SQL 注入的攻击? 【发布时间】:2011-05-15 05:45:43 【问题描述】:

假设我在 Rails 3 应用程序的页面上有一个搜索框,您可以在其中按公司名称或城市搜索客户。在我的控制器的索引方法中,我这样做:

if params[:search]
  @clients = Client.where("clients.business_name LIKE :business_name OR clients.city = :city", :business_name => "%#params[:search]%", :city => params[:search])

这些哈希值被替换到 SQL 中并用引号括起来。如果我在搜索框中输入的内容包含引号或其他危险字符,我会在开发日志中看到它们被转义,例如:

...WHERE (clients.business_name LIKE '%Something\' DROP TABLE Foo%'...

或者

...WHERE... OR clients.city = 'Something OR 1=1')

所以,由于 OR 1=1 在 Rails 添加的引号内,它只会产生与城市名称不匹配的结果,并且由于 DROP TABLE 尝试中的引号被转义,它也会产生与企业名称不匹配的结果。

这不是使用实际的准备好的语句,其中首先将查询发送到数据库而不填写搜索值,然后将搜索值发送到数据库进行填写。我认为这是最安全的方法,但 Rails 不这样做;我认为这是因为它并非在所有数据库中都可用,并且实现方式各不相同。

这是否以某种方式对 SQL 注入开放?我没有看到,但同样,它没有使用准备好的语句,所以我想知道。 如果存在漏洞,我怎样才能更安全地执行此操作?

【问题讨论】:

【参考方案1】:

不,这里没有 SQL 注入漏洞。 ActiveRecord 将对您作为第二个参数传递给where 的哈希值调用connection.quote,因此您是安全的。

我能想到的唯一潜在的 SQL 注入点是 connection.quote 中是否存在一些未发现的错误,这不太可能。

【讨论】:

由于很多人都查看了这个问题并且没有人指出漏洞,我接受这个答案。谢谢!当然,如果有人找到,我将不得不更改它。

以上是关于这个 Rails 3 搜索是不是容易受到 SQL 注入的攻击?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 全文搜索 CONTAINS() 是不是容易受到 SQL 注入的攻击?

这个 Python 代码是不是容易受到 SQL 注入的影响? (SQLite3)

Sql Injection - 以下是不是容易受到攻击?

参数化的 java 持久性查询是不是容易受到 sql 注入的影响?

Rails 3.0 中的 Arel 到底是啥?

Rails 虚拟属性搜索或 sql 组合列搜索