2009-02-27 7 views
1

こんにちは私はデータセットを使用しており、そのデータセットにはテーブルアダプタがあります。私のテーブルアダプタでは、ストアドプロシージャをクエリとして使用しています。テーブル・アダプターを使用してフォーム・データを挿入するために次の行を使用すると、SQLインジェクションに対して安全ですか?ありがとう。TableAdapters SQL Injection

UserDataSetTableAdapters.UserInformationTableAdapter myFactory = new TestProject.UserDataSetTableAdapters.UserInformationTableAdapter(); 
      myFactory.spTest_InsertUserInformation(id, frmAddress); 

答えて

1

短い答え:はい:)

更新1:あなたは、アダプタのパラメータを持つストアドプロシージャと定義されたクエリを使用しなかった場合でもは、それはSQLインジェクションすなわち選択F1に対して安全だろう、f2 where f3 = @myparameter ...これは、準備されたクエリを使用します。

0

SQL Prolierトレースを使用して検証します。基礎となるAPIが安全であれば、パラメータ化されたT-SQLコマンドがsp_executesqlの行に沿って表示されます。

4

ストアドプロシージャコードを投稿しないと、本当にあなたの質問に答えることはできませんが、おそらくあなた自身で答えることができます。


SQLインジェクション攻撃は、ユーザーが入力したデータが動的に生成され、実行されたSQLクエリに振り回されることに起因します。ストアド・プロシージャを使用すると、一般に、引数をパラメータとして渡すことでこの問題を回避し、SQLを動的に生成することはありません。プロシージャは自動的にカプセル化され、元のSQLクエリテキストの一部にはなりません。

は、例えば次のようください:パラメータとして

SELECT * 
FROM myTable 
WHERE myId = @ID; 

、あなたは@IDに設定しても安全だ "21; DROP TABLE mytableはを;"。それはあなたのためにエスケープされ、文字列全体がmyIdと比較されます。あなたが動的に

string query = "SELECT *\nFROM myTable\nWHERE myId = " + userEnteredText + ";"; 

のようなSQLクエリを生成する場合は、今、あなたは以下を取得したい:

SELECT * 
FROM myTable 
WHERE myId = 21; DROP TABLE myTable;; 

痛いです。だから、


は、あなたの質問に答えるために:あなたのストアドプロシージャを動的にそのパラメータと EXECそれらをに基づいてSQLを生成しない場合は、安全でなければなりません。

注:もちろん、これは.NETデータプロバイダがパラメータ付きのプロシージャを呼び出し、動的SQL文を生成しないことを前提としています。ほとんどの人はこれを正しく行いますが、サードパーティプロバイダを使用している場合は、安全であることを前提にして、これをもう一度確認する必要があります。

0

あなたは、あなたが安全ではないパラメータとをsp_executesqlをEXEC(@SQL)とされていない使用していますPROC自体に、動的SQLを使用している場合は、そうでなければ、

です