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

Nat*_*ong 2 security sql-injection ruby-on-rails ruby-on-rails-3

假设我在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])
Run Code Online (Sandbox Code Playgroud)

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

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

要么

...WHERE... OR clients.city = 'Something OR 1=1')
Run Code Online (Sandbox Code Playgroud)

因此,由于在OR 1=1Rails添加的引号内部,它只是不会产生城市名称的匹配,并且由于DROP TABLE尝试中的引用被转义,因此它也不会产生与业务名称匹配的内容.

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

这是以某种方式对SQL注入开放吗?我没有看到它,但是再次,它没有使用准备好的陈述,所以我想知道.如果有漏洞,我怎么能更安全地做到这一点?

Gra*_*ins 5

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

我能想到的唯一可能的SQL注入点是,如果有一些未被发现的bug connection.quote,这是不太可能的.