-1

私が思う簡単な質問があります:

このクエリを使用して、IDが2、5、6で追加のパラメーターがfalseの複数のオブジェクトを検索しています。

Reply.where(:event_id => [2, 5, 6], :looked_at => false)

これは完全に機能しますが、SQLインジェクションの観点からは本当に安全ではないと思います。これをより安全なクエリに再フォーマットするにはどうすればよいですか?

1つのパラメーターでそれを行う方法を知っていますが、配列を渡すとすぐに機能しなくなります。

4

1 に答える 1

1

Reply.where(:event_id => untrusted_array, :looked_at => false)安全です。 Reply.where("event_id IN (#{untrusted_array.join(','}) AND looked_at = FALSE")安全ではない

Ruby on Rails には特殊な SQL 文字用の組み込みフィルターがあり、' 、" 、NULL 文字および改行をエスケープします。Model.find(id) または Model.find_by_some thing(something) を使用すると、この対策が自動的に適用されます。しかし、SQL ではフラグメント、特に条件フラグメント (where("..."))、connection.execute() または Model.find_by_sql() メソッドでは、手動で適用する必要があります。

于 2013-01-26T17:14:34.543 に答える