脆弱性対策におけるhtmlspecialchars()の使用箇所について
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()で変換される文字の違いは分かるのですが、どこまでやればサニタイズ目的で十分なのかよく分かりません。
以上詳しい方いらっしゃいましたら、ご教示ください。