SQL インジェクションについてよく理解できました。それは、次のようなものになるはずのSQLクエリの場合です
SELECT FirstName, LastName
FROM Customers
WHERE CustomerId = @valueFromApplication
次のようなクエリになります
SELECT FirstName, LastName
FROM Customers
WHERE CustomerId = '' ; DROP DATABASE Foo --
ユーザーが悪意のある値をアプリ、Web サイト、クライアントなどに挿入すると、攻撃者は DB を削除するだけでなく、テーブルの名前を見つけてそこから情報を取得しようとする可能性があることも認識しています。
これを防ぐのに役立ついくつかのことも知っています:
- パラメータを取るストアド プロシージャの使用 (SQL Server)
- パラメータ化された SQL クエリの使用
- Entity Framework / LINQ to Entities の使用 (C#、おそらく F#?)
これらは、SQL インジェクションの発生を実際にどのように防いでいるのでしょうか? 攻撃者は、すでに使用している入力に同じ悪意のある値を渡して、同じ結果を得ることができないのはなぜですか。