使用 Rails 4.0 我有一个 Controller 操作,它在事件记录查询中使用请求参数:
@clients = Client.where(params[:where]).order(params[:order]).limit(params[:limit])
用户是否可以使用sql注入(inject)来修改数据库,或者从数据库中获取不包含在clients表中的信息?
如果是这样,我们将不胜感激,以及一个防止这种可能性的简单方法(我知道占位符或哈希参数可以消除漏洞,但我不知道如何使用它们创建相同的功能)
提前致谢。
编辑
我知道这些方法存在漏洞。我的问题涉及漏洞的程度。我无法在 Rails 指南中找到我的具体问题的答案。
最佳答案
如果参数是字符串,则 where
方法假定其参数是 SQL 片段。
接下来发生的情况可能取决于所使用的数据库,例如 mysql Active Record 关闭了查询包含多个语句的能力,因此这不仅仅是用“;”注入(inject) where 子句的情况。
当前版本的rails在postgres上使用准备好的语句,这也禁止注入(inject)多个语句。
一般来说,依赖于此似乎风险极大,并且可能因其他数据库而异。即使数据修改/盗窃是不可能的,拒绝服务也是微不足道的。
还可以通过使用 EXISTS
的子查询来窃取“是否有电子邮件地址为 xyz 的用户”形式的信息。只要有一点耐心,您也可以提取值,例如,如果我知道用户的 ID 并想要提取他们的电子邮件地址,我可以运行表单的子选择
SELECT * from users where id = 123 and email_address like 'A%'
如果我得到结果,那么我就知道电子邮件地址以 A 开头,我可以转到下一个字母。如果不是,我会检查电子邮件地址是否以 B 开头,依此类推。一旦我得到第一个字符,然后查询表单
SELECT * from users where id = 123 and email_address like 'FA%'
SELECT * from users where id = 123 and email_address like 'FB%'
SELECT * from users where id = 123 and email_address like 'FC%'
允许我提取电子邮件地址的第二个字符。通过几千个查询,您可以获得他们的完整电子邮件地址。
另一种方法是使用 mysql 上的 sleep
函数 - 它将允许根据页面加载时间一次提取一个字节的变量
关于ruby-on-rails - 是否可以使用带有 Active Record 的 SQL 注入(inject)来修改数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32301130/