SQLインジェクション攻撃を防ぐために、クエリをエスケープすることをどこかで見たと思いました?
が、決定的な答えは見つかりません。
次の 2 つのクエリの違いは何ですか (name
以前に定義された変数を使用):
People.where("name = ?", name)
と
People.where('name = "#{name}"')
レール 3.2.1
ルビー1.9.2
SQLインジェクション攻撃を防ぐために、クエリをエスケープすることをどこかで見たと思いました?
が、決定的な答えは見つかりません。
次の 2 つのクエリの違いは何ですか (name
以前に定義された変数を使用):
People.where("name = ?", name)
と
People.where('name = "#{name}"')
レール 3.2.1
ルビー1.9.2
私は同じことを、ここActiveRecordQueryインターフェイスガイドで読みました。セクション2.2は、後者の方法(ハッシュを渡す)について述べています。
変数を条件文字列に直接入れると、変数はそのままデータベースに渡されます。これは、悪意を持っている可能性のあるユーザーから直接、エスケープされていない変数になることを意味します。
これは、Whereメソッドで呼び出されるbuild_whereのAPIへのリンクです。ハッシュがメソッドに渡されると、データベースに直接渡されます。前者の構文( "name =?"、opts)を使用すると、オプションが渡される前にクエリがサニタイズされます。
People.where("name = ?", name)
This is secured.
People.where('name = "#{name}"')
This is called sql injection and it's not secured.