HTML属性コンテキストの信頼できないデータをエンコードする適切な方法は何ですか?たとえば:PHP:HTML属性エンコーディング/ JavaScriptデコード
<input type="hidden" value="<?php echo htmlentities($data); ?>" />
は、しかし、私は最近、私が合格するために必要なデータだったとき、これは自分のアプリケーションを壊した問題に遭遇した:
<input type="hidden" value="<?php echo $data; ?>" />
私は通常これを行うためにhtmlentities()
かhtmlspecialchars()
を使用しますページの場所を変更するためにJavaScriptにハンドオフされるために必要なURL:この場合
<input id="foo" type="hidden" value="foo?bar=1&baz=2" />
<script>
// ...
window.location = document.getElementById('foo').value;
// ...
</script>
を、foo
はCのプログラムであり、 URLとsegfaultのエンコードされた文字は理解できません。
JavaScriptで値を取得してvalue.replace('&', '&')
のようにしてもかまいませんが、それはクルージュに見えますが、アンパサンドのみで動作します。
私の質問は、HTML属性に注入されるデータのエンコードまたはデコードについてのより良い方法はありますか?
私はOWASP's XSS Prevention Cheatsheetのすべてを読んだことがある、と限り、私は自分の属性を引用するように注意していて、その後、私はエンコードする必要がある唯一の文字が引用符自体("
)であるように、それは私に聞こえる - その場合は、I str_replace('"', '"', ...)
のようなものを使うことができますが、正しく理解しているかどうかはわかりません。
を見つけることができますか?コメントにPHPのマニュアルでXSSを保護する方法を示すコード例はほとんどありません。 http://php.net/manual/en/function.urlencode.php – GillesC
@gillesc: 'urlencode()'は、URL属性ではなく、URL *パラメータ*をエンコードするためのもので、HTML属性コンテキストのためにエンコードしません。このマニュアルでは、このことについても議論するセクションがあります。*「そのままで、htmlentities()またはhtmlspecialchars()を使用してURLをエンコードしてください」* – FtDRbwLXw6
あなたは 'window.location = document.getElementById( 'foo'); '?これは私が思うようにすべきです - > 'window.location = document.getElementById( 'foo')。value;'そして右ページにリダイレクトされます(foo?bar = 1&baz = 2) – ocanal