【问题标题】:Executing sql in rails migration opens to sql injection attacks?在 Rails 迁移中执行 sql 会导致 sql 注入攻击?
【发布时间】:2018-08-23 14:02:43
【问题描述】:

所以我刚刚阅读了多个来源,使用 SQL 传递动态数据会使数据库受到 SQL 注入攻击:

我有一个 Rails 迁移,它将数据插入到连接表中:

class MovePlayerToJoinTable < ActiveRecord::Migration
  def change
    games = Game.all
    games.each do |g|
      g.players.each do |p|
        execute "insert into games_players (player_id, game_id) values (#{p}, #{g.id})"
      end
    end
  end
end

我不确定上述内容如何让我面临 SQL 注入攻击,因为这是一次性任务,之后我将通过强参数传递值,因为它们必须通过我的控制器。我这里有什么遗漏吗?

【问题讨论】:

  • g.players 现在是什么?使用 serialize 的东西(即数据库中的 YAML 块)? PostgreSQL int[] 列?还有什么?
  • @muistooshort 抱歉回复晚了。这是一个serialized 数组
  • 呃,serialize 使事情变得复杂,所以 Sean Huber 的回答是正确的方法。我还建议将数据库内的外键约束添加到您的新连接表中,这样您就会知道player_idgame_id 是有效的ID;您可能希望在迁移数据之前执行此操作,以便清理serialize 留下的任何损坏数据。

标签: ruby-on-rails ruby-on-rails-4 activerecord migration sql-injection


【解决方案1】:

您的示例不太可能存在 sql 注入风险。无论如何,在 Rails 中清理原始 sql 片段是一种很好的做法:http://api.rubyonrails.org/classes/ActiveRecord/Sanitization/ClassMethods.html

例子:

class MovePlayerToJoinTable < ActiveRecord::Migration
  def change
    games = Game.all
    games.each do |g|
      g.players.each do |p|
        query = sanitize_sql_array(['insert into games_players (player_id, game_id) values (?, ?)', p.id, g.id])
        connection.execute(query)
      end
    end
  end
end

【讨论】:

  • 我得到一个未定义的方法sanitize_sql
  • 对不起方法实际上命名为sanitize_sql_array:api.rubyonrails.org/classes/ActiveRecord/Sanitization/…。我已经更新了答案。您可能还需要包含ActiveRecord::Sanitization::ClassMethods
  • 您也可以在迁移中使用connection.quote
猜你喜欢
  • 2015-10-03
  • 2019-08-10
  • 2015-03-26
  • 2014-07-04
  • 2013-05-21
  • 2013-08-15
  • 2015-04-23
  • 2017-05-23
相关资源
最近更新 更多