0

SQLインジェクション攻撃を防ぐために、クエリをエスケープすることをどこかで見たと思いました?が、決定的な答えは見つかりません。

次の 2 つのクエリの違いは何ですか (name以前に定義された変数を使用):

People.where("name = ?", name)

People.where('name = "#{name}"')

レール 3.2.1

ルビー1.9.2

4

2 に答える 2

0

私は同じことを、ここActiveRecordQueryインターフェイスガイドで読みました。セクション2.2は、後者の方法(ハッシュを渡す)について述べています。

変数を条件文字列に直接入れると、変数はそのままデータベースに渡されます。これは、悪意を持っている可能性のあるユーザーから直接、エスケープされていない変数になることを意味します。

これは、Whereメソッドで呼び出されるbuild_whereのAPIへのリンクです。ハッシュがメソッドに渡されると、データベースに直接渡されます。前者の構文( "name =?"、opts)を使用すると、オプションが渡される前にクエリがサニタイズされます。

于 2012-12-07T00:19:42.180 に答える
0
 People.where("name = ?", name)

 This is secured. 

 People.where('name = "#{name}"')

 This is called sql injection and it's not secured.
于 2012-12-07T05:02:34.680 に答える