ruby-on-rails - 是否可以使用带有 Active Record 的 SQL 注入(inject)来修改数据库

标签 ruby-on-rails activerecord sql-injection

使用 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/

相关文章:

mysql - 在 Rails 模型中使用范围收集 "private"帖子

ruby-on-rails - Rails 3.0 在每个循环中有 "or"语句

mysql - ActiveRecord 在 Ruby 1.9.2-rc1 下以 ASCII-8Bit 返回数据

ruby-on-rails - Rails Reaper 不工作

sql - 如何安全地允许用户定义的 SQL 查询?

ruby-on-rails - 在 rails 中找不到 pg_dump

ruby-on-rails - 如何在Ruby in Rails中使用外部API

sql - 为什么 Timeout.timeout(sec) 不适用于 activerecord

security - "Bobby Tables"XKCD 漫画中的 SQL 注入(inject)是如何工作的?

php - 插入html/文本到mysql