【BaserCMS】テーマファイルを安全に配置する方法

BaserCMS関連のTips続編です。

とにかく導入が楽でお手軽に使える事を目指しているBaserCMSですが、一つだけ個人的に良くないかなーと思う点があります。「テーマ機能」を用いて簡単にデザインを変えられる機能がありますが、ビューファイル(*.ctp)もドキュメントルート内に置く仕様になっているため、ctpファイル単体が閲覧できてしまう問題があります。

例えばTopページのビューは、インストール直後は「/themed/demo/pages/index.ctp」にあります。なので「http://www.example.com/themed/demo/pages/index.ctp」とすると次のように見えてしまいます。

PHPの関数コールが分かってしまう

ソースコードが丸わかり。ビューにコードをいろいろ書いてしまうと危険!

これはあまり気持ちの良い事ではないので、ビューファイルだけは見えないところに移動してみましょう。
テーマファイルは「app/webroot/themed/」以外に「app/views/themed/」内においても動作をします。そこで次の対処を行います。

  1. 「app/views/」内に「themed」ディレクトリを作成する
  2. さらに、対処したいテーマ名のディレクトリを「themed」内に作成する。今回は「app/views/themed/demo/」となる
  3. 「app/webroot/themed/demo」内にある「elements」「feed」「leyouts」「pages」を「app/views/themed/demo/」内に移動する

なお、これが可能なのは「webrootをドキュメントルートとしている」場合のみです。ドキュメントルート内にBaserCMS本体を置いて運用されている方は対処する事が出来ません。(2011.01.26追記:「スマートURL」設定であれば、どのようなインストール方法でも上記は有効です)
また、上記対処をする事で問題点もあります。管理画面上でテーマファイルの編集が出来なくなりますので、別の方法でファイルを直接扱わなければならなくなります。まあもっともプログラマーの方でしたら特に問題はないでしょう。

もしビューファイルの拡張子がphpでしたらPHPコードとして実行されるためエラーコードがはき出されるのみですみますが、そうでない場合は普通にテキストファイルとして入手できてしまうので、場合によっては脆弱を生む事になります。
まあこれはBaserCMSに限った事ではなく、CakePHPを丸ごとドキュメントルート内において運用する場合にも起こりうる問題です。ビューにはあまりコードを書かないようにするか、ちゃんとwebrootをドキュメントルートにした上で、上記のようにthemedからビューファイルを外に追い出した方が安全でしょう。

とはいえ、システムの方で一応ディレクトリを分ける対応をした方が問題がなさそうな気がします。丸ごとインストールされているとまあどうしようもないのですが…

【追記】(2011.01.26)

@nojimageさんから「.htaccessにAddHandlarでctpも加えたら」というアイデアをいただきました(ありがとうございます!)。
もしお使いのサーバで「.httaccessの編集権」「AddHandlar使用権」がある場合は、ctpファイルをPHPコードと見なす事で、webroot内にctpファイルがあっても、コードの中身を閲覧する事を(一応)防ぐ事が出来ます。
「app/webroot/.htaccess」に次のように記述します。


#インストールしているPHP環境によって書き方が違うかもしれない(下記はPHP5用)
AddHandler php5-script .ctp
AddType text/html .ctp

たいていの場合、内部のメソッド・関数が見つからないために致命的エラーとなり、閲覧が出来なくなります。
また、ドキュメントルートに丸ごとBaserCMSをインストールしている場合は「/(BaserCMSのインストールディレクトリ)/.htaccess」に記述する事でBaserCMS内の全てのctpファイルを防げます。

【BaserCMS】app/webrootをドキュメントルートにする場合の注意点

いままでBaserCMSの話題が全くなかったので、ちょっと取り上げてみようと思います。

あ、そうでした。
4月頃、東京で「BaserCMSの勉強会」の開催をもくろんでいます。興味がありましたら是非ご参加ください。またお手伝いいただける方、会場をちょろっとお借りできる会社様等ありましたら是非ご協力お願いいたします。
このへんについてはまた後日。

