Do You PHP?    
Search Engine Optimization  php5 powerd  Valid XHTML 1.0!  Valid CSS!  このサイトのはてなブックマーク数 



last updated
2009/10/08

counter hits
since 1999/11/06


はじめてのPHPプログラミング 基本編―5.3対応 (TECHNICAL MASTER 54)

秀和システムさんから発売となった「はじめてのPHPプログラミング 基本編―5.3対応 (TECHNICAL MASTER 54)」(ISBN4-7980-2082-6・ 2008/10/24発売)を執筆しました(共著です)。

はじめてのPHPプログラミング 基本編―5.3対応 (TECHNICAL MASTER 54)

PHPの入門書です。

きっかけは「まえがき」に書いていますが、例の「中級って何?」なネタです。「書けるようになりましたー」な人ばっかりといわれるPHPですが、実際にそこで満足してしまって、成長が止まっちゃう(止めちゃう)人が多いんじゃなかろうかという気がしてます。

で、そこから次のステップに行くためには、Webアプリケーションのベースとなった技術や周りにある技術はもちろんのこと、中規模のコードを書く際にどういったやり方をしていくのかとか、プログラミング以外の物事を知る必要がありますが、入門書の段階からそういうものがあるということを知る、もしくはその中身をイメージだけでも良いから知っておく(知らせる/知らしめる)方が良いと思い、それらをできるだけ書いたつもり(コラムですが)です。

書籍のタイトルは「PHP5.3対応」とありますが、PHP5.3は執筆/発売時に正式リリースされていないため、使用する環境や基本的な動作確認はPHP5.2.6です。また、PHP5.3.0α2でも一通り動作確認してありますが、サンプルプログラム「04-18.php」だけPHP5.3.0α2の不具合により、動作が異なります。

目次は以下の通りです。

第1章 PHPの世界へようこそ
01-01 PHPの世界へようこそ [PHPって?]
01-02 PHPが動作する環境を準備しよう [PHPのインストールと設定]
01-03 PHPの動作確認 [PHPの動作確認]
第2章 プログラミングを始めよう
02-01 PHPプログラムのお約束ごと(1) []
02-02 PHPプログラムのお約束ごと(2) [/**/ // エラー ]
02-03 変数 [変数]
02-04 定数 [定数]
02-05 型 [型]
02-06 配列 array [配列を使う(1)]
02-07 計算式を使う [計算 比較]
02-08 論理演算 文字列演算 [計算式を使う(2)]
第3章 プログラムの流れを変えよう
03-01 条件分岐 [if]
03-02 複雑なif文 [if else]
03-03 いろいろの条件分岐 [三項演算子とswitch文]
03-04 繰り返す(1) [while do-while]
03-05 繰り返す(2) [for foreach]
第4章 いろいろな関数を使ってみよう
04-01 関数とは [関数]
04-02 文字列操作 [文字列 print echo]
04-03 文字列操作(2) [strlen explode substr str_replace]
04-04 日本語文字列操作 [mb_strlen mb_substr mb_convert_kana]
04-05 パターンマッチング [ereg ereg_replace]
04-06 日付と時刻 [date mktime]
04-07 ファイル操作 [fopen fclose]
04-08 ファイルの読み書き [fread fgets feof]
04-09 独自の関数 [function]
第5章 クラスを使ってみよう
05-01 クラスとオブジェクト [クラス オブジェクト]
05-02 クラスを使う [class new extends]
05-03 インターフェースと例外 [interface try catch throw]
05-04 SimpleXML [SimpleXML]
第6章 効率よく開発するために
06-01 他のプログラムファイルを使う [PEAR ]
06-02 PEARライブラリ [PEARライブラリ]
第7章 PHPとWebアプリケーション
07-01 PHPとWebアプリケーション [PHPとApache]
07-02 HTMLとPHPスクリプト [HTMLとPHP]
07-03 クッキー [Cookie]
07-04 PHPによるアクセス認証 [認証]
07-05 PHPでのセッション管理 [セッション]
07-06 PHPとJSON [JSON]
07-07 Webアプリケーションのセキュリティ [セキュリティ]
第8章 データベース
08-01 データベース「SQLite」 [SQLite]
08-02 SQL(Structured Query Language) [SQL文]
08-03 PHPからのデータベース操作 [sqlite_open]
08-04 データベースのセキュリティ [SQLインジェクション]
第9章 アプリケーションを作ってみよう
09-01 ミニミニブログを作る [ミニミニブログ ]
09-02 ミニミニブログの機能概要 [機能概要]
09-03 ミニミニブログを作ってみよう [ディレクトリ]
09-04 メインページのHTMLを作成する [メインページHTML]
09-05 データベース・テーブルの作成とテストデータの登録 [データベース]
09-06 ミニミニブログ用テーブルについて [データテーブル]
09-07 友達一覧を作る [友達一覧]
09-08 投稿一覧を作る [投稿一覧]
09-09 投稿機能の実装 [投稿機能]
09-10 ページめくり機能を追加する [ページめくり機能]
09-11 ユーザー認証機能の追加 [ユーザー認証]
09-12 友達登録機能を追加する [友達登録機能]
09-13 セキュリティ対策 [セキュリティ]
09-14 リファクタリングする [リファクタリング]

正誤表

ご迷惑をおかけします。。。第2刷が出るようであれば、対応したいと考えています。

p.7 PHP5のインストール
誤)「展開されてファイルを表示する」
正)「展開されファイルを表示する」
p.9 PHP5のインストール
php.iniの編集で、「;extension=php_sqlite.dll」の行もアンコメントし「extension=php_sqlite.dll」としてください。
p.157 PHPをApacheに組み込む
誤)C:\Program Files\Apache Group\Apache2\conf\httpd.conf
正)C:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf
p.157 PHPをApacheに組み込む
httpd.confに追記する内容の「LoadModule」「PHPIniDir」で始まる行で、最後のダブルクオーテーションが抜けています。正しくは、次のとおりです。
LoadModule php5_module "c:/php5/php5apache2_2.dll"
PHPIniDir "c:/php5/"
p.175 ファイルのアップロード
誤)$_FILES["username"]["name"]
正)$_FILES["userfile"]["name"]
p.191 セッションの有効期限を設定する
誤)session_set_cookie_params(クッキー名, クッキーの値, 有効期限, URLパス, ...)
正)session_set_cookie_params(有効期限, URLパス, ...)
p.201 クロスサイトスクリプティング脆弱性
誤)<script>alert("こんにちは");</script>
正)<script>alert("あいうえお");</script>
p.213 SQLiteManagerをインストールする
httpd.confの編集が終わったら、php.ini内の「;extension=php_pdo.dll」の行をアンコメントし「extension=php_pdo.dll」としてください。httpd.confとphp.iniを編集した後にApacheを再起動してください(2009/01/27追加)。
p.235 SQLiteを操作してデータを取り出す
誤)sqlite_open関数の使用例
正)sqlite_query関数の使用例
p.239 SQLiteを操作してデータを登録・更新・削除する
誤)sqlite_clode($dbhandle);
正)sqlite_close($dbhandle);

