タグ: PHP

自分で作るblogツール

Zend Frameworkの参考URLの一つになっている方の著書です。

自分で作るblogツール

著者のブログ個人サイト(?)やOSS公開サイトを見て「この人すごいなぁ」と思っていたら「自分で作るblogツール」と言う本を執筆されているではないでか。早速Amazonで1-Clickしてしまいました。

Amazonのコメントには知り合いのコメントもありますね。細かい事は気にしないので、どのような内容か楽しみです。

ところでWEBXP(Web eXtream Programmingの略かな?)フレームワークのダウンロードはどこからするのだろう?

Zend Frameworkの参考URL

とりあえず簡単に検索してみた結果です。リリース情報のページばほとんどで中身のあるページはまだあまり無いですね。お勧めがあったら教えてください。

英語
http://framework.zend.com/ (本家)
http://framework.zend.com/manual/en/ (英語マニュアル)
http://framework.zend.com/download/subversion (レポジトリへのアクセス)
http://www.phparch.com/zftut/index.php?p=0  (チュートリアル)

日本語
http://tdiary.ishinao.net/?year=2006;month=03;category=Zend+Framework  (使用感など。参考になる)
http://framework.zend.com/manual/ja/index.html  (日本語マニュアル)

日本語のチュートリアル的な物は無いのですね。マニュアルとソースを読めば大方使い方は分かりますからね。

http://tdiary.ishinao.net/ にも書いてありますが、private->protectedの変更は必要ですね。

http://tdiary.ishinao.net/20060329.html#p03 も参考になります。私はまだ「Zend_Frameworkを使ったことがある」とは言えないのでコメントできませんが、下記の感想はマニュアルとソースを読んだ限りでは同じ印象を持ちました。

もちろん動くものを作るだけならなんとかなるんだけど、Zend Frameworkベースのアプリケーションとして、ある程度の将来互換性も確保できるように作ろう、とか思うと現時点の完成度ではまだ無理だ*1。

一応Controller周りは結構完成度が高そうなんで、そこだけならばいけそうではある。かなりフィックスした仕様に見えるし、たとえデフォルトでの挙動が変更されたとしても、現状の拡張性の枠組みの中でカバーできるであろう柔軟性を備えている。プラグインの機構も応用範囲が広そうだ。

Viewに関しては、現状が最終仕様とはとても思えないんで、おそらくまだまだ互換性のない仕様変更があるだろう。っつーか、現在の Zend_Viewを使うくらいだったら、もっとこなれた他のテンプレートエンジン(Smartyとか)を使った方が、現時点ではずっとましだろう。

Zend_Logは、ログの保存がstaticメソッドに集約されたという設計はいいんだけど、デフォルトでCompositeじゃないのが使いにくい。自前のComposite Adapterとかを使ってカバーするという手もあるけど、その辺には仕様変更もありそうだし、現時点ではまだPEAR Logを使っておいた方がましかもしれない。

Zend_Db周りは非常にビミョー。Zend_Db_Adapterはあれで十分なんで、そのままいけるかなーと思いつつも、O/Rマッパー系は現状では実用レベルじゃないよなー。1テーブル単位のselectしかサポートしないO/Rマッパーで完結できるような設計なんて現実的じゃないし、ちょっとでもjoinしたければとたんにO/Rマッパーはつかえなくなっちゃうし。

拡張性と柔軟性重視なので無くても当たり前なのかもしれませんが、コード生成もしてくれたらうれしいのですけどね。

PHPを5.1.3RC3相当にバージョンアップ

最近このサーバのPHPをPHP 5.1.3RC1相当バージョンアップしていたのですが、バージョンアップ前のPHP 5.0.5(+パッチ多数)と比べると明らかにApacheがクラッシュする回数が増えていました。とりあえずPHP5.1.3RC3相当にバージョンアップしました。NEWSファイルを見ると分かりますがRC1->RC3だけでもかなりの変更・修正があります。クラッシュがどの程度直っているかな…

inconsistent types deduced for parameter

久々にPostgreSQLの話です。プリペアードクエリのprepare文のエラーで次のようなエラーに出くわす事があります。

