这个 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)