ユーザー入力を含むクエリを作成するときに、パラメーター化された SQL クエリがユーザー入力をサニタイズする最適な方法であることは認識していますが、ユーザー入力を取得して一重引用符をエスケープし、文字列全体を一重引用符で囲むことの何が問題なのか疑問に思っています。コードは次のとおりです。
sSanitizedInput = "'" & Replace(sInput, "'", "''") & "'"
ユーザーが入力した一重引用符は二重の一重引用符に置き換えられ、ユーザーが文字列を終了する機能を排除するため、セミコロン、パーセント記号など、ユーザーが入力する可能性のあるものはすべて文字列の一部になり、コマンドの一部として実際に実行されるわけではありません。
Microsoft SQL Server 2000 を使用していますが、単一引用符が唯一の文字列区切り文字であり、文字列区切り文字をエスケープする唯一の方法であると考えているため、ユーザーが入力したものを実行する方法はありません。
これに対して SQL インジェクション攻撃を開始する方法は見当たらないが、もしこれが私に思えるほど防弾であるなら、他の誰かがすでに考えていたであろうし、それは一般的な慣行であろう.
このコードの何が問題になっていますか? このサニタイズ手法を通過して SQL インジェクション攻撃を受ける方法はありますか? この手法を利用するユーザー入力のサンプルは非常に役立ちます。
アップデート:
このコードに対して SQL インジェクション攻撃を効果的に開始する方法はまだわかりません。バックスラッシュで 1 つの単一引用符をエスケープし、もう 1 つの引用符を残して文字列を終了し、残りの文字列が SQL コマンドの一部として実行されるようにすることを何人かの人々が提案しました。 MySQL データベースですが、SQL Server 2000 で単一引用符をエスケープする (私が見つけた) 唯一の方法は、別の単一引用符を使用することです。バックスラッシュはそれをしません。
また、一重引用符のエスケープを停止する方法がない限り、残りのユーザー入力はすべて 1 つの連続した文字列として処理されるため、実行されません。
入力をサニタイズするためのより良い方法があることは理解していますが、上記で提供した方法が機能しない理由を知りたいと思っています。このサニタイズ方法に対して SQL インジェクション攻撃を開始する特定の方法を誰かが知っている場合は、ぜひご覧ください。