5

SQL インジェクションについてよく理解できました。それは、次のようなものになるはずのSQLクエリの場合です

SELECT FirstName, LastName 
FROM Customers 
WHERE CustomerId = @valueFromApplication

次のようなクエリになります

SELECT FirstName, LastName 
FROM Customers 
WHERE CustomerId = '' ; DROP DATABASE Foo --

ユーザーが悪意のある値をアプリ、Web サイト、クライアントなどに挿入すると、攻撃者は DB を削除するだけでなく、テーブルの名前を見つけてそこから情報を取得しようとする可能性があることも認識しています。

これを防ぐのに役立ついくつかのことも知っています:

  1. パラメータを取るストアド プロシージャの使用 (SQL Server)
  2. パラメータ化された SQL クエリの使用
  3. Entity Framework / LINQ to Entities の使用 (C#、おそらく F#?)

これらは、SQL インジェクションの発生を実際にどのように防いでいるのでしょうか? 攻撃者は、すでに使用している入力に同じ悪意のある値を渡して、同じ結果を得ることができないのはなぜですか。

4

2 に答える 2

10

最初の例はパラメーター化されており、SQL インジェクションに対して脆弱ではありません。

パラメーター化されたクエリは、サーバーによって単純に値に置き換えられるわけではありません (手動で に置き換える場合@varと同様value)。それらは、送信したとおりに送受信されます.. with @valueFromApplication.

サーバーはクエリを解析し、変数に到達すると、指定された値を検索します。その値が'' ; DROP DATABASE Foo --.. の場合、それが使用するになります。それは解析しません..それをテキスト/数値/タイプとして使用するだけです。

Entity Framework について追加すると、内部的にパラメーター化されたクエリを使用するため、SQL インジェクションに対しても安全です。

于 2014-04-23T22:27:45.497 に答える
9

パラメータは、単純にインラインで SQL に置き換えられるのではなく、クエリとは別に SQL Server に送信されます。

したがって、SQL Server は次のようになります。

Query:
   SELECT FirstName, LastName FROM Customers WHERE CustomerId = ?
Parameter 1:
   '' ; DROP DATABASE Foo --

したがって、CustomerId が文字どおり と等しい顧客をチェックするクエリをコンパイルします'' ; DROP DATABASE Foo --。パラメータ値が SQL として実行されることはありません。

于 2014-04-23T22:27:23.333 に答える