ERROR: inconsistent types deduced for parameter $8 DETAIL: timestamp without time zone versus text

パラーメタの番号は振り直している、と思い込んでいたのでこのエラーメッセージを見ても何故だろう状態なり、しばらく悩んでしまいました。ググってみても役に立ちそうなページが一つも無かったので書いておきます。

create table test (
t text,
i int
);

のテーブルの場合に

pg_prepare(‘testplan’, ‘select * from test where t = $1 and i = $1;’);

等とすると(pg_prepqreはPHP 5.1の関数)

ERROR: inconsistent types deduced for parameter

エラーが発生する、はずだったのですがこの例の場合はPostgreSQL 8.0.7で試してみてもエラーが発生しませんでした。自動的にキャストしてしまうのかな?調べてません。

とにかくこのエラーはプリペアードクエリの同じパラメータが互換性のコラムに利用された場合に発生するエラーです。

エラーメッセージが読んで字の如しなので有用なページが無いのでしょうね。

Zend Framework 0.1.2リリース

3/8にZend Framework 0.1.2リリースされています。

解凍すると10MBくらいになります。ドキュメント、テストコードなども含まれているのでフレームワーク本体は2MBくらいのようです。さっと見た程度ですがよく出来ていそうな感じです。PHP5以上が必要です。多分PHP5.1でないと動作しないように思えます。(確かめていません)

http://devzone.zend.com/

はZend Frameworkで作られているそうです。

PHPのStrictセッション

Strictセッション管理パッチのダウンロード数がやっと?100を超えました。

PHP5用のパッチなのが一番の問題なのでしょうか?非常にダウンロード数が少ないように思えます。私はこのパッチはセキュリティ上かなり重要なパッチだと思っています。

PHP4のパッチが必要なのかな? 枡形さんが作ってましたっけ?

関連:
http://blog.ohgaki.net/index.php/yohgaki/2006/02/02/strict_sessioncric_a_a_a
http://blog.ohgaki.net/index.php/yohgaki/2006/02/05/phpa_rsession_fixationa_ei
http://blog.ohgaki.net/index.php/yohgaki/2006/02/27/a_ma_sa_sa_ma_ca_a_ma_a_sa_f

このアドバイザリ、ちょっと待った

これはコードブログに書こうと思ったらTypePadのパスワードが分からなくなっていました。ブラウザに記憶させたはずなんですけどね…. とにかく以下のSECUNIAアドバイザリは(今度こそ)本当に間違っています。
# 前にCVSの更新が異常だったため勘違いしていた件がありました。
# 今度はSECUNIAが勘違いする番ですね。

TITLE:
PHP “mb_send_mail()” and IMAP Functions Security Bypass

SECUNIA ADVISORY ID:
SA18694

VERIFY ADVISORY:
http://secunia.com/advisories/18694/

CRITICAL:
Less critical

IMPACT:
Security Bypass

*省略*

SOLUTION:
Do not compile PHP to enable support of the mbstring or imap
functions if they are not required.

PROVIDED AND/OR DISCOVERED BY:
Cdric Clerget

詳しいPoCはリンク先のアドバイザリを参照していただくとして、mb_send_mailとmailの第五引数(sendmailコマンドへの追加の引数)は内部関数php_escape_shell_cmdでエスケープされています。

PoCでは普通の引数を渡しているのでphp_escape_shell_cmd関数でエスケープしても、当然ですが、そのままsendmail関数のオプションになります。

つまり、mb_send_mailだけでなくmailでもまったく同じ現象(現象です。これは問題ではありません)が発生します。コマンドの実行に注意をはらうのと同じでmail/mb_send_mail関数の第五引数の指定にも注意が必要です。

オリジナルのアドバイザリはBugTraqにあます。safe_mode/open_basedir設定のバイパスが可能なことがセキュリティ上の問題だ、としていますがsafe_mode/open_basedirはfail safe (フェイルセーフ)の為の機能です。つまり、プログラムのバグがあっても意図しないファイルへのアクセスリスクを低減させるための仕組みであって、悪意を持ったプログラマからシステムを保護する機能ではありません。

