我正在阅读 Rails 指南中有关 SQL 注入攻击的内容,想知道以下行是否容易受到 SQL 注入攻击:
accounts.where("lower(name) LIKE '%#{params[:query].downcase}%'")
如果我正确阅读并理解了指南,用户可以做类似的事情吗
`'\''; DROP TABLE users;`
那会让我的桌子掉下来吗?
- - - 编辑 - - -
这些示例相同:
Account.where(id: account_id).first
current_user.actions.where(id: params[:clear_action_reminder]).first
edits.where.not(account_id: non_human_ids)
Rating.where(project_id: @project.id, account_id: current_user.id).first_or_initialize
这些当然是特定于应用程序的查询,但是因为查询中没有?
,所以这些都可能是灾难性的吗?
根据 pgsql-general 邮件列表中的讨论,它可能对通用 SQL 注入开放:
http://www.postgresql.org/message-id/[email protected]
发帖人查看了 ActiveRecord 的内部结构并报告说它使用了 libpq's
PQsendQuery
,它确实接受了几个用分号分隔的查询。这是 2014 年的,所以大概是最新的。因此,假设您
params[:query].downcase
尚未经过一层引用,DROP TABLE
则可以将 a 注入其中。即使使用 ActiveRecord
PQexecParams
或不接受分号分隔查询的类似调用,仍然有可能注入函数调用,如...LIKE '%whatever' AND do_something_bad(...) AND 'whatever'='%'
. 这种可能性是由于缺少正确的文字字符串引用或未按照 API 的建议处理参数而打开的。甚至在使用准备好的语句或注入适当转义时,
LIKE
用户提供的内容无论如何都需要额外的特殊引用,因为它有自己的语法%
和_
通配符,并且有自己的转义机制,\
可以用ESCAPE
子句配置。否则用户无法搜索文字%
或_