14

次のような文字列を .order メソッドに渡そうとしています

Item.order(orderBy)

orderBy がデフォルトでサニタイズされるかどうか疑問に思っていました。そうでない場合、それをサニタイズする最良の方法は何でしょうか。

4

5 に答える 5

21

注文はサニタイズされません。このクエリは、実際には Users テーブルを削除します。

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

ユーザー入力によって汚染される可能性がorderByある場合は、クエリを実行する前に変数を確認する必要があります。orderByこのようなものはうまくいくかもしれません:

items = Item.scoped
if Item.column_names.include?(orderBy)
  items = items.order(orderBy)
end
于 2013-02-15T15:45:48.147 に答える
11

.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"

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

于 2016-08-02T14:20:20.717 に答える