質問: 入門書などで、セキュリティ対策として以下のようなheaderを冒頭に書いてあるのを見ます。 ``` //レスポンスの文字エンコーディングを指定 header('Content-Type: text/html; charset=UTF-8'); //クリックジャッキング対策 header('X-FRAME-OPTIONS', 'SAMEORIGIN'); ``` またはクリックジャッキング対策としてHTMLに記述。 ``` ``` これらは基本的にどのPHPファイル(HTMLを返しutf-8である前提)に書いておいても問題はないですか?保険的なセキュリティ対策として有効でしょうか? また、他にheader()等で保険的にセキュリティ対策できるものがあれば教えていただきたいです。 よろしくお願いします。
回答: Content-Typeに文字エンコーディング指定も大切ですが、結果としてセキュリティにも利いてくるということであって、元々はコンテンツの文字エンコーディングを明示することにより、文字化けなくコンテンツが表示できるようにするということですね。 以下は、セキュリティが主目的のレスポンスヘッダで、かつ、指定することによる悪影響があまりないものです。これらは、Apacheやnginxの設定により必ず出力しておくとよいでしょう。最近の脆弱性診断ツールは、これらがないことだけで、脆弱性指摘するものが増えてきました。 ``` X-Frame-Options: SAMEORIGIN X-Content-Type-Options: nosniff X-XSS-Protection: 1; mode=block ``` metaタグによるx-frame-options指定は、コメントにあるようにまったく無意味です。古いバージョンのGoogle Chromeでは有効でしたが、Google Chromeも最近のバージョンではmetaタグによるx-frame-optionsは無視します。 > > これらは基本的にどのPHPファイル(HTMLを返しutf-8である前提)に書いておいても問題はないですか? > > > はい。しかし、前述のように、Apacheやnginxの設定で出した方が簡単で、漏れる心配もありません。 > > 保険的なセキュリティ対策として有効でしょうか? > > > はい。 厳密に言うと、x-frame-optionsはクリックジャッキングの根本的解決策であって、保険的なものではありません...が、「保険的以上の意味がある」ということですね。他の2つはXSSに対する保険的対策ですが、XSS対策はきちんと実施することが前提です。レスポンスヘッダだけでXSSが防げるわけではありません。