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&baz=2" />
<script>
// ...
window.location = document.getElementById('foo').value;
// ...
</script>
この場合、foo
はCプログラムであり、URLおよびsegfaultsでエンコードされた文字を理解しません。
JavaScriptで値を取得して、のようなことを行うことができますが、それは厄介なようvalue.replace('&', '&')
で、アンパサンドに対してのみ機能します。
だから、私の質問は:HTML属性に注入されるデータのエンコードまたはデコードを行うためのより良い方法はありますか?
OWASPのXSS防止に関するチートシートをすべて読みましたが、属性を引用するように注意している限り、エンコードする必要のある文字は引用自体("
)だけです。この場合、次を使用できます。 -のようなものstr_replace('"', '"', ...)
ですが、正しく理解しているかどうかはわかりません。