あの徳丸本にも間違いはある! 自分で確認することが大切です
徳丸本に間違いを見つけましたので、少々大げさに公表してみようと思います。
徳丸本の誤った記述
まずは、問題の記述をご覧ください。これを見ただけでどこが問題かわかった人は、かなりするどいです。普通は見逃します。
これは、ご本人によるスライド 徳丸本に載っていないWebアプリケーションセキュリティ の 1ページであり、「徳丸本に載っていない」というタイトルに反して、徳丸本に載っている内容も一部記載されています。
ここで問題となるのは(徳丸本P63)の header() 関数のコードです。
実際にこのコードを検証してみましょう。
<?php // 徳丸本 P.63 に掲載されているコード header('X-FRAME-OPTIONS', 'SAMEORIGIN'); // 送信しようとしているヘッダを表示 var_dump(headers_list());
手許の環境でこのコードを実行してみると、以下のような結果になりました。
array 0 => string 'X-Powered-By: PHP/5.3.23' (length=24)
おかしいですね。肝心の X-FRAME-OPTIONS ヘッダがありません。
念のため、Live HTTP headers でも確認してみましょう。
やはり、X-FRAME-OPTIONS ヘッダはありません。困りましたね。このヘッダを出力することにより、クリックジャッキングを防ごうというサンプルコードが期待したように動きません。これでは、クリックジャッキングを防ぐことができません。
しかも、あの徳丸本のコードをそのまま使っているのに! 正誤表も 100回見たが載っていない。これは自分の環境の問題なのか?! と眠れない夜を過ごした方もいるかも知れません。しかし、ヘッダが出ないということは、自分の環境では対策できていないということで、これを放置するのは危険です。
こんなとき、どうしたらいいのでしょう?
そうです。PHP にはあの PHP マニュアルがあります。とりあえず、PHP マニュアルを見ましょう。
答えは(今回は)すべて PHP マニュアルにありました。
header() 関数の使用法は以下のとおりです。
void header ( string $string [, bool $replace = true [, int $http_response_code ]] )
もうおわかりですね。第1引数はフィールド名ではなく、第2引数もフィールドの値ではありません。
というわけで、正しいコードは、以下のようになります。
header('X-FRAME-OPTIONS: SAMEORIGIN');
そのように修正すると、めでたく以下のように X-FRAME-OPTIONS が出力されるようになりました。
array 0 => string 'X-Powered-By: PHP/5.3.23' (length=24) 1 => string 'X-FRAME-OPTIONS: SAMEORIGIN' (length=27)
コピペの弊害
問題のあるコードが、検証されることなくコピペされ伝播していくという可能性が PHP ではとくに懸念されているわけですが、とりあえずググってみました。
幸か不幸か、クリックジャッキング自体がまだあまり浸透していないこともあってか、このコードはそれほど浸透していないようです。以下に 1件、徳丸本と同じ記述をしているページがあるだけでした。
http://zeijaku.net/blog_history/?search=201111082318
ただし、外部に出ないコードに徳丸本のコードがそのままコピペされているという可能性は残りますので、コードレビューや監査などをしている人はチェックするといいかも知れません。