セキュリティ情報

ご迷惑をおかけします。。。第2刷が出るようであれば、対応したいと考えています。同版での対応は難しいとのことで、別途補足コンテンツを用意するなどの対応を考えます。

p.280 セキュリティ対策用の関数を用意する
 徳丸浩の日記 - 書籍「はじめてのPHPプログラミング基本編5.3対応」にSQLインジェクション脆弱性で指摘されていますが、本書で作成しているセキュリティ対策用関数(security.php)のdbescape関数には不具合があり、渡されたパラメータを正しくエスケープ処理できない場合があります。このため、dbescape関数のコードを参考にしたり、他のアプリケーションで利用しないでください
 正しい対処法としては、徳丸浩の日記 - 書籍「はじめてのPHPプログラミング基本編5.3対応」にSQLインジェクション脆弱性にあるとおり、データベースのバインド機能を使うことです。バインド機能とは、dbescape関数のように、SQLにあらかじめパラメータを埋め込む箇所を指定しておき、あとでパラメータを埋め込む、というものです。しかし、本書で使っているSQLite(SQLite2)はバインド機能を持っていないため、文字列をエスケープしてSQLを作る必要があり、dbescape関数としてまとめようとした訳ですが、返ってSQLインジェクション脆弱性を生じさせる結果となってしまいました。大変申し訳ありません。
 バインド機能を持っているデータベースであれば、PHPの関数として「xxx_bind」などの関数が用意されていることがほとんどですが、バインド機能を持っていないデータベースに対しては、PDO(PHP Data Objects)と呼ばれるクラス群が利用できます。PDOは共通のクラスやメソッドを使って、異なるデータベースにアクセスすることができるというもので、バインド機能を持っていないデータベースに対しても擬似的にバインド機能が使えるようになっています。少々情報が古いですが、本サイトでもPDOを扱った記事がありますので参考にしてみてください。
 指摘して頂いた徳丸浩氏に感謝します。
第9章 ミニミニブログにCSRF脆弱性
 ミニミニブログにCSRF脆弱性 - ockeghem(徳丸浩)の日記で指摘されていますが、本書では取り扱っていないCSRF(Cross-Site Request Forgeries)と呼ばれる脆弱性があります。
 CSRF脆弱性とは、そのWebアプリケーションの利用者が意図しない処理を実行させられてしまう、というものです。詳細は、本書でも触れている独立行政法人情報処理推進機構(IPA)から配布されている資料「安全なウェブサイトの作り方 改訂第3版」のp.28にあります。対策方法については、続くp.29にあります。
 ミニミニブログにおける具体的な対策ですが、先ほどの資料p.29にある1)-1「処理を実行するページを POST メソッドでアクセスするようにし、その「hidden パラメータ」に秘密情報が挿入されるよう、前のページを自動生成して、実行ページではその値が正しい場合のみ処理を実行するようにする。」になります。p.29の解説にも説明がありますが、具体的にはhiddenパラメータとセッションに同じ秘密情報を保存し、データを受け取るスクリプトでその2つが一致しているかどうかを確認します。この時、秘密情報にはランダムな文字列を使いますが、PHPでは「md5(microtime() . mt_rand() . uniqid(mt_rand(), true))」で作られた値などを使います。
 指摘して頂いた徳丸浩氏に感謝します。
p.285 データベースファイルの保存場所
 本書p.285ではApacheの機能を使ってアクセスできないようにしましたが、データベースファイルは公開ディレクトリに格納すべきではない - ockeghem(徳丸浩)の日記で指摘されているとおり、本来、PHPスクリプトを含め、公開するファイルは必要最小限にするのが基本となります。
 指摘して頂いた徳丸浩氏に感謝します。


About This Site |  Privacy Policy |  Contact
Copyright © 1999 - 2009 by Hideyuki SHIMOOKA all rights reserved.