0

特定のリストで、共通名または内部名を持つすべてのウィジェットを検索したいquery_list。できます

# Consider query_list = ["a","b","c"]
qlist = '(' + query_list.join(",") + ')'
# this makes 
widgets = Widget.find_by_sql("SELECT * FROM widgets 
     WHERE common_name IN #{qlist} OR internal_name IN #{qlist}")

今、私はいくつかの質問があります:

  1. 上記のfind_by_sqlはSQLインジェクション攻撃に関して安全ですか?に危険なものを入れることができるようですquery_list
    • 書いてみませんか.find_by_sql(["SELECT * FROM widgets WHERE common_name IN ? OR internal_name IN ?", ["a","b","c"], ["a","b","c"] ])
    • 安全でない場合、安全にすることはできますか?
  2. 必要がなければ、生のSQLを記述したくない。のように、でAND条件を記述できることはわかっています。findを使用して条件を作成することもできますか?find.find(:conditions=>{:internal_name => ['a','b','c'], :common_name => ['a','b','c']})OR
  3. 使ってwhereみませんか?これは使用とどう違うのfindですか?
4

1 に答える 1

0

プレースホルダー付きのバージョンは、ユーザーが任意のウィジェットを選択できることを気にしない限り、SQLインジェクションに対して安全です。使用しているRailsのバージョンによっては、チェーンを使用して生のSQLを記述しないようにすることができます。Ruby onRails3の「OR」条件の作成方法を参照してください。

コードをそのまま、またはプレースホルダーを使用すると、リストが空の場合、またはがである場合にデータベースエラーが発生する[nil]ため、クエリを実行する前にquery_list.firstが存在することをテストすることをお勧めします。

于 2012-11-14T05:10:39.047 に答える