8

このクエリは機能しますが、SQL インジェクションに対して完全にオープンです。

products = Product.find(pids,
  :select => 'products.*, P.code',
  :joins => "left join product_dist_match P on
    (P.pid = products.pid and P.cid = #{cid})",
)

cid 変数を適切にエスケープするにはどうすればよいですか? conditionsパラメータは、この目的のためにフォーマットを許可しますが、許可し['foo = ?', bar]ませjoinsん。

find_by_sqlモデルのデフォルト スコープ (DRY ではない) の一部である結合と条件を追加する必要があるため、使用したくありません。

編集:私のテーブル構造は本質的にこれです:

products: pid (primary key)
product_dist_match: pid, cid, code
customers (not used in the query): cid (primary key)

これは読み取り専用のデータベースであり、Rails の関与は限定的であることに注意してください。すべてのテーブルにモデルを設定するつもりはありません。SQL インジェクション攻撃にさらされることなく、上記の単純なクエリを実行したいだけです。

4

2 に答える 2

15

私が見つけた答えは.sanitize、モデルでメソッドを使用することです:

products = Product.find(pids,
  :select => 'products.*, P.code',
  :joins => 'left join product_dist_match P on
    (P.pid = products.pid and P.cid = ' + Product.sanitize(cid) + ')',
)

より良い解決策を見つけたら、投稿してください!

于 2012-08-06T16:58:31.807 に答える
2

これは、あなたがやろうとしていたことのようです。

products = Product.find(pids,
    :select => 'products.*, P.code',
    :joins => sanitize_sql_array [
      'left join product_dist_match P on P.pid = products.pid and P.cid = ?', 
       cid
    ]
于 2014-10-20T21:43:43.960 に答える