ECWorks Blog

ECWorks Blog

CakePHPを中心としたサイト開発情報をメインに公開。新しもの好きなので時々製品レポートなんかも。

【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ファイルを防げます。


Tagged as: ,

2 Comments

  1. .htaccessのAddHandlarネタですが、よくよく考えるとあまりよろしくないので、FilesMatchとDenyによる制御を推奨させてください。

    https://gist.github.com/796413

  2. 確かにAddHandlarよりもこちらの方が良いですね。

    どのやり方でもそうですが、問題は.htaccessが有効でないと恩恵を受けられない点…
    どんな環境でもいけると良いのですが。
    拡張子をctpではなくphpにするくらいしか方法がないですかね(^^;