カテゴリー: Development

PROVE for PHP Version 1.1.0

PROVE for PHP Version 1.1.0を公開しました。特に重要な変更はログデータ構造の変更と各種オーバーライド機能の調整です。

今までext3/ext4ファイルシステムの場合、ディスク容量を使い切る前にパフォーマンスが低下してしまい大きなデータを保存できませんでした。データ構造を見直す事により大きなデータでも安定して動作するようになっています。

もっと読む

PHPのセッションアダプション脆弱性克服への道のり

PHP Advent Calender用のエントリです。

PHPのセッション管理は非常に簡単です。セッションをsession_start()で開始して$_SESSION配列を使うだけです。便利で簡単なセッションモジュールですがセッションアダプションに脆弱であるため、一般に言われてる「ログインする時にはsession_regenerate_id()を呼ぶ」コーディングではセッションアダプションに脆弱になってしまいます。

まずは危険性と対策を紹介します。 もっと読む

PHP5.3.9RC2とPHP5.4.0RC2リリース

PHP 5.3.9RC2とPHP5.4.0RC2がリリースされました。

ところで、公式WikiのリリーススケジュールによるとPHP 5.3.9のEOLはPHP 5.4.0のリリース後半年後に予定されています。

https://wiki.php.net/rfc/releaseprocess

1年後にはセキュリティパッチの提供も停止の予定です。私は期間が短すぎると思いますが、、、 皆さん、マイグレーションの準備をしましょう。

もっと読む

セッションのクッキーを設定する場合のベストプラクティス

HTTPセッションは通常クッキーを利用して行います。クッキーを利用したセッションの場合、お薦めする設定は以下の通りです。

  1. ドメイン名は指定しない
  2. パスはルート(/)を指定する
  3. セッション管理用のクッキーはセッションクッキー(有効期間0)にする
  4. httponly属性を付ける
  5. 可能な場合は必ずsecure属性をつける
  6. 複数アプリケーションを利用する場合はsession.nameまたはsession_name()でセッションクッキー名で指定する (アプリケーションの固有名デフォルトで設定し、設定項目として変更できるようにする)

もっと読む

PHP 5.4のビルトインWebサーバの性能

PHP 5.4からCLIのphpコマンドにビルトインWebサーバ機能が追加されています。

ツイッターでWebrick(RubyのビルトインというかRuby製のWebサーバ)+素のRailsページはjRubyで44reqs/sec、cRubyで98reqs/secでした、とのツイートを見かけて、PHPのビルトインWebサーバはどの程度かな?と思って手元のマシンで実行してみました。 もっと読む

PHPのSession Adoptionを修正するパッチ

パッチのテストのお願いです。

PHPerの長年の悩みの種であるセッションアダプションを修正するパッチをPHPに取り込めそうです。PHPのsubversionレポジトリのtrunkまたはPHP 5.4で利用できます。テストが終わったらPHPのレポジトリにコミットする予定です。(テスト期間は2011/11/22まで)

パッチ

少し古いですがパッチの解説

セッションアダプション関連のブログエントリ

パッチに何か問題があったらご連絡頂けると助かります。問題なかったよ、も大歓迎です。

ツイッターの方がレスポンスは良いです。

メールご連絡頂いても構いません。ブログのコメントととして送信する場合はエラーメッセージを無視して送信してください。モデレーションが必要なコメントとして送信できます。

思い起こせばセッションアダプション脆弱性の修正は最初の提案から6年以上経っています。セッションアダプションとブラウザの仕様に関する理解を得られず今まで修正されてきませんでした。しかし、今回は修正できそうです。SQLインジェクション対策や入力のバリデーション処理もそうですが、正しいものは正しい。主張し続ければ時間はかかっても必ず正しい方が認められるのが世の中です。

今度こそPHPのアキレス腱であるセッションアダプション脆弱性を修正しましょう!

テストが可能な方は是非テストして頂けるよう、よろしくお願いします!

PROVE for PHP 1.0.3を公開

私の会社で開発・販売しているPROVE for PHPを更新し、PDOオブジェクトに対応したPROVE for PHP 1.0.3の配布を開始しました。PDOオブジェクトに対応したので幅広いアプリケーションで利用できます。PROVEは非商用の個人利用の場合、無償で利用できます。問題などございましたらツイッターやメールなどでフィードバックを頂けると助かります。

http://www.provephp.com/ja/download

