5

パラメータから注文メソッドを構築するときにRailsでブレーキマンの警告を回避するにはどうすればよいですか?

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

def sort_column(column_names)
  column_names.each do |column|
    return column if column == params[:sort]
  end
  return 'updated_at'
end

def sort_direction
  params[:direction] == 'asc' ? 'asc' : 'desc'
end

私は、ユーザーが生成したコードをクエリに直接挿入しないように懸命に取り組んでいますが、これは SQL インジェクションの脆弱性であるというアラート (確信度は中程度) が依然として発生しています。

これは偽陽性ですか?そうでない場合、脆弱性を修正するにはどうすればよいですか?

もしそうなら、誤検知を避ける簡単な方法はありますか?

4

2 に答える 2

8

さて、これはコメントするには長すぎます。

私のテストから、文字列の構築を次のようなメソッドに移動すると、警告が消えます。

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

しかし、それは問題を隠しているだけです。Assignment代わりに、次のようなものをモデルに追加することをお勧めします。

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_columnして安全であることを確認するのは簡単ではないからです。

于 2012-12-01T16:54:58.233 に答える
3

order by 句にサニタイズ メソッドを追加できます

 assignments = Assignment.order(ActiveRecord::Base::sanitize(sort_column(@methods) + " " + sort_direction)).received(current_user).root
于 2012-11-29T07:28:40.923 に答える