2 実際の質問:
可能な限りストアド プロシージャを使用する必要があることは承知していますが、次のことを教えてください。
A: (Select * from MyTable) などの SELECT ステートメントから SQL インジェクション攻撃を受けることはできますか?
B: また、ASP.NET で SQLDataSource を使用すると、SQL インジェクション攻撃を受ける可能性がありますか?
2 実際の質問:
可能な限りストアド プロシージャを使用する必要があることは承知していますが、次のことを教えてください。
A: (Select * from MyTable) などの SELECT ステートメントから SQL インジェクション攻撃を受けることはできますか?
B: また、ASP.NET で SQLDataSource を使用すると、SQL インジェクション攻撃を受ける可能性がありますか?
ご質問にお答えします。
A:はい、パラメーターを受け取るクエリから SQL インジェクション攻撃を受ける可能性があります(プラットフォームで提供されているメソッドを使用せず、SQL 呼び出しを介してストアド プロシージャを呼び出す場合でも)。
ストアド プロシージャを使用してもインジェクションを行う方法の例を提供するように求められました。ストアド プロシージャを使用するアプリケーションが開発されているのを見たことがありますが、次のようにします。
// C# - DON'T DO THIS!
String regionName = assignedSomewhereElse();
SQLCommand sqlCmd = DatabaseConnection.CreateCommand();
SQLCommand sqlCmd.CommandText =
String.Format("EXECUTE sp_InsertNewRegion '{0}'", regionName);
sqlCmd.ExecuteNonQuery();
明らかに、これはストアド プロシージャを呼び出す方法ではありません。プラットフォームの抽象化またはパラメーター化されたクエリを使用する必要があります。
B: SQLDataSource
データベースの抽象化レイヤーです。SQL クエリが作成され、インジェクションを防ぐために自動的にサニタイズされます。
インジェクションを避けるには、次のいずれかを行います。
ほとんどの場合、パラメーター化されたクエリを使用していないときはいつでも、SQL インジェクション攻撃を受ける可能性があります。
あなたの例なら、
SELECT * from MyTable
ユーザーが入力したデータはないので、問題ありません。ただし、次のようなもの:
SELECT * from MyTable WHERE name='x'
(x
パラメータである)場合、誰かがSQLを自分の名前に挿入する可能性があります。
B: ASP.NET は、プログラムで指定したパラメーターに基づいてクエリを構築するため、パラメーター化されたクエリを使用します。
ユーザーがクエリを操作できるようにすると、インジェクション ハッキングが発生します。パラメーター化されたクエリを使用すると、特殊文字がエスケープされて意図したクエリのみが実行可能になるため、ほとんどの (すべてではないにしても) 脅威が中和されます。
例:
検索ボックス: [ ] [ GO ]
select * from myTable where keywords like '%$searchTerm%'
次に、ハッカーは '; を挿入します。クエリを終了し、必要な他のクエリを作成できます。
あなたのコメントに応えて-「私は何をしなければなりませんか?」
手始めに、テキストボックスまたは入力を許可するために使用されるコントロールを検証できます。数字を探している場合は、数字のみを入力していることを確認してください。単語を入力している場合は、句読点がないことを確認してください。どうしても必要な場合を除いて、-や'などの文字を取り出してください。これらはすべて、ajaxやjavascriptを使用して実行できます。また、注射からの保護に関する興味深い記事があります。また、パラメータ化されたクエリは素晴らしいオプションです
パラメータ化されたクエリを使用していないが、連結している場合は、あらゆる種類の SELECT、UPDATE、DELETE、または INSERT ステートメントに対して SQL インジェクションを取得できます。
SQL インジェクションでは、SQL 文字列をいくつかのユーザー制御パラメーターと組み合わせる必要があるため、Select ステートメントが定数であれば、インジェクションの影響を受けません。一方、「WHERE user_id = + userIdString」を追加している場合は、インジェクションが可能です。
インジェクションを回避するためにストアド プロシージャは必要ありません。代わりに、文字列を操作する代わりにパラメーターにバインドするだけです。
見てみましょう: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter.aspx
ユーザーが動的SQLクエリに入力データを与えることを許可すると、インジェクションの危険にさらされます. また、sqldatasource はインジェクションから保護しません。挿入、削除、ドロップなどは引き続き発生します。