SQL インジェクション攻撃はプログラム ステートメントの不完全性によって引き起こされます。ASP で instr 関数を使用して SQL インジェクション攻撃を効果的に防ぐ方法を見てみましょう。具体的にはこんな感じになるはずです。
instr(Request(id), )>0 または instr(Request(id),')>0 の場合、response.redirectindex.htm
もちろんその後に書きたいことを書いても大丈夫です!
まず instr 関数について学習しましょう。
文法
InStr([開始, ]文字列1, 文字列2[, 比較])
InStr 関数の構文には次のパラメーターがあります。
パラメータの説明
開始はオプションです。各検索の開始位置を設定する数値式。省略した場合は先頭文字位置から検索を開始します。 start に Null が含まれる場合、エラーが発生します。比較を指定する場合、開始パラメータは必須です。
文字列1は必須です。検索する文字列式を受け入れます。
文字列2
必須。検索する文字列式。
比較はオプションです。部分文字列を評価するときに使用される比較のタイプを示す数値。数値については「設定」セクションを参照してください。省略した場合はバイナリ比較が行われます。
比較パラメータには次の値を指定できます。
定数値の説明
vbBinaryCompare 0 バイナリ比較を実行します。
vbTextCompare 1 テキスト比較を実行します。
[戻り値]
InStr 関数は次の値を返します。
InStr が返された場合
string1 は長さ 0 です。
string1 は Null Null です
string2 は長さ 0 の開始値です
string2 は Null Null です
string2 が見つかりません 0
string1 内の string2 を検索 一致する文字列の位置を検索
開始 > Len(string2) 0
次の例では、InStr 検索文字列を利用しています。
Dim SearchString、SearchChar、MyPos
SearchString =XXpXXpXXPXXP ' 検索する文字列。
SearchChar = P ' P を検索します。
MyPos = Instr(4, SearchString, SearchChar, 1) 'テキスト比較では 4 文字目から 6 が返されます。
MyPos = Instr(1, SearchString, SearchChar, 0) 'バイナリ比較では、最初の文字から 9 が返されます。
MyPos = Instr(SearchString, SearchChar) ' 9 を返します。
' デフォルトはバイナリ比較です (最後の引数は省略されます)。
MyPos = Instr(1, SearchString, W) 'バイナリ比較では、文字 1 から開始して 0 が返されます (W が見つかりません)。
InStrB 関数は文字列に含まれるバイト データを使用するため、InStrB はある文字列が別の文字列内で最初に出現する文字位置ではなく、バイト位置を返すことに注意してください。
概要: instr の機能は次のとおりです: 別の文字列内で最初に出現した文字または文字列の位置を返します。それでは、どのコードを見てみましょう。
instr(Request(id), )>0 または instr(Request(id),')>0 の場合
意味: リクエスト (id) 内の文字 (スペース) と文字 (') の特定の位置を比較します (バイナリ比較) (スペース) と (') 文字が見つかった場合、それは then 以降のステートメントです。
これで誰もが意味を理解できました!
初めて見たときは、これがASPだったらどうなるのかと思いました。 Id=90に(;or,)などの文字を追加するのは間違いではないでしょうか? (はい、答えはイエスです:)
おそらく他の誰かが言ったので、if instr(Request(id), )>0 または instr(Request(id),')>0 then ステートメントに文字を追加します。たとえば、次のように変更します。 (id ), )>0 または instr(Request(id),')>0 または instr(Request(id),;)>0 または instr(Request(id),, )>0 then
待ってください、後で追加できます(笑)! (これは良いことです! しかし、それはさらに悪いことです:)
はい、これを追加すると、いわゆるハッカーを実際に倒すことができます。
実際、その必要はありません。instr(Request(id), )>0 という文を (space) と比較したのを忘れていませんか?この文がある限り、いわゆるハッカーが1=1なんて言っても無駄ではないでしょうか?