1

問題が発生しました。次のコードスニペットを作成しました。

teksti = teksti.Trim()
teksti = Replace(teksti, "<", "& lt;")
teksti = Replace(teksti, ">", "& gt;")
teksti = Replace(teksti, """", "& quot;")
teksti = Replace(teksti, "'", "& #8217;")
teksti = Replace(teksti, "%", "& #37;")
teksti = Replace(teksti, "&", "& amp;")
teksti = Replace(teksti, "#", "& #35;")
teksti = Replace(teksti, "@", "& #64;")

これを書いた後、私はそれがそれ自身の問題になることに気づきました。この関数は、HTMLおよびSQLインジェクションに対して情報を安全にすることになっています(他のメソッド、パラメーター化されたクエリなどもありますが、それは重要ではありません)。ただし、すべての置換文字列には&、#、および;があるため、最初にで置換&lt;され& lt; 、次に新しく書き込まれた文字列の置換に進みます。それにサインインします。

ヒントはありますか?これに正規表現を使用することを考えましたが、十分に単純な適切なVisualBasicの例は見つかりませんでした。

編集:ヒントをありがとう。これを行うための「スマート」で簡単な方法があると確信していましたが、結局のところ、利用できる一般的な方法はないと思います。問題のケースを最初に再配置することは、ここでの明白な解決策です。ありがとうございます。仕事の日が長すぎて気付かなかったと思います。:D

パラメータ化されたクエリについては、もう一度確認すると、英語が意図したとおりに出てこないことがわかります。私はすでにそれらを使用していると言うつもりでした。ここでのこの問題は、後で同じ文字列を使用するあらゆる種類のhtml-injectionと可能なsql-injectionを防ぐために固有のものです。助けてくれてありがとう。

4

7 に答える 7

6

これが.NETの場合は、System.Web.HttpServerUtility.HtmlEncode代わりに調べることができます。

VBScript / VB6を使用している場合は、アンパサンドとポンド記号をこのリストの一番上に移動するだけで、SQLインジェクションから保護するためにこの関数に依存しないでください。パラメータ化されたクエリがまだ必要です。

于 2009-04-02T13:28:59.460 に答える
3

VB.NETを使用している場合は、 System.Web.HttpUtility.HtmlEncode(string)を探しています。

それ以外の場合は、一度に1文字ずつ文字列をループして、新しいエンコードされた文字列を作成し、必要に応じて置き換えます。そうすれば、文字列と各文字のcaseステートメントを1回通過するだけで済み、エンコードされた文字を再エンコードする必要はありません。

于 2009-04-02T13:32:16.910 に答える
2

問題のあるケースを最初に並べ替えることができます。または、文字列を繰り返し処理し、各文字を順番に分析して追加するか、必要な置換を行うことで、新しい文字列を作成することもできます。そうでなければ、私はこの言語に精通していないので名前を付けることができませんでしたが、これには既成のライブラリ/関数を使用できます。

于 2009-04-02T13:34:16.017 に答える
2

最初に&文字を置き換え、次に#文字を置き換えます。その後、他のものは安全に交換することができます。

ただし、これはSQLインジェクションから保護するための適切な方法ではありません。これは、パラメータ化されたクエリを使用して実行することが望ましいです。コード内にHTMLのエンコードを必要としない文字があります。SQLインジェクションから保護するためにそれらをエンコードしている場合、危険な道を進んでいます。SQLインジェクションの実行が難しくなりますが、安全な方法ではありません。

また、データベースに配置する前にテキストをエンコードしていると、後で問題が発生する可能性があります。テキストを変更せずにデータベースに保存し、テキストを表示するときにHTMLエンコーディングに注意することをお勧めします。

于 2009-04-02T13:37:34.477 に答える
1

以前の投稿で述べたように、「置換」を並べ替えると、特定の問題をすばやく修正できるはずです。パラメータ化されたクエリも調べることを強くお勧めします。

もう1つの提案は、エンコード用の組み込みの.netライブラリ、特に「ホワイトリスト」を使用しているためSystem.Web.HttpUtility.HtmlEncodeよりも優れていると私が思うMicrosoft.Security.Application.AntiXssライブラリを調べることです。 「ブラックリスト」アプローチではなくアプローチ。

あなたはここでそれについてのより多くの情報を見つけることができます:

お役に立てれば。

于 2009-04-02T15:02:29.843 に答える
1

他の人が提案したように再注文します。互いに競合し、並べ替えても解決できない2つのケースを見つけた場合は、次のような置換を追加します。

teksti = teksti.Trim()
teksti = Replace(teksti, "&", "THISISANAMP")
teksti = Replace(teksti, ";", "& #59;")
teksti = Replace(teksti, "#", "& #35;")
teksti = Replace(teksti, "THISISANAMP", "&amp;") ''newly added
teksti = Replace(teksti, "<", "& lt;")
teksti = Replace(teksti, ">", "& gt;")
teksti = Replace(teksti, """", "& quot;")
teksti = Replace(teksti, "'", "& #8217;")
teksti = Replace(teksti, "%", "& #37;")
teksti = Replace(teksti, "@", "& #64;")

これは、コードを変更する最も簡単な方法です。

于 2009-04-02T13:36:49.440 に答える
0

これは私にとってはうまくいきました:

yourString = HttpUtility.HtmlDecode(yourString)

必ずインポートしてくださいSystem.Web

html文字コード表

于 2018-06-26T11:02:32.923 に答える