CRITICAL:
Less critical

IMPACT:
Security Bypass

となっているので気にする人はいないと思いますが、対策が以下のように書いてあります。

SOLUTION:
Do not compile PHP to enable support of the mbstring or imap
functions if they are not required.

Secuniaは何を言いたいのでしょうね?

mail関数はconfigureスクリプト実行時にsendmailバイナリを見つけられないと組み込まれません。多分、mail関数も組み込むな、とアドバイザリがでるのでしょう。

別に気にする必要はないアドバイザリですが、この対策は非常にいただけません。
百歩譲っても「disable_functionに指定する」くらいが妥当なのではないでしょうか?

追記:
SECUNIAのアドバイザリは

1) The PHP “mb_send_mail()” function allows additional parameters to be passed to sendmail via the “additional_parameter” parameter. This can be exploited to cause sendmail to read arbitrary files on the system as configuration file and saving the resulting log file to arbitrary writable directories. The saved log file may contain portions of the file that was read as configuration file.

Example:
$additional_param = “-C “.$file_to_read.” -X “.getcwd().”/”.$output_file;
mb_send_mail($email_address, NULL, NULL, NULL, $additional_param);

Successful exploitation allows the bypassing of certain “safe_mode” and “open_basedir” restrictions.

The vulnerability has been confirmed in version 5.1.2 and also reported in version 4.x. Other versions may also be affected.

と書いてあるのですが、safe_modeのバイパスだ、と書いていません。
オリジナルのアドバイザリを良く読むと、safe_modeの時だけ問題がある、旨で書かれています。ソースを確認してみるとmb_send_mailの方はsafe_modeのときに5番目の引数があっても受け付けるようになっていました。
# これは修正をCVSにコミットしました。久しぶりに。

mail/mb_send_mailの両方open_basedir設定はバイパスできるのですが、SECUNIAのアドバイザリではsafe_mode, open_basedirのどっちの事を言っているか分かりませんね。open_basedirがバイパスできることも問題らしいので「mail関数は組み込むな」とアドバイザリを作る(?)のでしょうね。

繰り返しになりますが、SECUNIAのアドバイザリでは対策として

SOLUTION:
Do not compile PHP to enable support of the mbstring or imap
functions if they are not required.

と書いていますがimapもmbstringも普通に使っていれば安全に使えます。

PHP_SELFはそのまま出力できない

追記:現在のPHPでは$_SERVER[‘PHP_SELF’]はクエリ文字列(?以降のクエリパラメータ)を含みません。しかし、index.php/<script>alert(1)</script>/aaa/bbb とすることは可能です。PHP_SELFと同様の変数は以下です。

  • $_SERVER[‘PATH_INFO’]
  • $_SERVER[‘PATH_TRANSLATED’]

 

時々見かけるのでブログでも問題を指摘します。

PHPの$_SERVER配列に入っているPHP_SELF要素はPATHINFOも含めてしまうため、そのまま出力するとXSSに脆弱になる場合があります。

phpinfo()がXSSに脆弱だ、と指摘する人がいるので(元々phpinfo()の出力は管理者・開発者のみ参照できるようにしておくべきですが..)現在のPHPはPHP_SELF内の< > を検出して

<script> </script>

等と書けないようになっています。しかし、この対策はphpinfo()の事しか考えていないので

<?php
echo '<a href="'. $_SERVER['PHP_SELF'] .'">aaa</a>';
?>

の様なケースの場合、

http://example.com/xss.php/%22%20onMouseOver=%22javascript:alert(‘xss’);

等としてJavaScriptの挿入が可能になります。

SCRIPT_NAMEにはPATH情報が無いのでこの問題は発生しません。PHP_SELFでは無くSCRIPT_NAMEを使用すべき所をPHP_SELFを利用しているケースは時々見かけます。

注意が必要かもしれませんね。

UNIX系OSならPHPのソースがあるディレクトリに移動して

find . -name “*.php” | xargs grep -n “PHP_SELF”

等として怪しいPHP_SELFの出力が無いか確認すると良いかも?!

