課題 #1193

テーマの設置場所、デプロイ方法について検討する

江頭 竜二ほぼ7年前に追加. 5年以上前に更新.

ステータス:終了開始日:2011/01/27
優先度:急いで期日:
担当者:江頭 竜二進捗率:

0%

カテゴリ:その他
対象バージョン:2.0.0 stable

説明

現在のデプロイ方法は、インストール時に、コアパッケージから、webroot/themed/ にコピーする仕様となっている。

また、テーマのインストールは、直接 webroot/themed/ 内に配置してもらい、管理画面より適用する。

【webroot 内に配置するようにした理由】
  • デザイナーにwebroot配下しか触れせたくない、シンプルに見せたい。
  • webroot 内に配置した場合、CSSやJSを静的ファイルとして読み込める。($html->linkで自動的にパス解決)
【webroot 内に配置した場合の解決案】
  • .htaccess に次の2行を加える
    AddHandler php5-script .ctp
    AddType text/html .ctp
  • Deny from All を記述した .httaccess を設置(この場合、CSSとJSは除外するように設定が必要)

【参考URL】
http://blog.ecworks.jp/archives/1404


履歴

#1 滝下 真玄ほぼ7年前に更新

本件について軽く整理しますね。

【起こりうる問題】
現状で、app/webroot/themed/内のctpファイルに直接アクセスされると、ビューファイルがそのまま「テキスト」として表示されてしまいます。
つまり、ビューコード内にセキュリティリスクを伴うコードもしくは情報を記述された場合にそれが可視化されてしまい、そのサイトの脆弱性を生む原因になると考えられます(例えばコメントにDBのアクセス方法を書くとか、そういったものを含む)。

【解決案】
その1:
テーマファイルをapp/views/themed/に展開してもらい、「適用」ボタンで「ctpファイル以外のファイル」をapp/webroot/temed/に展開する

長所:
・mod_rewrite/.htaccessが設定出来る環境であれば対策が出来る
・ユーザ側の負担にならない
・1カ所でファイル管理が出来る

短所:
・一部のファイルが2重で存在する事になる
・テーマ適用後にapp/views/themed/内に画像等を追加修正しても反映されない
・テーマの保存場所が従来と変わる
・mod_rewrite/.htaccessが設定出来ないと効果なし

その2:
.htaccessをシステムで操作する仕組みの中に、ApacheのAddHandlarディレクティブでctpファイルをPHPファイルとして見なすような記述を追加する(.htaccess)

長所:
・修正がとても楽
・最低限ビューファイルが閲覧されなくなる
・スマートURLを適用していなくても対策が有効
・ユーザ側で対策する必要がない

短所:
・サーバ依存の可能性が高い(.htaccessを使えない場合はNG。またAddHandlarを許可していない場合など)
・fatalエラーで止まるだけなので、十分な対策とは言えない(場合によってはサーバ内のパスが可視化される)

とりあえず当方からはこの2案が考えられます。
案1の方が、案2よりは確実だと思いますが、結局どちらも.httaccess等が有効でないサーバ環境では無力なので、他のアイデアも検討した方が良いと思います。
ただ「プログラムを知らないデザイナーさんでも使えるCMS」であるからこそ、ビューファイルに何を書かれるかも分からないので、出来る限りctpを不可視に出来る方法がよいと思います。

#ちなみに、dispacherでcss等が転送されるのは、1.3だとviews/themed/webrootに置けます。1.2はvendorsに置けたような気もしますが、基本はwebroot/themed/で現状通りです

長くなりましたが以上です。

#2 滝下 真玄ほぼ7年前に更新

もう一つアイデアが浮かびましたのでそれも書きます。

その3:
ビューファイルの拡張子を全てphpとする。そしてController::extプロパティとView::extプロパティに`php`を設定する

長所:
・PHPファイルとしてビューを置くので、最悪コードが不可視になる
・全てのサーバ環境で適用できる

短所:
・既存バージョンで使用していたテーマと互換性がなくなる
・外部からCakePHPのプラグイン等を持ってきにくくなる

#3 - nojimageほぼ7年前に更新

その2を言い出したnojiamgeです。
その後、考え直したらAddHandlerでPHPとして解釈するのはちょっと難ありということで、
そもそもアクセスさせない方法を提案します。

https://gist.github.com/796413

と、言っておいてなんですが、masa-pさんのその3の案が現実的でいいのではないでしょうか。
以前のテンプレート拡張子となる.ctpについてはViewクラスで$extに指定されているファイルが無い場合に勝手に探して読み込んでくれます。
cakephp 1.2だと $ext > .ctp > .thtml の順ですね。(1.3になると.thtmlが無くなります。

#4 江頭 竜二6年以上前に更新

返事しなきゃと思いつつ2ヶ月経ってました。。

僕もその3に賛成です。

外部のプラグインについては、beforeFilterやbeforeRenderあたりでフックしてctpのまま利用する仕様にできるかもしれません。

CakePHP1.3への移行あたりで検討してみたいと思います。
※ CakePHP1.3への移行時は下位互換は無視する予定です。

#5 江頭 竜二6年以上前に更新

以前のテンプレート拡張子となる.ctpについてはViewクラスで$extに指定されているファイルが無い場合に勝手に探して読み込んでくれます。

あ、なるほど、外部プラグインも問題ないんですね。失礼。

#6 江頭 竜二6年以上前に更新

  • カテゴリその他 にセット
  • 担当者江頭 竜二 にセット
  • 優先度通常 から 急いで に変更
  • 対象バージョン3.0.0 stable にセット

#7 江頭 竜二5年以上前に更新

  • ステータス担当 から 終了 に変更
  • 対象バージョン3.0.0 stable から 2.0.0 stable に変更

こちらの件ですが、色々と検討した結果、テンプレートの拡張子を .php に変更する方向ですすめています。

#2010 にまとめ、この件は終了とします。

他の形式にエクスポート: Atom PDF