X-UA-Compatible

これは、IEのレンダリングモード変更に使用する。通常はIE=Edgeとなっていおり、最新のIEのレンダリングエンジンを用いてページを表示しているが、IE8にはテキストエリアが、相対設定の場合かってにスクロールする問題があるため、編集画面ではIE7モードで描画している。

なお、スキンやpukiwiki.ini.phpの設定でレンダリングエンジンが明示的に指定されている場合、そちらの設定を優先する。Chrome Frameで表示するようにすることも可能。

X-Frame-Options: deny

これは、IE8から実装されたヘッダーでクリックジャッキングを防ぐもの。近年Ajaxの普及によりサイズが0の不可視のIFRAMEを使うケースが多くなってきた。本来のこの手のインラインフレームの用途は、ページのキャッシュだったりクロスドメイン非同期通信で使うものだが、これとスタイルシートを悪用して、悪意を持ったサイトの手前にIFRAMEで不可視の標的となるサイトを呼び出し、意図しないクリックをさせるようにする脆弱性が見つかった。例えば、別サイトへのリンクをクリックしたつもりが、標的となるサイトの投稿ボタンをクリックしていたというような感じである。PukiWiki Adv.では、標準でフレームで呼び出されたときに強制的にフレームを解除す設計になっているが、あくまでもJavaScriptによる実装なので、JavaScriptが動作しないときの対策が不十分であった。

しかし、このヘッダーを入れることで、最近のブラウザではクリックジャッキングの対策はできる。元々はIEの独自拡張だったが他のブラウザでも実装されるようになった。

X-Content-Type-Options: nosniff

IEでは、HTTPヘッダーの内容ではなく、中身のデーターでファイル形式を判断する。このため、CSSのPHPが適切なヘッダーを出力出来ていなくても、FireFoxのようにスタイルシートが読み込めないという問題が起きない。もちろん、これは適切なものではない。text/plainであっても、中身が明らかにHTMLだった場合HTMLとして評価されてしまう。見た目は画像なのに、中にJavaScriptが入っていた場合、そのスクリプトが実行されてしまう危険性がある。

そこで、MIME Sniffingを無効化する。自動判別処理がなくなる分だけIEでは軽くなるかも。(※IE8以降のみ有効)

X-Requested-With: XMLHttpRequest

これは、PHPが受ける側のヘッダー。ここの値が、XMLHttpRequestだった場合は、ajaxによるリクエストとする。実際のチェックは、IS_AJAXで行う。定義は以下のとおり:

define('IS_AJAX', isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest' || isset($vars['ajax']));

X-UA-Compatible

これは、IEのレンダリングモード変更に使用する。通常はIE=Edgeとなっていおり、最新のIEのレンダリングエンジンを用いてページを表示しているが、IE8にはテキストエリアが、相対設定の場合かってにスクロールする問題があるため、編集画面ではIE7モードで描画している。

なお、スキンやpukiwiki.ini.phpの設定でレンダリングエンジンが明示的に指定されている場合、そちらの設定を優先する。Chrome Frameで表示するようにすることも可能。

X-Frame-Options: deny

これは、IE8から実装されたヘッダーでクリックジャッキングを防ぐもの。近年Ajaxの普及によりサイズが0の不可視のIFRAMEを使うケースが多くなってきた。本来のこの手のインラインフレームの用途は、ページのキャッシュだったりクロスドメイン非同期通信で使うものだが、これとスタイルシートを悪用して、悪意を持ったサイトの手前にIFRAMEで不可視の標的となるサイトを呼び出し、意図しないクリックをさせるようにする脆弱性が見つかった。例えば、別サイトへのリンクをクリックしたつもりが、標的となるサイトの投稿ボタンをクリックしていたというような感じである。PukiWiki Adv.では、標準でフレームで呼び出されたときに強制的にフレームを解除す設計になっているが、あくまでもJavaScriptによる実装なので、JavaScriptが動作しないときの対策が不十分であった。

しかし、このヘッダーを入れることで、最近のブラウザではクリックジャッキングの対策はできる。元々はIEの独自拡張だったが他のブラウザでも実装されるようになった。

X-Content-Type-Options: nosniff

IEでは、HTTPヘッダーの内容ではなく、中身のデーターでファイル形式を判断する。このため、CSSのPHPが適切なヘッダーを出力出来ていなくても、FireFoxのようにスタイルシートが読み込めないという問題が起きない。もちろん、これは適切なものではない。text/plainであっても、中身が明らかにHTMLだった場合HTMLとして評価されてしまう。見た目は画像なのに、中にJavaScriptが入っていた場合、そのスクリプトが実行されてしまう危険性がある。

そこで、MIME Sniffingを無効化する。自動判別処理がなくなる分だけIEでは軽くなるかも。(※IE8以降のみ有効)

X-Requested-With: XMLHttpRequest

これは、PHPが受ける側のヘッダー。ここの値が、XMLHttpRequestだった場合は、ajaxによるリクエストとする。実際のチェックは、IS_AJAXで行う。定義は以下のとおり:

define('IS_AJAX', isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest' || isset($vars['ajax']));

X-Sendfile / X-Lighttpd-Sendfile / X-Accel-Redirect

これらのヘッダーは、主に添付ファイルのダウンロード時に使用する。値は、ファイルの実態のあるパス。これにより、スクリプトの処理をバイパスして直接サーバー上のファイルを参照するようにさせるため、そのぶん負荷を減らすことができます。

PukiWiki Adv.では、Apacheの時は、X-Sendfile、Lighttpdの時は、X-Lighttpd-Sendfile、nginxおよび、Cherokee1の時は、X-Accel-Redirectヘッダを出力します。

Apache を X-SendFile に対応させるには、mod_xsendfileを導入し、XSendFileとXSendFileAllowAboveディレクティブを有効にする必要があります。