自分のための次世代CMS製作メモ

Jeans & Development 電子ブロック工房 三日坊主 フロントページ

カテゴリーとタグの実装 [General]

2008年7月22日

Twitterでのカテゴリーとタグに関する議論からひぐちさんが導き出された結論が非常に明快で、まさに目から鱗状態。Jeansの仕様を考える上で、NucleusのMultipleCategoryをJeansのコアで実装することばかりに考えが行っており、頭が凝り固まっていたようだ。

そもそも、カテゴリー分けという概念では、multipleの状態は少々おかしいというか、過大解釈の面があるのかもしれない。1アイテム←→1カテゴリーが、基本的な考え方。multipleに指定したいときは、タグを使うと考えたほうが、スッキリする。

itemをevalするのはまずいかも [Security]

2008年6月25日

久々の更新。

先日、とあるPHPの本を読んで知ったのだが、HTMLへのPHPコードの挿入は、<?php ... ?>以外に、<script language="php">...</script>でもできる。PHP5でもこれを確認した(PHP6ではどうだか知らない)。

現在のバージョンでは、それぞれのアイテムのパースにもevalを使っている。admin以外でのPHPコードの実行を回避するために、『<?』を『&lt;?』に変換しているが、これだけでは穴があるということになる。

セキュリティメモ [Security]

2008年5月14日

現在、Jeansの開発はすこしお休み中。気分転換にoyagameを作っていて、そちらが出来ればまたJeansに戻る予定。Jeansの開発を続けていて、これは今までやって来たプログラミングの中で、最も大変なプロジェクトだと気がついた。あせらず、ゆっくりやりたい。

さて、Jeansの骨格部分はあらかた仕上がっているので、ここでもう一度セキュリティーをチェックするため、『PHPサイバーテロの技法』を読んで、問題(になるかも知れない)部分をピックアップしてみた。

httpOnly [Security]

2008年4月17日

ほぼ一ヶ月ぶりの更新。現在、デフォルトスキンを表示させるスキン変数周りの整備中。インデックスページは、コメント機能以外は表示できるようになった。

さて、webサーフィンしていて見つけたセキュリティー情報のメモ。

httpOnlyをFirefoxで
PHP 5.2でクッキーのhttpOnlyフラグがサポートされるみたいです

XSSによるクッキー情報漏えいの防止策の一つとして。あとで、Jeansにも導入する。

コンパイルされたコードのテスト [General]

2008年3月24日

Jeans CMSが実際どれくらいの速さなのかを調べるために、xml-rss2.phpを手動でコンパイルしてみた。

コンパイルといっても簡単なもので、デバッグフラグを立てたときに/debug/ディレクトリに生成されるコードと、クラス定義のためのphpファイルのコードを一つのphpファイルにするだけである。

この『フルコンパイルされた』xml-rss2.phpの実行に要する時間を手元の環境(Win Vista)で測定すると、およそ19ミリ秒。一方で、Nucleus 3.31 SP1 でxml-rss2.phpを同じ環境で表示すると、およそ360ミリ秒。Jeans CMSのほうがおよそ20倍速いことが分かった。まずまずの結果。

ちなみに、xml-rss2.phpをコンパイルせずに表示させると、およそ39ミリ秒。やはり、コンパイルしたほうが速くなる。

<%media(20080325-xml-rss2-compiled.zip|コンパイルされたxml-rss2.phpはここからダウンロードできます。)%>

ver 0.2.0 公開 [General]

2008年3月13日

コアがほぼ完成したので、バックアップを取る意味もかねて、公開。現在、ver 0.2.0。αのさらにαのような物だけれど、とりあえずRSSフィードを出力することを確認。

今後の開発ロードマップは次のとおり。

1)デフォルトスキンを問題なく表示できるように、スキン変数・テンプレート変数まわりのコードをチェック。
2)コメント周りのコードの実装。
3)プラグインインターフェースを整備。プラグインオプションとか、イベントとか。
4)管理画面用スキンの製作。および、管理アクション用のコードの実装。

うーん、長い道のりだ。

<%media(20080314-jeans 0.2.0.1.6.zip|ver 0.2.0はここからダウンロードできます。)%>

