Serviceを読んで理解し、同意したものとみなします。スタック・オーバーフローはプログラマーとプログラミングに熱心な人のためのQ&Aサイトです。3万件117PHPでスクリプト挿入攻撃や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()で変換される文字の違いは分かるのですが、どこまでやればサニタイズ目的で十分なのかよく分かりません。以上詳しい方いらっしゃいましたら、ご教示ください。他の選択肢は考えられません。著者の思いつきではなく、ここ数年万人によって当たり前のように言われ続けていることです。【ユーザからの入力時】にサニタイズしてしまうと、HTML出力以外でサニタイズ前の文字列が必要になった際にhtmlspecialchars_decode()等で元に戻す必要があるため、やはり【HTMLへの出力時】がベストなのでしょうか?その通りですね。いったミスを防ぐ意図もあります。「格納時にエスケープ」という手段を採用している某日本の大手Q&Aサイトは、今までに私が確認できただけでXSS脆弱性を3回に加えて多重エスケープも同じ回数ぐらい発生させてしまっています。後者に関しては今も放置されている箇所があります。上で挙げたQ&Aサイトや某短文投稿サイトでもこれに関して、エンティティ表記されている部分が途中でぶった切られる問題も発生していたりします。HTMLの使用を認めています。そもそもエスケープしていないことになりますね。ことに気付くと思います。はてなブログはインラインフレーム埋め込み、FC2ブログは別ページへの移動となります。どちらを選ぶべきかセキュリティに関して十分な知識があり、ドメインを用意できるならこちらの選択肢もアリです。基本的にはやはり前者の「出力時にエスケープ」の方が選択されるべきです。必要性シングルクオートで括られた属性内に表示する際には必須です。悪いというわけではありません。採用する必要はないです。'UTF-8');}という関数を作ってしまっておいてそれを流用する方が良いでしょう。htmlentitiesセキュリティ対策が目的であれば前者で十分です。|5出力時にエスケープが妥当な判断だと思います。XSS対策を行う場合、ただ単にhtmlspecialcharsだけでは防げない場合があるので注意が必要です。href="javascript:alert(0);">test</a>なりますが、XSSが発動します。質問ではどこまでやればサニタイズ目的で十分なのかよく分かりません。よってエスケープすべき、条件等が異なります。htmlにおいてXSSの対策を行う際に、上記の例の様にユーザーから受け付けた入力値をプログラムがHTMLのどこに出力するのか考慮が必要となります。※JSON,DomでのXSS等もあるので興味があればgoogle等で調べてみてください。|2エスケープの箇所エスケープが何なのかを考えれば答えは明らかになります。質問の場合のXSS対策では、HTMLではタグが特別な意味を持つからそれを無効化するということです。そのための方法がエスケープです(なお、タグをタグとして出力する場合はエスケープしませんが、その場合は、許可するタグをきちんと制限できないとXSSが可能になります)。「<script>」という文字をHTMLで表現するには「&lt;script&gt;」とエスケープする必要があります。HTMLで出力するからhtmlspecialchars()関数で処理する必要があります。いつhtmlspecialchars()関数を使うかは、HTMLで出力する直前がベストになります。その他の場合にはエスケープの必要性がないだけでなく、HTML以外で出力する場合に(htmlspecialchars_decode()等で元に戻さないと)変な文字列を出力してしまったり、多重エスケープしてしまうかもしれないなど、ややこしくなるだけでいいことはありません。http://blog.ohgaki.net/what-is-escapehtmlspecialchars()とhtmlentities()の使い分けXSS対策としてはどちらでも十分です。ENT_QUOTESについてはENT_QUOTESでいいです。括られていることを保証する必要があります。出力を大前提にして、入力時にそこに特化したエスケープをあらかじめかけてしまうやり方の不自然さは理解できると思います。以外の出力先に利用するときにエスケープを戻す処理が必要になりますし、その他のすべてのデータに対して、すでにエスケープされているのかどうかをいちいち判断しなければならなくなります。アプリケーションが保持するデータはなるべく生に近い形で持っておいて、出力時に用途に合わせてエスケープするという原則が、結果的に処理をシンプルに保つことになります。|1「出力時にエスケープ」を支持する事例として、古いフィーチャーフォンのために全角文字を半角文字に変換する処理を例に挙げます。次のコードはエスケープの失敗例です。エスケープが回避されています。ような1バイト文字コードを扱えるようにするためということが挙げられます。2つの関数の違いは前者が16進数、後者が10進数で表現されることです。テーブルを使っている場合です。そのまま保存することができません。|回答スタック・オーバーフローに参加してくれて、ありがとうございます!質問の回答を共有してください。回答を説明し、自分の検討結果も共有してください。意見を述べること(意見を述べるなら、参照リソース、自分の経験で意見をサポートしてください)さらにサポートが必要な場合このヘルプを参考してください。“回答を投稿”をクリックすることで利用規約、プライバシーポリシー、及びクッキーポリシーに同意したものとみなされます。タグが付いた他の質問を参照するか、自分で質問をする。質問のフィードこのRSSフィードを購読するには、このURLをコピーしてRSSリーダーに貼り付けてください。