既に執筆してから10年ほど経っている「Webアプリケーションセキュリティ対策入門」ですが、サンプルコードがおかしいという指摘がありました。しばらく前からWikiに載せているのですが、時間がなくブログは書いていませんでした。
コードが随分おかしいという指摘は今まで私にまで届いておらず、何かバグがあったのだろうくらいに思ってっていました。しかし、実際にコードを見てみるとおかしなことだらけで、とんでもないミスをしていがことが分かりました。
以下に追加したREADME.txtの内容を記載します。まだまだ色々改善できる部分があります。このまま何かに流用するのではなく、参考用のサンプルだと考えてください。
追記:このサンプルに「CSRF脆弱性がある」と指摘があったのでサンプルプログラムを更新しました。詳しくは、こちらをどうぞ。
====================シンプルBBS====================
「Webアプリセキュリティ対策入門」のサンプルプログラムの修正版です。収録されていたコード間違い探し用のコードが手違いで収録されていました。バリデーションが全てのメソッドに入っていない、脆弱性がある、正規表現結果の否定版がない(正規表現の否定版は作成が難しいので正規表現を利用するバリデーション関数には正規表現関数の結果を否定する関数が必須)、バリデー
ションとエラーの区別がない、ロジックがおかしい(自動ログイン自体は実装されているのに動作していない、バリデーションが動作していないなど)、など見た目は普通に動作しているようになっていますがいろいろ入っています。どうみても間違い探し用です。
古い本ですが最近コードがおかしい、ということを耳にしてコードの一部をみても、確かにおかしい、なぜこんなコードになっているかと見直してみて分かりました。
既に入手不可能になって随分経ちますが、購入された方に申し訳ないので正しく動作する版を公開します。間違い探しを解説しようと思い、2つ作っていたのですがミスで誤ったバージョンが収録されていた事をお詫びいたします。
正しく動作する版のコードも現在では利用できないSQLite2の関数を使っているのでPDOのSQLite3ドライバを使うように修正しました。ついでにコードの書き方やコメントは手直ししています。バリデーションは今見ても参考になるよう少しだけ厳格化し、参考になるような関数を追加しました。バリデーションコードとエラー処理と共用できるようになっています。エラーハンドラで終了
することを前提としていた点はフェイルセーフが入っています。これでお勧めするエラーハンドラを使っていなくても安全になります。全体的にコメントも追加してわかりやすくしました。セッション管理はPHP7のlazy_writeに対応して、更新タイムスタンプの解像度を1秒から60秒に変更しました。もちろんバリデーションや自動ログインも正しく動作するようになっています。
セッション管理、バリデーションとエラー処理の基本的な考え方、認証処理の基本部分などは現在でも参考になると思います。バリデーション処理で最も不足している機能はパラメータの必須フラグ、空の値許可フラグです。これらのフラグも実装すればそれなりに実用的なバリデーションが行えるようになます。
MVC風に作ってありますが、本物のMVCアーキテクチャではありません。サンプルプログラムの作りは一般的Webアプリの参考にはなりません。
BBSというよりゲストブック(誰でも書き込めるメモのような物)になっています。
■ 必要な物
PHP 5.4以降 (これより古いPHPでも動作すると思いますが、未確認です)
- mbstringモジュール、PDOモジュールとPDO_SQLiteドライバ
Fedora21上のPHP 7.0.0-devを使い、簡単に5.4で動作確認しました。
■ 使い方(PHP 5.4以降)
$ tar jxvf simple-bbs.tar.bz2
として解凍する。simple-bbsディレクトリ内にファイルが展開される。
$ (cd simple-bbs/dat/install/; php initdb.php)
を実行してデータベースを初期化する。
■ 実行(CLIのビルトインWebサーバー)
$ cd simple-bbs $ php -S 127.0.0.1:8000
http://127.0.0.1:8000/ にブラウザでアクセスするとごく単純なBBS(と言うよりゲストブック)が起動します。
■ 足りない機能
- ユーザー管理機能
- スレッド管理機能
- バリデーション機能(実用的に使うために必要なフラグ類)
- データベースのGC(有効期限切れのform_idデータの削除)
- など、実用的に利用するには必要となる機能の多くの機能が実装されていません。
■ 収録ファイル
$ ls -tFR simple-bbs/ simple-bbs/: README.txt lib/ validate_test.php config.php thread.php index.php dat/ login/ tpl/ thread_create.php phpinfo.php simple-bbs/dat: bbs.dat install/ index.php simple-bbs/dat/install: initdb.php index.php simple-bbs/lib: auth.class.php bbs.class.php error.lib.php config-check.lib.php session.lib.php security.lib.php database.class.php index.php simple-bbs/login: index.php simple-bbs/tpl: thread_create.php thread_view.php login_form.php error.php top.php thread_list.php index.php
■ 備考
改造しようとすると本格的なフレームワークがいかに便利かよくわかると思います。トイプログラムや問題を埋め込んで教材に利用するなどの目的でご利用ください。
厳格なバリデーションをサポートしていないフレームワークでも、サンプルプログラムのような仕組みで比較的簡単にバリデーションを追加でき、バリデーション関数はエラー処理とも共用できることがわかると思います。
正しく動作する版をベースに修正したので大きな間違いは無いとは思いますが、DJBやKnuth氏のようなコードを書くタイプではないのでバグがあるかも知れません。バグはご連絡頂ければ幸いです。