・αバージョンで、実用性はゼロです。
・セキュリティーチェックを行っていないので、ローカルの環境にのみインストールしてください。インストールは、ZIPファイルを解凍するだけです。
・登録してあるユーザのユーザ名は『admin』パスワードは『admin』です。logintest.php経由でアクセスすると、自動的にログインされます。
・RSSフィードは、xml-rss2.phpにアクセスすると表示できます。
・スキンは/skins/フォルダに、テンプレートはスキンフォルダ内のtemplate_xxx.incに保存されています。
・ここはこんな風にしたら良いとか、ご意見ありましたら、よろしくお願いします。

テンプレートをファイルとして保存 [General]

2008年3月11日

現在のところ、スキンデータはすべてskins/ディレクトリにファイルとして保存され、テンプレートデータはすべてjeans_templateテーブルとしてデータベースに保存されている。少し分かりにくい。

スキンとテンプレートをフルコンパイルした場合には、どちらもグローバル関数としてPHPファイルに記述する予定である。従って、コンパイルする前のスキンやテンプレートはどこに記述されていても良いし、それらを呼び出す際の速度の問題などもそれほど考える必要も無い。ならば、これらを記述する方法としては、分かりやすさと編集の容易さがポイントとなる。

コードのクラスへの振り分けを少し整理 [General]

2008年3月5日

現在のJeansのアーキテクチャは次のとおり。

現在の構造

見てのとおり、少し複雑である。制御があちらこちらに飛んでしまっているように感じる。もう少し分かりやすくしたい。

まず、index.phpからの制御がcoreとskinに向いているが、これらはそれぞれ、Nucleusのglobalfunctions.phpのインクルードとselector()の実行に相当する。Jeansでは管理画面もスキンを通じてアクセスする予定なので、skinは実際にはほとんどの場合に使われることになる(例外は、アクションの呼び出し)。次にsqlクラスだが、これはcoreクラスの初期化の際に必ず呼び出される。

そこで、skinクラスとsqlクラスの機能をcoreに統合することにする。skinクラスのメソッドはcoreクラスにそのまま取り込み、sqlクラスはそのままの形でcore.phpファイル内に記述する。skinクラス相当分のコードのパースはアクションの呼び出し(actionクラスを利用)の際に少々無駄になるが、50行ほどの簡単なコードだから、パフォーマンスへの影響は少ない。

この変更を施すと、アーキテクチャは次のようになる。

変更後の構造

これなら、分かりやすい。すべての制御がcoreから始まり、それをjitとactionの二つのクラスがサポートすることが一目瞭然。

PDOへの移行はほぼ終了 [General]

2008年3月1日

アンケートの結果に従ってPDOを利用することにし、sqlクラスを全面的に書き換えた。次の例のように使うことになる。

$res=sql::query('SELECT * FROM jeans_item WHERE icat=<%catid%>',array('catid'=>$catid));
while ($row=$res->fetch()) core::p($row['ititle']);
もしくは
$res=sql::prepare('SELECT * FROM jeans_item WHERE icat= :catid');
$res->bindParam(':catid',$catid);
$res->execute();
while ($row=$res->fetch()) core::p($row['ititle']);
もしくは
$res=sql::prepare('SELECT * FROM jeans_item WHERE icat= :catid');
$res->execute(array(':catid'=>$catid));
while ($row=$res->fetch()) core::p($row['ititle']);

これで、規約に沿ってコアやプラグインを書いている限り、SQLインジェクションはほぼ100%起こらない。

アンケートにご協力お願いします [General]

2008年2月18日

RSSフィードで購読なさっている方へ:アンケートにご協力お願いできますでしょうか。

Jeans CMSにおいては、いくらか規約を設けることでセキュリティーを確保する予定です。ただ、規約があまりにも複雑で敷居が高すぎる場合、その規約が守られないことになってしまいます。過ぎたるは及ばざるが如しにならないように、うまく規約を設定する必要があります。

SQLインジェクションを防ぐため、SQLクエリー実行部分のスクリプトの記述に関して規約を作る必要があるのですが、ここでプリペアードステートメントを使用することを規約とするかどうか、悩んでいます。

例えば、次のスクリプトは、現在のNucleusで使われている様式です。

コード0:現在のNucleus様式
$res=mysql_query(
    'SELECT i.itime as itime, c.cblog as blogid, substr(i.itime,0,4) as year, substr(i.itime,5,2) as month, substr(i.itime,8,2) as day, '.
    'FROM jeans_item as i, jeans_category as c '.
    'WHERE i.icat=c.catid AND c.cblog='.intval($blogid).' '.
    ' AND c.catid='.intval($catid).' '.
    'ORDER BY i.itime DESC LIMIT '.intval($limit));
<<前の記事   後の記事>>