【问题标题】:Rails SQL Injection: How vulnerable is this code?Rails SQL 注入:这段代码有多脆弱?
【发布时间】:2017-03-11 14:30:49
【问题描述】:

我正在尝试了解 SQL 注入。似乎人们可以变得很有创意。这让我想知道我正在制作的基于搜索的 Rails Web 应用程序。

假设我只是将用户输入的信息直接输入到我的 SQL 查询的“where”语句中。允许这样做会对我的数据库造成多大的损害?

def self.search(search)
  if search
    includes(:hobbies, :addresses).where(search)
  else
    self.all
  end

所以基本上,无论用户在主页上的搜索栏中输入什么内容,都会直接输入到“where”语句中。

有效的“搜索”示例如下:

"hobby LIKE ? OR (gender LIKE ? AND hobby LIKE ?)", "golf", "male", "polo"

它仅限于“where”语句的上下文这一事实是否提供了任何形式的防御?他们还能以某种方式执行删除或创建操作吗?

编辑:

当我查看this 教程时,我看不到在 where 子句之外执行删除或创建操作的直接方法。如果我的数据库不包含我不愿意从有效搜索结果中显示的信息,并且没有用户帐户或管理员权限之类的信息,那么这里真正的危险是什么?

【问题讨论】:

  • 如果您正确使用占位符和准备好的语句,则没有注入风险。不,仅仅因为注入的数据在where 中并不意味着什么。开始阅读:bobby-tables.com)
  • where 子句正是要攻击的向量。但是当你参数化它时,漏洞就会消失。
  • 如何参数化?
  • 我很困惑,你希望用户输入字符串"hobby LIKE ? OR (gender LIKE ? AND hobby LIKE ?)"?
  • 一个很好的参考:rails-sqli.org

标签: ruby-on-rails sql-server sql-injection


【解决方案1】:

我从这里的另一个帖子中摘录了这个:Best way to go about sanitizing user input in rails

TL;DR 关于用户输入和查询:确保始终使用活动记录查询方法(例如.where),并避免使用字符串插值传递参数;将它们作为散列参数值或参数化语句传递。

关于呈现可能不安全的用户生成的 html/javascript 内容:从 Rails 3 开始,html/javascript 文本会自动正确转义,以便它在页面上显示为纯文本,而不是解释为 html/javascript,所以你不要'不需要显式清理(或使用

如果我对您的理解正确,您不必担心以这种方式清理数据,只要您正确使用活动记录查询方法即可。例如:

假设我们的参数映射如下所示,这是恶意用户在 user_name 字段中输入以下字符串的结果:

:user_name => "(从用户限制中选择用户名 1)" 不好的方式(不要这样做):

Users.where("user_name = #{params[:id}") # 字符串插值在这里不好 结果查询如下所示:

SELECT users.* FROM users WHERE (user_name = (select user_name from users limit 1)) 以这种方式直接进行字符串插值会将带有键 :user_name 的参数值的文字内容放入查询中,而无需进行清理。您可能知道,恶意用户的输入被视为普通 SQL,其危险性非常明显。

好方法(这样做):

Users.where(id: params[:id]) # 哈希参数 或

Users.where("id = ?", params[:id]) # 参数化语句 结果查询如下所示:

SELECT users.* FROM users WHERE user_name = '(select user_name from users limit 1)' 如您所见,Rails 实际上会为您清理它,只要您将参数作为散列或方法参数传递(取决于您使用的查询方法)。

在创建新模型记录时对数据进行清理的情况并不适用,因为 new 或 create 方法需要一个哈希值。即使您尝试将不安全的 SQL 代码注入到哈希中,哈希的值也会被视为纯字符串,例如:

User.create(:user_name=>"bobby tables); 删除表用户;") 查询结果:

INSERT INTO users (user_name) VALUES ('bobby tables);删除表用户;') 所以,情况和上面一样。

我希望这会有所帮助。如果我遗漏或误解了什么,请告诉我。

编辑关于转义 html 和 javascript,简短的版本是 ERB 为您“转义”您的字符串内容,以便将其视为纯文本。如果你真的想要,你可以通过 your_string_content.html_safe 把它当作 html 对待。

然而,简单地做类似 的事情是完全安全的。内容被视为页面上的字符串。事实上,如果您使用 Chrome 开发人员工具或 Firebug 检查 DOM,您实际上应该会看到该字符串周围的引号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    • 2023-04-10
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    • 2016-01-16
    • 1970-01-01
    相关资源
    最近更新 更多