で本題なのですが、Bakerの皆さんがCakePHPを扱う場合、おそらくapp/webrootをドキュメントルートとしてサーバ設定をする事が多いと思いますが、同じようにBaserCMSもこのように設定すると、インストーラ実行後、表画面もしくは裏画面のどちらかがうまく表示されなくなってしまうかと思います。BaserCMSは標準ではドキュメントルート内にアーカイブ一式をコピーする事を前提で設定がされているため、いくつかの箇所で不具合を生じてしまいます。

app/webrootをドキュメントルートにする場合は次のようにします。

■修正1:.htaccessを次のように設定する


RewriteEngine on
#↓ここを修正
#RewriteBase /app/webroot
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

■修正2:app/config/core.php内の次の箇所を変更する


//↓ここを修正
//Configure::write('App.baseUrl', env('SCRIPT_NAME'));
 Configure::write('App.baseUrl', '');

インストール後うまくいかないようでしたら、たぶんこの辺が影響していると思います。
是非ご確認ください。

【CakePHP】「CakePHP新春勉強会」に行ってきました

CakePHPの勉強会が久々にありましたので参加しました。
大規模なイベントは昨年10月のPHP Matsuri以来となりますが、当方は顔を出したものの完全参加はできなかったので、実質昨年5月以来です。

さて、今回はいつもの「Ktai Library」ではなく、CakePHPで製作されたCMSアプリケーション「BaserCMS」をLTでご紹介させていただきました。スライド(をPDF化したもの)を公開いたします。


クリックするとpdfを参照できます

Cake界隈では「Croogo」あるいはかなり前から存在している「Wildflower」などがありますが、これらは日本向けのCMSではないため、かなりカスタマイズをしないと難しい点がありました。しかしBaserCMSは日本で開発されているため作りも日本向けであり、サポートもされやすいてんがメリットです。また「コーポレートサイト」が簡単に作れるよう機能的にも的を絞っており、他の(Cake以外の)CMSと比べてもコーポレートサイト向けなら導入する価値が大変にあると思います。

当方も開発メンバーでありますが、本業が忙しくてなかなか出来ないところがあります。しかし今年はちょっとてこ入れをしていくつかプラグイン等を作っていきたいと思っています。何故なら本業でも売っていきたいので(笑)。ネタはいくつか考えていますが、一般向けのものについては是非公開していきたいと思います。

で、BaserCMSは福岡では勉強会も回数をこなしており、普及を促している方もたくさんいらっしゃるため盛り上がっているのですが、残念なことに関東では情報がやってこないためなかなか認知度がありません。なのでまずはこの便利なCMSを知っていただきたいと思い、今回勉強会を開催してみようと思っています。Cakeを日頃お使いの方はもちろんですが、特にデザイナーの方にも知っていただきたいと思っております。是非デザイナーさんをお誘いのうえ参加していただけますと大変に嬉しいです。
現時点ではとりあえず「やる」と表明しただけで、何も決まっていない状態です。現実的になってきましたら改めて告知させていただきます。また手伝っていただける方、会場をお貸しいただける方(企業)も絶賛大募集です。まずは小さくと思っておりますが、関東でも是非盛り上げていきたいと思いますのでよろしくお願いします。

…と告知が長くなってしまいましたが(汗)、勉強会そのものも大変に楽しかったです。
内容については他の方がレポートされていますし、ちょっとまとめる時間もなさそうなので今回は割愛させていただきますが、CakePHP2.0は今年の大注目になりそうですね。

2次会はカラオケボックス内でLT大会になりました(笑)。しかもそれがUstされたり!
こんな事をするのはCakeメンバーくらいかもしれません。
第2回CakePHP温泉部」をはじめ、私もいろいろと企画したいと思います。

【Ustreamによる発表録画はこちら】

http://www.ustream.tv/channel/cakephpstudy#utm_campaign=unknown&utm_source=712880&utm_medium=social

【参加された方のブログなど】

http://techlog.knocking.co.jp/archives/190
http://d.hatena.ne.jp/deeeki/20110118/cakephp_newyear_study
http://blog.livedoor.jp/hamichamp/archives/51564338.html