6755


現在XSS（クロスサイトスクリプティング）のテストを行っていて、  
PHPの対象箇所をhtmlspecialcharsの関数を用いて対応しています。

テスト用の値としてはalert(document.cookie)のスクリプトコード  
をURLパラメータにセットしてみて、Cookie情報がポップアップされないように  
修正を行っています。

しかしながら、あるHTMLファイル内にPHPで記述されたコードがあるのですが、  
htmlspecialchars関数を使ったら、添付画面のように、  
表示されてしまいます。  
ポップアップすることは直ったようですが、画面にこのような文字列が表示  
されるようになってしまいました。

何か思い当たる原因はないでしょうか？

試してみるべきことがあったら教えてください。

どうぞよろしくお願い致します。

![不具合の画面](https://i.stack.imgur.com/SxOPL.jpg)


CC BY-SA 3.0
2015-02-19T07:06:02.507
6740
2015-02-19T08:06:59.127
7634
question
php html xss
XSS（クロスサイトスクリプティング）の対応でhtmlspecialcharsを使ったら異なる現象が発生

[code]

    &quot;&gt;&lt;script&gt;alert(document.cookie)&lt;/script&gt;
    
[/code]

は

[code]

    "><script>alert(document.cookie)</script>
    
[/code]

がhtmlspecialcharsで変換された結果です。  
テスト用に渡した値がそのまま（変換されて）表示されているのではないかと思いますが、  
「">」から始まっているので、どこかで「<」「>」の数があっていないとかはあるかもしれません。

参考：「HTMLでよく使用される特殊文字」に記号と変換後の文字列の表があります。  
<http://www.iarumas.jp/pc/learning/html/special_character.html>


CC BY-SA 3.0
2015-02-19T07:36:17.380
6749
2015-02-19T07:36:17.380
3516
6740
answer


`htmlspecialchars`か類似のエスケープ関数を2回実行しています。

元データ`'`→1回目のエスケープ`&quot;`→2回目のエスケープ`&amp;quot;`→(ブラウザ上での表示)`&quot;`

エスケープの原則は「値を利用するタイミングで行う」です。どこでエスケープをやっているか分からない状況になるとこのように二重エスケープになったりエスケープ漏れが生じます。


CC BY-SA 3.0
2015-02-19T07:58:44.410
6755
2015-02-19T08:06:59.127
2015-02-19T08:06:59.127
5793
5793
6740
answer