ストアドプロシージャコードを投稿しないと、本当にあなたの質問に答えることはできませんが、おそらくあなた自身で答えることができます。
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文を生成しないことを前提としています。ほとんどの人はこれを正しく行いますが、サードパーティプロバイダを使用している場合は、安全であることを前提にして、これをもう一度確認する必要があります。