TryIT! - とりあえず、おもいついたらやってみる!

OneThird CMSのテンプレート機能を改良してみた

OneThird CMSのテンプレートはphpのヒアドキュメントを使っています

このヒアドキュメントを使っているというのが、OneThirdの肝になっていまして

ヒアドキュメント中だと{$ut->link(0)}のように、クラス化したメソッドは埋め込めてしまうという特性を使ったわけです


もちろん$paramsの様に通常の変数も展開できます

なぜ、普通のCMSの様に独自にテンプレートを展開しなかったのかというと

テンプレートの書式が独自になることを避けたかったのが一番の理由です

phpのコマンドをかなり自由に使えるのはわかりやすくて使いやすい


しかも高速に動作する

その上、execやsystem等の関数は直接ヒアドキュメントから呼ぶことができない

OneThirdのいたるところで、このテンプレート展開を行えるようになっています

(ちなみに{$....}以外の書式は保存時にエスケープされて受け付けなくなっています)


これにより、文章へのリンクの埋め込みの簡単、テンプレートファイルと同じ書式が文章でも使える等など、使いやすい使用に仕上がりました

セキュリティと利便性を両立させた、まさに完璧のはずでした


が、悲しいかな一人で開発していると盲点というものがあります

例えば、$ut->linkコマンド

これの引数にページナンバーを入れるとエイリアス考慮した上でフルパスに展開されるのですが、

以下のような書式で書くとシステムコマンドを実行できてしまいます

{$ut->link(exec('whoiam'))}

むうう、盲点でした

いや、お馬鹿ですなぁ (ま、大抵世の中のバグというものはわかってしまうと大抵お馬鹿なものですがね)


まあ絶対ダメだとは言いません

しかし、良くもない


なぜか?それはDBの内容を書き換えられてしまった場合、システムコマンドを実行することができてしまうからです

そう、OneThirdが攻撃のための踏み台にされてしまう

まあ、既にシステムに潜入された後の話なので、絶対ダメだとは言いません

だって、テンプレートを書き換えられたら、多くのCMSが同じことになりますし、プログラムを書き換えられたらどんなCMSも同じことです

しかし、一般的に

DBの書き換え→テンプレートの書き換え→プログラムの書き換え

という順番で攻撃しやすくなります

そういうわけであまりよろしくないわけです


そこで対策

array,date,time以外のステートメントや関数は全て実行できなくしました

ページエラーが発生します

しかし、全部禁止すると使い勝手が悪くなるんだよなぁ

今、使えるコマンドは、 

独自コマンド: 

str(a,b,...)=文字列結合 

check($a,$b,$c)=$aが真なら$b, 偽なら$c 

phpコマンド: date:dateと同じ 

time:timeと同じ 

substr:mb_substrと同じ 

replace:mb_ereg_replaceと同じ 

ステートメント: array():arrayと同じ

うーん、これでいいのか?


セキュリティは難しいなぁ


« Facebookのいいねを分析するアプリ…javascript製、WYSIWYGエ… »
2013/08/28