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と同じ
うーん、これでいいのか?
セキュリティは難しいなぁ