假设我在 Rails 3 应用程序的页面上有一个搜索框,您可以在其中按公司名称或城市搜索客户。在我的 Controller 的索引方法中,我这样做:
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 注入(inject)开放?我没有看到它,但同样,它没有使用准备好的语句,所以我想知道。 如果存在漏洞,我怎样才能更安全地执行此操作?
最佳答案
不,这里不存在 SQL 注入(inject)漏洞。 ActiveRecord 将对您作为第二个参数传递给 where
的哈希值调用 connection.quote
,因此您是安全的。
我能想到的唯一潜在的 SQL 注入(inject)点是 connection.quote
中是否存在一些未被发现的错误,这是不太可能的。
关于ruby-on-rails - Rails 3 搜索是否容易受到 SQL 注入(inject)攻击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4269399/