使用Rails 4.0我有一个控制器动作,它在活动记录查询中使用请求参数:
@clients = Client.where(params[:where]).order(params[:order]).limit(params[:limit])
使用sql注入的用户是否可以修改数据库,或者从客户端表中未包含的数据库中获取信息?
如果是这样的例子将非常感激,以及一种防止这种可能性的简单方法(我知道占位符或哈希参数会消除漏洞,但我不知道如何使用它们创建相同的功能)
提前致谢。
修改
据我所知,这些方法存在漏洞。我的问题涉及脆弱程度。我无法在导轨指南中找到我的具体问题的答案。
答案 0 :(得分:2)
where
方法假设它的参数是一个SQL片段,如果它是一个字符串。
接下来发生的事情可能取决于所使用的数据库,例如在mysql上 Active Record会关闭查询包含多个语句的能力,因此不仅仅是使用'注入where子句的情况。'。
当前版本的rails在postgres上使用预处理语句,这也禁止注入多个语句。
总的来说,依赖于此似乎风险极大,并且可能因其他数据库而异。即使不能进行数据修改/盗窃,拒绝服务也是微不足道的。
还可以窃取表单的信息"是否有用户使用电子邮件地址xyz"通过使用使用EXISTS
的子查询。有一点时间耐心你也可以提取价值,例如,如果我知道用户的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
函数 - 它允许根据页面加载的时间长度一次提取一个字节
答案 1 :(得分:1)
您可以在此处找到您的回复:http://rails-sqli.org/
此网站列出了ActiveRecord中的许多查询方法和选项,这些方法和选项不会清理原始SQL参数,也不打算使用不安全的用户输入进行调用