相关疑难解决方法(0)

Rails 5 SQL注入

我已经在一段时间内阅读了关于各种SO线程,指南等的内容......但所有答案都是矛盾和矛盾的.

似乎有很多类似的方法,很多答案都说使用不同的方法.

  • sanitize
  • sanitize_conditions
  • sanitize_sql
  • sanitize_sql_array
  • sanitize_sql_for_assignment
  • sanitize_sql_for_conditions
  • sanitize_sql_hash
  • sanitize_sql_hash_for_assignment
  • sanitize_sql_hash_for_conditions
  • sanitize_sql_like

我正在尝试编写一个"原始查询"适配器,它允许我运行原始的Postgres查询,但允许我插入来自危险用户输入的我自己的参数.

我不能在这几个实例中使用AR,因为我正在进行复杂的纬度/经度计算,聚合函数,复杂子查询等.

到目前为止,我尝试了两种方法:

方法1

对于这种方法,我不知道是否sanitize是上述的最佳选择,或者它是否适用于100%的情况......(我只使用Postgres)

class RawQuery

  def exec(prepared, *params)
    prepared = query.dup
    params.flatten.each_with_index do |p, i|
      prepared.gsub!("$#{i + 1}", ActiveRecord::Base.sanitize(p))
    end
    ActiveRecord::Base.connection.exec_query(prepared)
  end

end
Run Code Online (Sandbox Code Playgroud)

琐碎的用法示例(当然通常不会这么简单,或者我只会使用AR):

RawQuery.new.exec('SELECT * FROM users WHERE name = $1', params[:name])

此外,它似乎sanitize代表quote.但根据这篇SO帖子说它只是用单引号包装东西并不安全......所以我不知道.

方法2

我不确定这是否同样安全,但它似乎使用了一个实际的PG准备功能(我假设它是100%安全的).唯一的问题是rails不会将其打印到控制台,也不包括SQL执行时间(这会破坏我的分析工具).

class RawQuery

  def prepare(query, *params)
    name = "raw_query_#{SecureRandom.uuid.gsub('-', '')}"
    connection = ActiveRecord::Base.connection.raw_connection
    connection.prepare(name, query)
    connection.exec_prepared(name, params)
  end

end
Run Code Online (Sandbox Code Playgroud)

使用方式相同:

RawQuery.new.prepare('SELECT * FROM …

ruby postgresql activerecord ruby-on-rails ruby-on-rails-5

16
推荐指数
1
解决办法
3556
查看次数

SQL注入和ActiveRecord

从SQL注入是否安全:

Guest.where(:event_id => params[:id])
Run Code Online (Sandbox Code Playgroud)

params[:id]没有做任何类型的消毒就送来了.

一般来说,所有那些主动记录方法都安全吗?(如where,joins等.)

如果没有,安全的最佳做法是什么?另外,请注意是否有任何警告/边缘情况?

谢谢

ruby activerecord ruby-on-rails

9
推荐指数
3
解决办法
8498
查看次数