7

HTML属性コンテキストの信頼できないデータをエンコードする適切な方法は何ですか?例えば:

<input type="hidden" value="<?php echo $data; ?>" />

私は通常、htmlentities()またはhtmlspecialchars()これを行うために使用します:

<input type="hidden" value="<?php echo htmlentities($data); ?>" />

ただし、最近、渡す必要のあるデータがページの場所を変更するためにJavaScriptに渡す必要のあるURLである場合に、アプリケーションが破損するという問題が発生しました。

<input id="foo" type="hidden" value="foo?bar=1&amp;baz=2" />
<script>
    // ...
    window.location = document.getElementById('foo').value;
    // ...
</script>

この場合、fooはCプログラムであり、URLおよびsegfaultsでエンコードされた文字を理解しません。

JavaScriptで値を取得して、のようなことを行うことができますが、それは厄介なようvalue.replace('&amp;', '&')で、アンパサンドに対してのみ機能します。

だから、私の質問は:HTML属性に注入されるデータのエンコードまたはデコードを行うためのより良い方法はありますか?

OWASPのXSS防止に関するチートシートをすべて読みましたが、属性を引用するように注意している限り、エンコードする必要のある文字は引用自体(")だけです。この場合、次を使用できます。 -のようなものstr_replace('"', '&quot;', ...)ですが、正しく理解しているかどうかはわかりません。

4

5 に答える 5

11

htmlentities()またはを使用する現在の方法はhtmlspecialchars()正しいアプローチです。

提供した例は正しいHTMLです。

<input id="foo" type="hidden" value="foo?bar=1&amp;baz=2" />

value属性のアンパサンドは実際にHTMLエンコードする必要があります。そうでない場合、HTMLは無効になります。ほとんどのブラウザはそこにあるものでそれを正しく解析しますが&、それはそれが無効であり、あなたがそれをエンコードしているという事実を変えることはありません。

問題は、値のエンコードにあります。これは良いことですが、正しくデコードされないJavascriptコードを使用しているという事実にあります。

実際、JSコードがDOMにアクセスしており、DOMがデコードされた値を返す必要があるため、これには驚いています。

私はこれを自分自身に証明するためにJSfiddleを書きました:http://jsfiddle.net/qRd4Z/

これを実行すると、期待どおりにデコードされた値を含むアラートボックスが表示されます。console.log私が期待する結果も得られるように変更します。では、なぜ異なる結果が得られるのかわかりませんか?おそらく、別のブラウザを使用していますか?テストしているものを指定する価値があるかもしれません。または、誤ってエンティティを二重にエンコードした可能性がありますか?そうではないことを確認できますか?

于 2012-07-10T21:31:07.013 に答える
5

HTML属性コンテキストの信頼できないデータをエンコードする適切な方法は何ですか?

属性値を二重引用符で囲む場合は、htmlspecialchars()で十分です。

 <input id="foo" type="hidden" value="foo?bar=1&amp;baz=2" />

これは正しく、ブラウザはサーバーに送信foo?bar=1&baz=2(デコード&amp;)します。サーバーにが表示されない場合はfoo?bar=1&baz=2、値を2回エンコードしている必要があります。

javascriptで値を取得することも返す必要がありfoo?bar=1&baz=2ます(たとえば、document.getElementById('foo').valueを返す必要がありfoo?bar=1&baz=2ます)。

ブラウザを使用してページのソースを表示し、入力フィールドの実際のソースを確認します。

Javascriptを使用して入力フィールドの値を変更する場合、スクリプトはそれをダブルエンコードする必要があります。

ところで、ユーザー入力が間違っているためにプログラムがセグメンテーション違反にならないようにする必要があります;)

于 2012-07-10T21:26:52.680 に答える
0

DOMを使用して、値をデコードできます。

function decodeHTMLSpecialChars(input){
  var div = document.createElement('div');
  div.innerHTML = input;
  return div.childNodes.length === 0 ? "" : div.childNodes[0].nodeValue;
}

これにより、次の文字列がレンダリングされます。

'http://someurl.com/foo?bar=1&amp;baz=2'

これに:

decodeHTMLSpecialChars('http://someurl.com/foo?bar=1&amp;baz=2');
// => 'http://someurl.com/foo?bar=1&baz=2

いいえ、HTMLのエンコードとデコードの場合、htmlspecialcharsおよびhtmlのエスケープは標準的な方法であり、問​​題なく機能します。

于 2012-07-10T21:25:20.783 に答える
0

html_entity_decodePHPJSで関数を使用するだけではありませんか?

http://phpjs.org/functions/html_entity_decode

それ以外は、代わりにデータをbase64でエンコードできます...

于 2012-07-11T02:42:52.107 に答える
0

htmlentitiesそのまま使用しても効果はありませんのでご注意ください!

デフォルトでは、エンコードするだけです" < > &

'問題を引き起こす可能性のある逃げ場はありません!

関数にフラグを使用していることを確認してください。使用法と例はここにあります。

于 2013-03-24T00:27:49.067 に答える