PHP逆引きレシピ 第2版 (PROGRAMMER’S RECiPE)をざっと読みました。
充実したサンプルコード
ほとんどのレシピにサンプルコードが掲載されています。コードは修正BSDライセンスで、http://2nd.php-recipe.com/download/からダウンロードできます。
コード内に説明コメントが多くあり、理解し易くなっています。たとえば json の項では、このようになっています。
<?php
# jQueryなど主要なJavaScriptライブラリを通じてのアクセスである
# (ブラウザからの直接アクセスでない)ことを確認します。
# この方法はJSONハイジャック攻撃など☆レシピ305☆(JSONのセキュリティについて知りたい)に対しても有効です。
if (! isset($_SERVER['HTTP_X_REQUESTED_WITH']) ||
$_SERVER['HTTP_X_REQUESTED_WITH'] !== 'XMLHttpRequest') {
die(json_encode(array('status' => "不正な呼び出しです")));
}
# データを準備します。
$value = array(
1 => array('item' => '台湾ラーメン', 'price' => 580, 'orders' => 113),
2 => array('item' => '台湾ラーメン(アメリカン)', 'price' => 580, 'orders' => 72),
3 => array('item' => 'ニンニクチャーハン', 'price' => 630, 'orders' => 87),
);
# Content-Typeを「application/json」に設定します。
header("Content-Type: application/json; charset=UTF-8");
# Internet ExplorerがContent-Typeヘッダーを無視しないようにします☆レシピ287☆(XSS対策をしたい)。
header("X-Content-Type-Options: nosniff");
# 可能な限りのエスケープを行ない、JSON形式で結果を返します。
echo json_encode(
$value,
JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP
);
/* ?>終了タグ省略 ☆レシピ001☆(サーバーのPHP情報を知りたい) */
1つのレシピから、他のレシピについても学ぶことができるようになっています。
脆弱性のサンプルコードも
セキュリティ面でも配慮されています。脆弱性のあるコードも掲載されています。
<?php
# このサンプルには脆弱性が含まれています。このファイルは絶対に本番サーバーに
# アップロードしないでください。このページを利用して攻撃が可能です。
if (isset($_GET['filename']) && preg_match('/.txtz/', $_GET['filename'])) {
readfile('/home/user/files/' . $_GET['filename']);
} else {
die('不正なファイル指定がありました。');
}
書籍にはローカル環境の作り方も解説されているので、このコードを公開サーバに置く人はいないと思います。ただ、サンプルコード冒頭に
if ($_SERVER['REMOTE_ADDR'] !== '127.0.0.1') {
exit();
}
とでも書いておけば、万一公開サーバにアップしてしまった場合の保険になるかな、と思いました。
その他の雑感
テストの章が追加されています。phpunit と selenium について一通りの解説があります。phpunit も selenium も多くの機能がありますが、初級からのステップアップという本書では、ちょうど良い分量だと思います。
フォーム作成の箇所が HTML5 対応になるなど、初版と同じレシピもしっかりバージョンアップされているようです。
マルチバイト周りはもう少し詳しく記述されていると良かったと思います。私が個人的によく使うmb_strimwidth の記載が無かったですし。
smarty が20ページと、かなり多くある割には他のテンプレートが全く触れられていないのはちょっと不思議でした。