0

私はすべてのSQLインジェクションの問題を指摘するツールを持っており、次のようなものを見つけました:

"SELECT GB.BTN,GUP.CUST_USERNAME,GUP.EMAIL from GBS_BTN GB,GBS_USER_BTN GUB,GBS_USER_PROFILE GUP WHERE GB.BTN=GUB.BTN AND GUB.CUST_UID=GUP.CUST_UID AND GB.ET_ID='" + strAccountID + "' ORDER BY CREATE_DATE DESC",oCin"

SQL インジェクションを回避するために上記のクエリを作成する方法を教えてください。

4

3 に答える 3

9

オプション 1: 文字列を連結する代わりに、パラメーター化されたクエリを使用します。

詳細については、http: //msdn.microsoft.com/en-us/library/ff648339.aspxを参照してください。

オプション 2: パラメーター化されたストアド プロシージャを使用する

オプション 3 は、Replace() を使用して文字列をエスケープすることですが、これは最後の手段にする必要があります。それは弱いです、そしてそれを回避する方法があります。

string sql = "Select * From someTable where SomeStringField = '" + myVariable.REplace("'", "''") + "'";
于 2013-05-08T17:30:15.690 に答える
2
SELECT foo, bar, etc FROM Bobby WHERE this = that
AND GB.ET_ID = @accountID ORDER BY mySort

次に、コマンド変数にパラメーターを追加します。このような:

myCommand.Parameters.AddWithValue("@accountID", strAccountID);

この脆弱性は、strAccountID がユーザーが編集可能なコントロールから取得された場合、次のようなものが含まれる可能性があるという事実にあることを理解する必要があります。

' drop table GBS_BTN --

これにより、プログラムがクエリの一部を実行してから、テーブルを削除します。

編集:例のようにパラメーターを使用すると、ユーザーが入力したものはすべてエスケープされるため、この種の悪用から安全です. 他の人が示唆しているように、ストアド プロシージャを使用することもできます。次に、例のようにパラメーターを使用する必要があります。ストアド プロシージャには他にも役立つ特性がありますが、それは別の説明になります。

于 2013-05-08T17:33:03.723 に答える