PHP 5.1でregister_globals=onには注意

5.1.0で直されていたはずなんですけど。記憶が確かなら。

え?という感じなのですがPHP 5.1.1, PHP 5.1.2にはシステムが初期化する配列にGLOBALSをチェックするコードを入れてなかったようです。自分では試してないですが簡単にチェックできるのでこのアドバイザリが間違っていることはないでしょう。

addslashesによるエスケープ処理は止めましょう

追記:PHPエスケープ関連の検索でこのエントリを参照されたと思います。PHPでのエスケープ全般については以下のエントリを参照してください。

PHP文字列のエスケープ

セキュリティmemoにaddslashesよるエスケープ処理でSQLインジェクションが可能なるという記事を見つけました。

私のセミナーを聞いたことがある方は「addslashesによるエスケープ処理は止めましょう」と言っていた事を覚えているでしょうか? mysql_real_escape_string()やpg_escape_string()等のデータベース専用のエスケープ関数を使いましょう、とも話しています。

ちなみにSQLiteを使っている場合はaddslashesでエスケープ処理はNGです。もっと根本的に間違っています。SQLiteではMS SQL Server, Sybaseと同様「’」は「”」とシングルクオートでエスケープします。

基本には忠実に :)

追記:
サーバとクライアントのエンコーディングが合っていないと問題が発生します。PostgreSQLの場合、SET文でクライアントエンコーディングを変えるのではなくpg_set_client_encoding()を利用してエンコーディングを変えないとならないです。MySQLでも同様にアプリからSET NAMESでエンコーディングを変えるのはNGです。

addslashesでエスケープして良い物はPHPスクリプトとなる文字列型データです。

Zend Japanの無料セミナー

来週にZendの無料セミナーがあるようです。
17日の金曜日には福岡であるようです。

・Zend Studio 5.1 による開発技法
・Zend Studio Enterprise によるデバックとチューニング

17日と言えばPostgreSQLカンファレンス2006がある(私も講師の一人)ので東京にはいます。もうほとんど目一杯らしいですがPostgreSQLのカンファレンスも今なら間に合う(?)かも?

Strict Session管理パッチ

PHPのセッションID管理がいまひとつであることは

http://blog.ohgaki.net/index.php/yohgaki/2005/12/24/strict_sessioncric

にも書きました。PHP 5.1.2用のパッチですがsqliteと一緒にコンパイルするとsqlite用のvalidationパッチが含まれていないのでビルドできませんでした。

MomongaLinux用にsqliteも一緒にビルドできるパッチを作成したのでWikiに載せました。もちろんSQLiteをセッションID管理に使用しても厳格なセッションID管理になります。必要な方は是非どうぞ。

http://wiki.ohgaki.net/index.php?PHP%2Fpatch%2FStrictSession

追記:
厳格なセッションID管理を行うパッチを適用したPHPをインストールした後、php.iniに

session.use_strict_mode = 1

を追加してください。これを追加しないと厳格なセッションID管理になりません。

allow_url_includeオプションの追加

CVS HEADでは昨年11月にallow_url_includeオプションが追加されています。allow_url_fopenからinclude/require文の設定を分離するオプションです。

このオプションを付けると万が一、

$dir = $_GET[‘dir’];
…..
…..
include($dir.$file);

の様なコードがあってもhttp://, ftp:// は使えなくなります。(SSL/TLSも)ただしphp://inputは使えます。ですから今ひとつなパッチですが無いよりましです。

私がPHP 5.1.2用にバックポート(ほとんどオリジナルと同じですが)はこちらです。
http://wiki.ohgaki.net/index.php?PHP%2Fpatch%2Fallow_url_include

PHP 4.4.2リリース

PHP 4.4.2がリリースされました。

* Prevent header injection by limiting each header to a single line.
* Possible XSS inside error reporting functionality.
* Missing safe_mode/open_basedir checks into cURL extension.
* Apache 2 regression with sub-request handling on non-Linux systems.
* key() and current() regression related to references.

全部だったか覚えていませんが廣川さんがコミットしたmbstringモジュールの修正も含まれているはずです。