質問: PHPでスクリプト挿入攻撃やXSS対策として、サイタイズのためにhtmlspecialchars()を使うことがあると思いますが、使用する際の詳細が気になったので質問します。具体的には以下の2点です: * サニタイズ関数を適用するタイミングについて 【ユーザからの入力時】【HTMLへの出力時】【その中間】の3パターンが考えられますが、ベストなのはどれでしょうか?GET・POSTパラメータの処理と、その出力がほぼ同時に行われる場合では違いが顕在化しませんが、そうでないより一般的な場合に注意する点が知りたいです。 『パーフェクトPHP』330・334頁によると「出力時にエスケープ」とだけ書いてありますが、それに関連する詳細の記述やサンプルコードがないため背景知識があってそうなるのか、それとも単なる著者の思いつきなのか判断できません。 【ユーザからの入力時】にサニタイズしてしまうと、HTML出力以外でサニタイズ前の文字列が必要になった際にhtmlspecialchars_decode()等で元に戻す必要があるため、やはり【HTMLへの出力時】がベストなのでしょうか? * htmlspecialchars()とhtmlentities()の使い分けについて いずれも第2引数にENT_QUOTESを指定すると思いますが、サニタイズ目的に限る場合、htmlspecialchars()で十分でしょうか。それともhtmlentities()まで使用する必要があるでしょうか? get_html_translation_table()で変換される文字の違いは分かるのですが、どこまでやればサニタイズ目的で十分なのかよく分かりません。 以上詳しい方いらっしゃいましたら、ご教示ください。
回答: **出力時にエスケープ**が妥当な判断だと思います。 ただしXSS対策を行う場合、ただ単にhtmlspecialcharsだけでは防げない場合があるので注意が必要です。 例えば ユーザーからの入力として`http://someware.com/`のURLを受け取り、あるページでそのURLを以下の様にプログラムが出力した場合 ``` ``` `http://someware.com/` を `javascript:alert(0);` とすると < > " / ' は含まれてないので ``` test ``` なりますが、XSSが発動します。 質問では ``` どこまでやればサニタイズ目的で十分なのかよく分かりません。 ``` とありますが、出力するコンテンツタイプ application/javascript. application/json, text/html によってエスケープすべき、条件等が異なります。 htmlにおいてXSSの対策を行う際に、上記の例の様にユーザーから受け付けた入力値をプログラムがHTMLのどこに出力するのか考慮が必要となります。 ※JSON,DomでのXSS等もあるので興味があればgoogle等で調べてみてください。 参考のURL