私はORDERBYがデフォルトで消毒取得する場合、私は思っていたとされていない場合、何がそれをサニタイズするための最良の方法だろうなActiveRecordの.orderメソッドのパラメータは、デフォルトで消されていますか?
Item.order(orderBy)
として、.ORDERメソッドに文字列を渡すためにしようとしています。
私はORDERBYがデフォルトで消毒取得する場合、私は思っていたとされていない場合、何がそれをサニタイズするための最良の方法だろうなActiveRecordの.orderメソッドのパラメータは、デフォルトで消されていますか?
Item.order(orderBy)
として、.ORDERメソッドに文字列を渡すためにしようとしています。
注文は消毒されません。あなたはorderBy
は、ユーザの入力から汚染される可能性のある方法がある場合は、クエリを実行する前にorderBy
変数をチェックしたいと思う
Post.order("title; drop table users;")
:このクエリは、実際にユーザーのテーブルをドロップします。このような何かは仕事ができる:
items = Item.scoped
if Item.column_names.include?(orderBy)
items = items.order(orderBy)
end
ありがとう、ディラン! – andreimarinescu
は、私は、次のようなものを使用する:エンティティモデルクラスをある
@scoped = @scoped.order Entity.send(:sanitize_sql, "#{@c} #{@d}")
。これらは?
と.where
句と同じようにサニタイズされていないが、あなたは#sanitize_sql_for_order
を使用することができます
:
sanitize_sql_for_order(["field(id, ?)", [1,3,2]])
# => "field(id, 1,3,2)"
sanitize_sql_for_order("id ASC")
# => "id ASC"
ありがとうございます。これはおそらくこれを行うための最良の方法です。しかし、私はこのActiveRecordメソッドが3年前に利用可能であったかどうかはわかりません:) – andreimarinescu
これは、実際にはオーダーパートを浄化するのにほとんど役に立ちません。 'sanitize_sql_for_order(" id; drop table somethings ")のようなものが予期せず動作し、最悪の場合はテーブルを削除します:/ – nathanvda
ソースを確認してください:https://github.com/rails/rails/blob/d15527800fbc199b969019c665226f836d8fedce/activerecord/lib/ active_record/sanitization.rb#L64の場合、単一の文字列の場合は_nothing_ :( – nathanvda
あなたは、文字列値の例を与えることができますか? 'Item.order("? "、orderBy)'は消毒すべきだと思っていますが、文字列の内容によってはより良い方法があるかもしれません。 – catsby
@ctshryockこれは 'select * by items by order? orderBy' –
@DylanMarkow私は '.order(" created_at>? "、orderBy)'などと思っていましたが、おそらく 'where'(少なくとも' order'ではなく)には良いでしょうか? – catsby