【发布时间】: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 注入开放?我没有看到,但同样,它没有使用准备好的语句,所以我想知道。 如果存在漏洞,我怎样才能更安全地执行此操作?
【问题讨论】:
标签: ruby-on-rails security ruby-on-rails-3 sql-injection