PROVE for PHPとはPHPの動作を詳細に記録・比較し、PHPとPHPアプリのバージョンアップが安全に行えるか簡単にチェックできるツールです。開発中のリグレッションテストツールとして利用できます。

近日中にこのブログでもいろいろな使い方を紹介したいと思っています。

追記: RHEL5系(CentOS5など)で利用できるPHP53パッケージ用RPMのダウンロードも開始しました。

PHP 5.4から利用できるtraitの利用例

PHP5.4からtraitが利用できるようになる事をご存知の方も多いと思います。

traitはコードの水平再利用を可能にする仕様拡張です。Rubyのmixinのような機能と言えば分り易いかも知れません。

誰でもtraitを利用したくなるようなコードをinternals@php.netのMLで見かけたので紹介しよう、と思って書いたのですがコピペしたコードをしっかり読んでなくておかしな所があった事を @sotarok さんに教えてもらいました。

元のコードは色々問題があるので書き直しました。こうやればアクセサーを沢山書く必要が無くなります。 もっと読む

Bit module for PHP

誕生日のメッセージを送ってくださった皆様ありがとうございました!

今日は誕生日ということで多少は趣味のOSSに時間を割いてもバチは当たらないだろう、という事で簡単なPHPモジュールを書きました。PHP勉強会@東京に参加してPHPerバイナリアンの方の発表に触発された事がこのモジュールを書いた動機です。BitモジュールはバイナリアンPHPerの為のモジュールです。

https://github.com/yohgaki/bit

関数は今のところ4つだけあります。

  • string byte_get(string) – バイナリをHEX文字列に変換
  • string byte_set(string) – HEX文字列をバイナリに変換
  • string bit_get(string) – バイナリを0と1の文字列に変換
  • string bit_set(string) – 0と1の文字列をバイナリに変換

PHPではバイナリを取り扱う事が面倒だったのですがこのモジュールを使えば比較的簡単にバイナリを修正する事ができます。

初めはバイナリを配列にして返そうか、とも思ったのですが効率が悪いので単純に文字列に変換することにしました。こんな機能が欲しい!こう修正して欲しい!という方はご連絡ください。対応できるかも知れません。

ちなみに現状でもPHPスクリプトだけでバイナリを取り扱えるライブラリがあります。

http://openpear.org/package/IO_Bit

さらにZlibバイナリが扱えてしまう物まであります。

http://openpear.org/package/IO_Zlib

そしてSWFファイルを修正できてしまう物も。

http://openpear.org/package/IO_SWF

これらは@yoya さんが書かれたパッケージだそうです。凄すぎです。バイナリを操作する必要がある方はこちらも是非ご利用ください。

RealIP Module for PHP

リバースプロキシの背後にあるPHP用に$_SERVER[‘REMOTE_ADDR’]をX-Real-IPやX-Forwarded-Forヘッダに設定されたIPアドレスに書き換えるRealIPを書きました。

https://github.com/yohgaki/realip

少しGoogleで検索しても見つからなかったので作ったのですが、既にありそうな気がします。

PHPスクリプトで書き換えても良いのですが、アプリをバージョンアップした時に忘れる可能性があります。プロキシ・Webサーバで何とかする方法もありますが、プロキシ・Webサーバの仕様に合わせた設定が必要だったり、と不便な所もありモジュールの方が便利なので書きました。同じ事をするには他の方法がありますが、必要な方はどうぞ。

多分、PHP5.2でもコンパイルできると思います。コンパイル出来なかったら教えてください。

PHP 5.4の文字エンコーディング設定

PHP 5.4 RC1が公開されています。PHP 5.4のリリースが近いです。PHP 5.3の–enable-zend-multibyeの問題でバグレポートをした関係でinternals MLでメールのやり取りをして分った事とその他をまとめておきます。主にSJISを使う場合の注意点です。間違い・勘違いもあるかも知れないので気が付いたらコメントを下さい。

  • PHP 5.4はデフォルトの内部エンコーディングがISO-8859-1になる
  • SJISでコードを書く場合はzend.script_encoding=SJISを書く
  • SJISでコードを書く場合は内部エンコーディングをSJIS(mbstring.internal_encoding=SJIS)に設定する
  • SJISで出力する場合はmbstring.http_output=SJIS (output_handler=mb_output_handlerなどが必要)を設定する
  • SJISでページを書いている場合、SJISが入力になるのでmbstring.http_input=SJISを設定する
  • Zend Multibyteサポートがコンパイルオプションからランタイムオプション(zend.multibyte=On)になる
  • Zend Multibyteサポートにはmbstringが必須
  • mbstringがモジュールとしてビルドされている場合でもZend Multibyteサポートを有効にできる
  • declare(encoding=…)でスクリプト中からスクリプトのエンコーディングが指定できる

