あずきみるくのあずきはニガテ - for Engineer

ひよっこプログラマがやってみたことやハマっちゃったことなど、備忘録的な感じで書いていきます。

cakePHPのフォルダ構成を変更する - セキュリティUP?

今現在、cakePHPの構成はこんな感じになってました。

Apache24
|
|-htdocs(公開ディレクトリ)
	|-cakeSample(プロジェクトルート)
		|-app
		|  |-Config
		|  |-Controller
		|  |-Model
		|  |-View
		|  |-webroot
		|  |-(いろいろ、以下略)
		|
		|-lib
		|  |-Cake
		|      |-Core(ここにはcakePHPの核が!!)
		|
		|-plugins
		|-vendors	
		|-.htaccess
		|-index.php

Apacheのhtdocs配下が公開フォルダになっていて、その直下にプロジェクトごと、ぼこんって置いてある状態です。

これの何が問題か。


cakePHPのコアが公開されちゃっていることです。

つまり、悪意を持ったユーザが、cakePHPの核を触れちゃう、っていう状態にあることです。
この悪者が核を変に触ってしまったら。
システムの挙動そのものがおかしくなります。

ひいては大事なデータを保存していたら、間違いなく抜かれちゃうでしょう。。。。



なんて危険なんでしょう!!!



というわけで、公開フォルダ直下には、Modelを扱うようなソースを置かず、基本的にViewに関わるところだけ公開する、という方法に変えたいと思います。


目標とするのはこの形。

Apache24
|
|-htdocs
	|-cakeSample(プロジェクトルート)
	|	|-app
	|	|  |-Config
	|	|  |-Controller
	|	|  |-Model
	|	|  |-View
	|	|  |-webroot
	|	|  |-(いろいろ、以下略)
	|	|
	|	|-lib
	|	|  |-Cake
	|	|    |-Core
	|	|
	|	|-plugins
	|	|-vendors
	|	|-.htaccess
	|	|-index.php
	|
	|-public_html (公開ディレクトリ)
		|-cakeSample(cakeSample/app/webrootの中身をこちらに)

新しく「public_html」というディレクトリを作成し、そこしか見せない方法です。
後々ほかのアプリも配備することを考え、公開ディレクトリの下にさらにプロジェクト名の階層をあえて作っています。


では、このように変更する手順を書いていきたいと思います。

<はじめに、環境>
Windows 8.1
cakePHP 2.5.8
PHP 5.5.21
Apache 2.4

1)シンボリックリンクの作成

シンボリックリンクとは、、、

OSのファイルシステムの機能の一つで、特定のファイルやディレクトリを指し示す別のファイルを作成し、それを通じて本体を参照できるようにする仕組み。リンクは本体と同じディレクトリに置いても良いが、通常は別の場所から参照できるようにするために作成される。UNIX系OSでよく用いられるもので、Windowsでも利用することができる。

シンボリックリンクとは 〔 ソフトリンク 〕 【 symbolic link 】 - 意味/解説/説明/定義 : IT用語辞典

イメージとしてはショートカットのようなものです。
これをすることで何が嬉しいか、というと、

触るのは「cakeSample/app/webroot」だけでいいのです。

ここを変更すれば、「public_html」内はシンボリックリンクのおかげで勝手に変更されます。
元を傷つけたら分身にも傷がつく、的な・・・



さて、では実際にやってみましょう。

コマンドラインを管理者権限で開き、以下のコマンドを実行します。

mklink /D C:\Apache24\htdocs\public_html\cakeSample C:\Apache24\htdocs\cakeSample\app\webroot

mklink コマンドは以下のように使います。

mklink /D 分身 もと

上記の例だと、


「cakeSample/app/webroot」の分身を「public_html/cakeSample」に作るよ。

ってことになります。

できたら、こんなメッセージが出ます。

C:\Apache24\htdocs\public_html\cakeSample <<===>> C:\Apache24\htdocs\cakeSample\app\webroot
 のシンボリック リンクが作成されました

試しに、「cakeSample/app/webroot」内で何かファイルを作ってみてください。
「public_html/cakeSample」内にも勝手にファイルができていることでしょう。
これが確認できればOKです。

2)Apacheの設定

もう、毎度おなじみ「Apache24/conf/httpd.conf」です。
変更するのは一か所、DocumentRootだけです。
「htdocs直下」にしていたDocumentRootを、「public_html」に変更してください。

変更前

DocumentRoot "c:/Apache24/htdocs"
<Directory "c:/Apache24/htdocs">
</Directory>

変更後

DocumentRoot "c:/Apache24/htdocs/public_html"
<Directory "c:/Apache24/htdocs/public_html">
</Directory>

3)index.phpの編集

ここがキモかもしれません。

Apacheの公開ディレクトリをwebroot配下に変更したことで、最初は「webroot」配下のindex.phpを見に行きます。

このindex.phpの中に、外に出しているソースを読み込めるように設定を加えていきます。
変更するのは3か所です。

  • 「ROOT」のパス
  • 「APP_DIR」のパス
  • 「CAKE_CORE_INCLUDE_PATH」のパス


変更前

if (!defined('ROOT')) {
	define('ROOT', dirname(dirname(dirname(__FILE__))));
}
if (!defined('APP_DIR')) {
	define('APP_DIR', basename(dirname(dirname(__FILE__))));
}
//define('CAKE_CORE_INCLUDE_PATH', ROOT . DS . 'lib');

変更後

if (!defined('ROOT')) {
	define('ROOT', dirname('..'. DS . '..' . DS . '.'));
}
if (!defined('APP_DIR')) {
	define('APP_DIR', 'app');
}
define('CAKE_CORE_INCLUDE_PATH', ROOT . DS . 'lib');

「ROOT」のパスはプロジェクトのルートディレクトリを設定しています。
環境によって異なるのでよしなに変えてください。

「APP_DIR」は「app」ディレクトリなので見たままですね。

「CAKE_CORE_INCLUDE_PATH」は「Coreディレクトリを含むパス」の意味なので、「lib」を指定します。
 ※もともとコメントアウトされていたので、「//」を外します。



ちなみに、「DS」というのは、もうちょっと上で

if (!defined('DS')) {
	define('DS', DIRECTORY_SEPARATOR);
}

と設定されています。
ディレクトリを分ける「/」の代わりをしています。

このソース内に「/」を直接書いてしまうと、セキュリティ上よろしくないので、この書き方にしている、とどこかで読みました。

なので、あえての「DS」です。

4)確認

これで、前回までで作っていた「Hello」でも出してみましょうか。

今までと同じく、「http://localhost/cakeSample/hello」でアクセスしてみましょう。

f:id:azuki-milk-lush:20150220134656p:plain

いけました!!



ちなみに、プロジェクトを複数置く予定がない場合、public_html直下にwebrootの中身を配備することも可能です。

その場合は「http://localhost/hello」とアクセスすることができます。
なーるほど。



<参考>
Windowsでシンボリックリンクを作る | Developers.IO
CakePHPのディレクトリ構成を変更する: CakePHPフレームワークで行こう