2

この sql クエリを完全に手動で記述せずにアクティブ レコードに記述する最良の方法を知っているかどうかはわかりません。基本的に、これら 2 つのクエリを組み合わせて記述したいと考えています。

このクエリは基本的に、再作成しようとしている結合です。返されるエントリが、image_path_processing フラグが false に設定された画像を持つものだけであることを確認したいと思います。

@entries = ContestEntry.joins(:entry_images).where(contest_id: @contest.id, entry_images: {
        image_path_processing: false
        }).limit(10)

ただし、私が書いているクエリで遭遇している問題は、URL からパラメーターを含める必要があり、上記の構文が sql_injection を適切に削除しているかどうかわからないことです。

これが条件付き結合を追加しようとしているものです。

@entries = ContestEntry.where("contest_id = ? and created_at > ?",
      params[:contest_id], Time.at(params[:after].to_i + 1))
4

3 に答える 3

2

これを試すことができますか?

@entries = ContestEntry.joins(:entry_images).
                        where(contest_id: params[:contest_id],
                              entry_images: { image_path_processing: false }).
                        where('contest_entries.created_at > ?', Time.at(params[:after].to_i+1)).
                        limit(10)
于 2013-03-06T18:51:53.377 に答える
1

まず、このドキュメントを読んでください: http://guides.rubyonrails.org/security.html#sql-injection

当時、サポートされている主な構文は

ContestEntry.where("contest_id = ?", params[:contest_id])

しかし今では、よりシンプルでルビーっぽいものも使用できます

ContestEntry.where(:contest_id => params[:contest_id])

ドキュメントで説明されているように、これらのアプローチは両方とも、SQL サニタイザーを介してパラメーターを渡し、SQL インジェクション攻撃を防ぎます。

いくつかの追加ポイント:

  1. 後者の構文を平等以外に実装する方法がわかりません。
  2. SQL インジェクションに関して最近耳にした問題は、使用している構文には当てはまりません。それらは動的ファインダに適用されます。

最後に、私の言葉を鵜呑みにするべきではありません。ruby 開発者が私にくれた最高のアドバイスの 1 つは、「irb を使って ruby​​ を学ぶ」というものでした。何かがどのように機能するかについて疑問がある場合は、irb をロードしてテストしてください。あなたの場合、レールを実装しているので、完全なコンソールを自由に使用できます。

sql_injection_params = "anything' OR 'x'='x"
# This string variant tells active record to use sql as is 
Model.where("name = '#{sql_injection_params}'").to_sql # bad
# This array variant tells active record to sanitize
Model.where('name = ?', sql_injection_params).to_sql # good
# This hash variant tells active record to sanitize
Model.where(:name => sql_injection_params).to_sql # good

このto_sql呼び出しにより、クエリに基づいて作成された未加工の SQL アクティブ レコードが表示されます。上記の例を自分のデータを使用するように変更するだけで、レールが内部で何をしているのかをよりよく理解できるはずです。

于 2013-03-06T19:05:21.233 に答える
0
@entries = ContestEntry.where("contest_id = ? and created_at > ?",
      params[:contest_id], Time.at(params[:after].to_i + 1))

ユーザーが入力した結果からのSQLインジェクションを回避する完璧な方法のようです...

于 2013-03-06T18:39:13.690 に答える