php  -c php.ini-development -d zend.multibyte=1 SJIS_script.phpとしてSJISが含まれるスクリプト(例えば、echo “表”)を実行するとSJISの文字が?に変換されてしまいます。正しく処理するには-d mbstring.internal_encoding=UTF-8などを追加し

php  -c php.ini-development -d zend.multibyte=1 -d mbstring.internal_encoding=utf-8 SJIS_script.php

などとしなければなりません。

全般的にマルチバイト文字エンコーディングのサポートが改良されていますが、以前と多少異なる部分があるので注意が必要です。

PHPのSession Adoption脆弱性

PHPのセッションモジュールはセッションアダプションに脆弱なのですが、開発者の理解が得られず何年間も放置されています。

セッションアダプション脆弱性: 未初期化のセッションIDを受け入れてセッションを確立する脆弱性。

PHPのセッションIDはデフォルトでドメイン指定無し、パスは/に設定されています。専用サイトならこれであまり困ることは無いのですが、複数のアプリケーションやユーザが利用するようなサイトでは問題になります。

例えば、Chromeはパスよりドメインが優先されるのでドメインを利用したセッションIDの固定化などが起きます。IEではドメインよりパスが優先されるのでパスを利用したセッションIDの固定化などが起きます。

session_regenerate_id()を使えばOK、と考えている人も多いようですが既に設定済みのクッキーのうちどれが優先されてしまうか?が問題であるためsession_regenerate_id()を利用してもセッションIDは変わりません。優先されないクッキーを設定しても意味がないからです。

対策としては、すべてのドメイン、パスのセッションIDと同じクッキー名のクッキーを削除(空のクッキーを設定すると削除)する事ですがあまり多くの人がやっているとは思えません。根本的な解決策は「厳格なセッション管理」を行うことです。未初期化のセッションIDは受け入れないようにすれば完璧です。

セッションIDの固定化が可能な状況では、セッションアダプションに脆弱な場合はセッションを盗まれますが、厳格なセッション管理ならセッションIDを毎回振り直そうとする事になり、セッションは盗まれません。つまり、セッションが盗まれる代わりに「ログインできない」というDoS攻撃になります。セッションを盗まれるより、DoSの方が比べる必要がないくらいマシです。「ログインできない!」というユーザが居たら「ブラウザのクッキーを削除してください」と対応すれば良いだけです。

数年前にそろそろ直したら?とsecurity@php.netにメールしたのですが、開発者の問題だと勘違いしていて修正されませんでした。今日、またphp-internal@list.php.net internals@lists.php.net に再度メールをしておきました。さて、今回はどうなることでしょう?

PROVE for PHP Ver 1.0

まだまだ完成度を高める必要がありますが、PHPのリグレッションテストツールのPROVE for PHPのダウンロードを開始しました。

http://www.provephp.com/

PHPのテストスイートの設定を忘れていてPDOオブジェクトのサポートできてない事に直前に気がついたのでPDOには対応していません。これは出来るだけ早急に対応します。

Dokuwikiなどでは普通に使えます。VMwareイメージも用意しているので試してみてください。

非常用の個人利用は無料です。商用利用はご購入ください。開発に役立ちます!

PROVE for PHP 0.4.0-dev リリース

PROVE for PHP 0.4.0をリリースしました。

  • IOをプラグイン化(将来PostgreSQLなどに対応)
  • prove_seek_function_call()を追加
  • ハードリンクによるコピーに対応(高速化)
  • prove_rename_function()の無効化(PHP 5.3のZend Engineの仕様変更により関数名変更はメモリエラーが発生するため)
  • ログフォーマットを更新。バージョン情報を追加。

もともとIO部分はプラグイン化するつもりだったのですが、ファイルに最適化し過ぎていた部分があったため大幅にリファクタリングしました。機能追加よりも今後の機能拡張を容易にするための変更がメインです。内部構造をかなり変更したのでバグが残っているかも知れません。もし見つけたら教えて頂けると助かります。