これを開始するには、パラメーター化されたクエリが最適なオプションであることをよく知っていますが、以下に提示する戦略が脆弱になる理由を尋ねています. 以下の解決策はうまくいかないと人々は主張しているので、うまくいかない理由の例を探しています。
動的 SQL が、SQL Server に送信される前に次のエスケープを使用してコードに組み込まれている場合、これを無効にできるのはどのような種類のインジェクションですか?
string userInput= "N'" + userInput.Replace("'", "''") + "'"
同様の質問がここで回答されましたが、ここで該当する回答はないと思います。
SQL Server では、単一引用符を "\" でエスケープすることはできません。
生成される文字列が単一引用符の前にある N によって Unicode としてマークされているという事実によって、 Unicode を使用したSQL スマグリング(ここで概説) が阻止されると思います。私の知る限り、SQL Server が自動的に単一引用符に変換する文字セットは他にありません。エスケープされていない一重引用符がなければ、インジェクションは不可能だと思います。
String Truncationも実行可能なベクトルだとは思いません。microsoft によるとnvarchar
、 の最大サイズは 2GBであるため、SQL Server は確かに切り捨てを行いません。ほとんどの場合、2 GB の文字列は実行不可能であり、私の場合も不可能です。
二次注入は可能ですが、次の場合は可能ですか:
- データベースに入るすべてのデータは、上記の方法を使用してサニタイズされます
- データベースからの値が動的 SQL に追加されることはありません (動的 SQL 文字列の静的部分でテーブル値を参照できるのに、なぜそんなことをするのでしょうか?)。
これがパラメーター化されたクエリを使用するよりも優れている、またはその代替手段であると示唆しているわけではありませんが、概説したものがどのように脆弱であるかを知りたい. 何か案は?