テンプレート変数インジェクション
- 2009年1月18日(日) 10:08 JST
- 投稿者: mystral-kk
- 表示回数 5,233
Geeklogを全ての人の手に!
2024年12月 9日(月) 13:09 JST
少し時間ができたので、Geeklog-1.5.x用のPrecheck(インストール前診断)を試作してみた。db-config.phpの位置をビジュアルに探す機能とデータベースの接続をリアルタイムでチェックする機能付き。JavaScript(というか、DOM)の挙動の違いに戸惑った。Firefoxではエラーコンソール(+ Firebug)が克明にエラー原因教えてくれるので楽勝だが、IE7ではDeveloper Toolbarを入れていてもあまり役に立たない。ベースになるAjaxのライブラリは最低限の機能を備えた軽量のものをということで、SitePointのcore.jsを使用した。興味のある方は、こちらからダウンロードしてほしい。
PS. なお、使用後は必ず、admin/installディレクトリごと削除すること。放置しておくと、サーバのファイルツリーがある程度見えてしまう危険性がある。
ユーザの方から「RSS_Aggregatorでフィードのdescriptionを表示できないか?」というお問い合せがあった。何せ1年半ほど前に作ったスクリプトなので、覚えていない。アーカイブを引っ張り出してみると、わずかなコードの追加で実現できそうなことが分かったので、さっさと仕上げてアップロードした。ユーザの方からのフィードバック、リクエスト(あまり過大なものは困るが(^^;))こそがフリーソフトウェア作者を動かす力なのだと思う。
本家サイトの掲示板で問題になっているが、Geeklog-1.5.0-1.5.1になって、アンケート(polls)プラグインで削除・編集ができない場合が出てきている。Dirkさんの記事によると、PHPのセキュリティを高めるためのSuhosinパッチで、一度にPOSTできるフォーム変数の数の初期値が200に制限されているため、この数を超えた大きなアンケートを作ると問題の現象が発生するとのこと。対策としては、
目安としては、質問を10個、選択肢もそれぞれ10個ずつ作ると、フォーム変数の合計が300を越えるので、アウト。質問を5個、選択肢を8個ずつにすると、フォーム変数の合計は150個なのでセーフ。
静的ページ(staticpages)で多数のフォーム変数を持つフォームを作成する場合も同様の現象が発生しそうだ。
Geeklog-1.5.1のpollsプラグインで新規アンケートを保存する際に既存のIDを指定すると、黙って上書きされるというバグを本家のバグトラッカーに登録したところ、「Mercurialのリポジトリでは修正されているはずなので確認してくれ」という返事が来た。TortoiseHGでpullして確認したところ、実際このバグは修正されていた。
ここまではどうということのない話なのだが、じつはリポジトリの開発版をインストールする際に、"Undefined function curl_init" というこれまで見たことのないエラーが出た。コードを調べてみると、public_html/admin/lib-install.php の545-554行目で、指定されたURIが実際存在するかチェックするのにcURL関数を使用していた。
Geeklogの次のバージョン(1.5.2?)では、必要とされるPHPの最低バージョンを現行の4.1.0から引き上げる(予想では、4.3.xくらい。4.x系列切り捨てはしばらくなさそう)ことが話題に上っている。これに加えてcURLエクステンションが必要となると、また敷居が高くなる。正式版では、PEARのHTTP_Requestなどで代用されることを望む。
前々回と同じ環境で(config.class.phpのキャッシュ機能あり)、CTL(Caching Template Library)あり・なしで違いを測定してみた。時間の単位はms(ミリ秒)。結果は以下の通り。
CTLなし | CTLあり | |||
---|---|---|---|---|
平均実行時間(ms) | 平均比率(%) | 項目 | 平均実行時間(ms) | 平均比率(%) |
9.8 | 9.6 | index.php自体の読み込み | 16.2 | 13.6 |
30.4 | 29.8 | lib-common.phpインクルード | 30.2 | 25.4 |
28.4 | 27.8 | COM_siteFooter() | 34.4 | 29.0 |
20.2 | 19.8 | COM_siteHeader() | 21.6 | 18.2 |
7.8 | 7.7 | STORY_renderArticle() | 10.2 | 8.6 |
2.8 | 2.7 | lib-story.phpインクルード | 3.0 | 2.5 |
102.0 | 全体 | 118.8 |
意外な感じがするが、自分が使用している環境ではCTLの恩恵を感じられず、むしろほんのわずかだがスピードダウンする。CTLとは違う方法で、テンプレートライブラリをハックする方法を考えてみようか。
前回と同じ環境(config.class.phpのキャッシュなし)で、public_html/index.phpにアクセスしたときに、lib-common.phpインクルードにかかる時間の内訳(5回の平均値)。時間の単位はms(ミリ秒)。0.2ms以下のものは適当に省いている。
項目 | 実行時間 | 比率 |
---|---|---|
lib-common.php自体の読み込み | 19.4 | 49.0% |
config->initConfig() | 9.4 | 23.7% |
config->load_baseconfig() | 3.1 | 7.9% |
lib-syndication.phpインクルード | 1.5 | 3.8% |
staticpages::functions.incインクルード | 1.3 | 3.3% |
links:functions.incインクルード | 0.8 | 2.1% |
lib-plugins.phpインクルード | 0.7 | 1.7% |
japanaese_utf-8.phpインクルード | 0.6 | 1.4% |
polls::functions.incインクルード | 0.5 | 1.2% |
smapx::functions.incインクルード | 0.4 | 1.1% |
calendar::functions.incインクルード | 0.3 | 0.9% |
SEC_getUserGroups() | 0.2 | 0.6% |
合計 | 39.6 |
意外な感じがするのは、プラグインのfunctions.incをインクルードする時間が長いこと。同梱されている標準の5つのプラグインだけでも3.3ms(全体の8.7%)かかっている。
ついでに、public_html/index.php自体も計測してみた。
Geeklog-1.5.0からは$_CONF変数がデータベースに格納されるようになったが、その実装方法があまりきれいではないので、速度低下を招くのではないかと思い、ひろろんさんやdengenさんと共にごく簡単なキャッシュを実装していた。大ざっぱに言うと10%程度のスピードアップになりそう。
そのとき話題になったのがlib-common.phpのダイエット。このファイルはGeeklogの基本機能を実装し、必要なライブラリをインクルードしているが、1.5.1で200KBほどある。このlib-common.phpの中でも比較的使用されていないコードやインクルードファイルがあれば、使用時にインクルードすることで、サイズを減らせる。
きちんと性能測定したいなあと思ってXdebug関連を探していたら、[PHPプロファイリング: Xdebug(Xdebug2) + WinCacheGrind]というページを見つけた。早速このページの情報を元に、
[Zend] zend_extension_ts = "C:\PHP\ext\php_xdebug-2.0.3-5.2.5.dll" xdebug.profiler_enable = 1 xdebug.profiler_output_name = cachegrind.out.profile xdebug.profiler_output_dir = "C:/temp/xdebug" xdebug.auto_trace = On
Geeklog-1.5.1のトップページにアクセスすると、lib-common.php処理にかかる時間は以下のようになった。