2013-02-15 5 views
10

私はORDERBYがデフォルトで消毒取得する場合、私は思っていたとされていない場合、何がそれをサニタイズするための最良の方法だろうなActiveRecordの.orderメソッドのパラメータは、デフォルトで消されていますか?

Item.order(orderBy) 

として、.ORDERメソッドに文字列を渡すためにしようとしています。

+0

あなたは、文字列値の例を与えることができますか? 'Item.order("? "、orderBy)'は消毒すべきだと思っていますが、文字列の内容によってはより良い方法があるかもしれません。 – catsby

+0

@ctshryockこれは 'select * by items by order? orderBy' –

+0

@DylanMarkow私は '.order(" created_at>? "、orderBy)'などと思っていましたが、おそらく 'where'(少なくとも' order'ではなく)には良いでしょうか? – catsby

答えて

14

注文は消毒されません。あなたはorderByは、ユーザの入力から汚染される可能性のある方法がある場合は、クエリを実行する前にorderBy変数をチェックしたいと思う

Post.order("title; drop table users;") 

:このクエリは、実際にユーザーのテーブルをドロップします。このような何かは仕事ができる:

items = Item.scoped 
if Item.column_names.include?(orderBy) 
    items = items.order(orderBy) 
end 
+0

ありがとう、ディラン! – andreimarinescu

2

は、私は、次のようなものを使用する:エンティティモデルクラスをある

@scoped = @scoped.order Entity.send(:sanitize_sql, "#{@c} #{@d}") 

。これらは?.where句と同じようにサニタイズされていないが、あなたは#sanitize_sql_for_orderを使用することができます

3

sanitize_sql_for_order(["field(id, ?)", [1,3,2]]) 
# => "field(id, 1,3,2)" 

sanitize_sql_for_order("id ASC") 
# => "id ASC" 

http://api.rubyonrails.org/classes/ActiveRecord/Sanitization/ClassMethods.html#method-i-sanitize_sql_for_order

+0

ありがとうございます。これはおそらくこれを行うための最良の方法です。しかし、私はこのActiveRecordメソッドが3年前に利用可能であったかどうかはわかりません:) – andreimarinescu

+0

これは、実際にはオーダーパートを浄化するのにほとんど役に立ちません。 'sanitize_sql_for_order(" id; drop table somethings ")のようなものが予期せず動作し、最悪の場合はテーブルを削除します:/ – nathanvda

+0

ソースを確認してください:https://github.com/rails/rails/blob/d15527800fbc199b969019c665226f836d8fedce/activerecord/lib/ active_record/sanitization.rb#L64の場合、単一の文字列の場合は_nothing_ :( – nathanvda

関連する問題