Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails rails-brakeman命令sql注入_Ruby On Rails_Ruby On Rails 3_Brakeman - Fatal编程技术网

Ruby on rails rails-brakeman命令sql注入

Ruby on rails rails-brakeman命令sql注入,ruby-on-rails,ruby-on-rails-3,brakeman,Ruby On Rails,Ruby On Rails 3,Brakeman,从参数构造order方法时,如何避免Rails中的brakeman警告 def索引 @方法=[:名称,:经理,:截止日期] assignments=Assignment.order(排序列(+@methods)+“”+sort\u方向)。received(当前用户)。root 结束 def sort_列(列名称) 列_名称。每个do |列| 如果column==params[:sort]返回列 结束 返回'updated_at' 结束 def sort_方向 参数[:方向]='asc'?'asc

从参数构造order方法时,如何避免Rails中的brakeman警告

def索引
@方法=[:名称,:经理,:截止日期]
assignments=Assignment.order(排序列(+@methods)+“”+sort\u方向)。received(当前用户)。root
结束
def sort_列(列名称)
列_名称。每个do |列|
如果column==params[:sort]返回列
结束
返回'updated_at'
结束
def sort_方向
参数[:方向]='asc'?'asc':“描述”
结束
我正在努力避免将用户生成的代码直接放入查询中,但brakeman仍然警告(中等置信度)这是一个SQL注入漏洞

这是假阳性吗?如果没有,我如何更正该漏洞


如果是这样,有没有一种简单的方法可以避免误报?

您可以在order by子句中添加一个清理方法

 assignments = Assignment.order(ActiveRecord::Base::sanitize(sort_column(@methods) + " " + sort_direction)).received(current_user).root

好吧,这太长了,不能评论了

根据我的测试,将字符串构建移动到这样的方法中确实会消除警告:

def index
  @methods = [:name, :manager, :deadline]
  assignments = Assignment.order(sort_order).received(current_user).root
end

def sort_order
  sort_column(@methods) + " " + sort_direction
end
然而,这只是隐藏了问题。我建议在
分配
模型中添加类似的内容:

class Assignment < ActiveRecord::Base

  def self.sorted_by(column, direction)
    direction = direction.downcase == 'asc' ? 'asc' : 'desc'
    column = sanitize_sql(column)
    order("#{column} #{direction}")
  end

end
类分配

请记住,有时您必须在让工具满意和让代码合理之间做出选择。至于假阳性,我没有看到这个问题得到解决,因为检查
排序列并知道它是安全的并不简单。

在我看来像是假阳性,它可能是对
顺序
调用中的字符串操作感到不安。如果用一个方法调用替换
sort\u列(@methods)+“+sort\u direction
,会发生什么情况?mu说了什么。这是一个误报,因为您正在手动构建字符串。实际上,即使删除
也会使警告消失。不幸的是
“{sort\u column(@methods)}{sort\u direction}”
也不能防止误报。在控制器中创建私有方法并调用私有方法来构造字符串也不能防止误报。Brakeman似乎太聪明了,不会被周围的事物所愚弄,但还没有聪明到足以解释我如何处理这个问题。我认为这是可行的,但结果只是否定了order方法。Brakeman喜欢它并停止发出警报,但消毒似乎破坏了秩序。奇怪的是,它没有出错。它只是静静地停止点菜。嗯。。。那很有趣。在清理之前,order by子句看起来像
“name asc”
,清理之后它变成
“'name asc'”
。添加的引号显然导致查询无法工作。