2009-07-08 10 views
8

2質問:SELECT文からSQLインジェクション攻撃を受けることはできますか?実際

私は、私は可能な限りストアドプロシージャを使用する必要があります知っている、しかし、私は次のようにしてください知っていただきたいと思います。

A:(Select * from MyTable)などのSELECT文からSQLインジェクション攻撃を受けることはできますか?

B:私はASP.NETでのSqlDataSourceを使用する場合 はまた、私は、SQLインジェクション攻撃を得ることができますか?

+6

「できるだけ多くの」ストアドプロシージャの文字列を連結するだけで、人々がこのアプローチを取るときにほとんどの場合、大きな違いを生むことはありません。重要なことは、ストアドプロシージャ内であるかどうかにかかわらず、パラメータ化されたクエリを使用することです。おそらくそれは1つではないはずのストアドプロシージャを作成しようとして自分自身を殺さないでください:) – rmeador

答えて

19

をパラメータ化クエリを使用していないが、あなたは、SELECTのいずれかの種類のSQLインジェクションを得ることができる連結され、UPDATE、DELETEまたはINSERT文の場合。

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クエリを作成し、注射を防止するためにそれらを自動的に消毒します。注入を避けるために

、次のいずれか

  • は、あなたの入力
  • は、ご使用のプラットフォームが提供する抽象化レイヤを使用しサニタイズ。
  • パラメータ化されたクエリを使用します。
+0

ストアドプロシージャに対するインジェクション攻撃の例を挙げることができますか?ありがとう。 – Steve

+1

@ Steve:例が提供されました。 –

+0

ああ、意味があります。再度、感謝します。 – Steve

5

ほとんどの場合、パラメータ化クエリを使用していないときはいつでも、SQLインジェクション攻撃を受けることができます。

あなたの例ならば、

SELECT * from MyTable 

は、任意のユーザ入力されたデータが存在しないので、それは問題ないはずです。しかし、のようなもの:

SELECT * from MyTable WHERE name='x' 

xはパラメータである)は、その後、誰かが自分の名前の中にいくつかのSQLを注入することを可能性があります。

B:ASP.NETは、プログラムによって提供されるパラメータに基づいてクエリを構築するため、パラメータ化クエリを使用します。

+2

より正確に言えば、信頼できないコンテンツをクエリ文字列に補間して動的SQLとして実行すると、いつでもSQLインジェクションを取得できます。テーブル名、列名、SQLキーワード、式などのクエリパラメータは使用できません。パラメータを使用しても安全でないクエリを作成することはできます。 –

1

、あなたの質問に答えるために

1

SQLインジェクションでは、ユーザーが制御するいくつかのパラメーターとSQLストリングを組み合わせる必要があります。したがって、Selectステートメントが一定の場合、インジェクションから免除されます。一方、 "WHERE user_id =" + userIdStringを追加する場合は、注入が可能です。

注射を避けるには、ストアドプロシージャは必要ありません。あなたの入力をサニタイズすることは避けてください。代わりに、文字列を操作する代わりにパラメータにバインドするだけです。

を見てみましょう:あなたは、ユーザにクエリを操作する能力を与えるときhttp://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter.aspx

2

注入ハッ​​クが発生し、パラメータ化クエリで最も特殊文字を作るためにエスケープされているような脅威に中和されている(すべてではないが場合)
検索ボックス:あなたが実行可能

例意図のみクエリ[] [GO]

select * from myTable where keywords like '%$searchTerm%' 

その後、ハッカーが「を挿入します。クエリを終了し、必要な他のクエリを書くことができます。

4

私はこのxkcd漫画、SQLインジェクション

1

についての良いレッスンを楽しむためには、ユーザーは、あなたが、注射の危険にさらされて、動的SQLクエリに入力データを与えることができ、任意の時間を示唆しています。そしてsqldatasourceはあなたを注射から守りません。挿入、削除、削除などは引き続き発生します。

+0

それから私は何をしなければなりませんか? SQLDataSourceはParameterを使用するため。 – Etienne

2

あなたのコメントに応じて - 'どうすればいいですか?'

入力を許可するために、テキストボックスやその他のコントロールを検証することができます。数字を探している場合は、数字だけを入力してください。単語を入力する場合は、句読点がないことを確認してください。絶対に必要でない限り、 - や 'のような文字を取り出してください。あなたは、このすべてをajaxやjavascriptで行うことができます。また、Here is an interesting Article on protection from injection.またparameterized queries are a great option

+3

N、あなたはjavascriptでこれを行うことはできません。あなたが潜在的に危険な文字を削除するためにjavascriptに依存している場合、攻撃者は必要なすべての "'"と共にhttp post要求を単に偽造することができます。この検証はサーバー側で行う必要があります。 また、絶対に必要な場合を除いて、すべてを捨てることもできます。私はヴァルディのキャラクターは通常の人間の言語であり、保存しなければなりません。適切にそれを行う方法を提供する必要があります。 – jsbueno

関連する問題