0

ビュー ページ (asp.net mvc 3 razor) に次のコードがあるとします。

<a href='https://example.com/search?q=@Url.Encode(Model.UserInput)'>Click here</a>

Model.UserInput任意の文字を含むことができるユーザー入力文字列です。

これは、html インジェクションとクロスサイト スクリプティングに関して、完全に安全ですか? または、クエリ文字列を URL エンコードした後に HTML エンコードする必要がありますか?

もちろん、通常はこの段階の前に危険な入力を排除しますが、それは問題ではありません。

4

2 に答える 2

3

クエリ文字列パラメーターを URL エンコードする必要があります。それらを生の形で渡すことはできませんし、渡すべきではありません。?パラメーター (この場合のユーザー入力) には、、、=などの特殊な URI 文字を含めることができます&。エンコードしないと、ユーザー入力は次のhansel&gretelようになりhttps://example.com/search?q=hansel&gretelます。qクエリ文字列パラメーターには のみが含まれますhansel

さらに、すべての HTML をHTML エンコードする必要があります。属性値内で使用されるフラグメントも含まれます。<これは、などの HTML で特別な意味を持つ文字が、それぞれの HTML エンティティに変換されるようにするためです>&URL エンコーディングはこれらのケースのほとんどを排除しますが、これを習慣にする必要があります。

'URLエンコーディングをバイパスすることに注意してください!! また、HTMLエンコーディングも通過する(と思います)。HTML 属性区切り文字として使用しないでください。または'、HTML エンコーディング関数がまたはに変換'されることを確認してください。&#039;&apos;

于 2012-07-18T21:51:08.010 に答える
1

これは完全に安全ですか

そうかもしれないし、そうじゃないかもしれない。今のところ、安全性を無視して、別の角度からこの問題に取り組みます...

URL エンコーディングは目的を果たします。パーセント エンコーディング(実際の名前) は URL です。「urlエンコーディング」が<space width='1'>実際のスペースの代わりにすべてのスペースを置き換える%20か、それが今何をしているのか想像してみてください。URL " ...?q=foo bar" は、架空の例では " ...?q=foo<space width='1'>bar" になり、正しく "URL エンコードされた" URL になります。これは、PDF や CSV ファイル、またはその他の種類の出力を作成する場合に便利ですが、HTML では問題が発生します。あなたの場合、属性を'「終了」させてゴミとして残すためです。href1'>

<a href='https://example.com/search?q=foo<space width='1'>'>

出力は HTML を対象としているため、実際には、少なくとも私見ではHTMLEncode(URLEncode(MyUrl))(疑似コード) を実行する必要があります。

これを覚えておいてください:エスケープは常に特定のコンテキスト内で行われます。SQLの場合、SQLインジェクションの脆弱性を回避するために、引用符などをエスケープするために「mysql_real_escape」に似たものが必要です。HTML では"<のような文字をエスケープする必要があります。RTF ファイルでは (実際にはわかりません) のような他の文字列/文字をエスケープする必要があり\、 CSV ファイルではエスケープする\\必要があります。フィールド値内および JSON 出力では、 を含む文字列をとしてエスケープする必要があります。各タイプの出力 (フォーマット) には、独自のエスケープ/エンコーディングが必要です。,;"\"

あなたが今行っているのは「コンテキストのネスト」です。「URL コンテキスト」を「HTML コンテキスト」にネストしています。したがって、それに応じてエスケープ/エンコードする必要があります。

TrueBlue が示すように、安全ではありません。

于 2012-07-18T21:32:24.670 に答える