CGI版PHPとモジュール版(スクリプト版)PHP
PHPにはCGI版とモジュール版(スクリプト版とも言います)があり、それぞれに長所と短所があります。
しかしよく調べずに選択するとセキュリティの面での問題が出たり、後の運用が難しくなるケースがあります。
自分の場合はどちらを選ぶべきなのか、きちんと調べ考えてから選択してください。
CGI版 | モジュール版 | |
実行権限 | 通常各ユーザー Webサーバーとは独立して動作する |
Webサーバー Webサーバーの内部で動作する |
速度 | FastCGIでモジュール版とほぼ同等 CGIは遅い |
やや早い |
セキュリティ | 高い | 低い 特にファイルシステム利用の場合要注意 |
環境の切り替え | 通常.htaccessやphp.iniファイルを用いてディレクトリ毎に環境を変えることができる | できない それ故運用が難しくなるケースがある |
推奨ケース |
複数のソフトウェアを動かすのに向いている。 第三者に見られてはいけない大切なデータをファイルに保存する場合に向いている。 |
単一のソフトウェアのみ動かし、速度を求める場合に向いている。 誰に見られても問題ないデータしかファイルに保存しない場合に向いている。 |
注意事項 |
バージョンアップが困難なことからセキュリティが低くなる可能性がある。(⇒ 環境の切り替え) ファイルのパーミションを緩くしないと動かないケースもあり、セキュリティが低くなる。(⇒ データファイルのパーミッション) パーミッションの設定をデフォルトに任せていると、スクリプトから作成したディレクトリやファイルが削除できなくなることがある。(⇒ もう1つの厄介な問題) |
PHPは誰が動かしているのか
CGI版PHP、モジュール版PHPそれぞれの特徴を説明する前に、PHPがどの様に動いているかを説明します。
CGI版PHP、モジュール版PHPのそれぞれの特徴は、誰が動かしているかに起因しています。
CGI版PHP
サーバーの設定にもよりますが、通常レンタルサーバーではsuEXECが導入されているので、それぞれのユーザー権限でPHPが実行されます。 Webサーバー(Apahceのことが多い)とは独立して、CGI(common gateway interface)として動作します。モジュール版PHP
Webサーバー(Apahceのことが多い)のRootユーザー権限でPHPが実行されます。 Webサーバーの機能の1つとして動作します。速度
CGI版PHP
CGI版PHPはWebサーバーとは独立して動作するので、PHPスクリプトが呼び出される度にPHPの読み込みと終了が行われます。 そのためモジュール版と比べると速度が遅くなりがちです。ですがほとんどのレンタルサーバーではCGI版PHPの速度が早くなるように改良したFastCGI版PHPがインストールされています。 FastCGIの場合、モジュール版との速度の差はあまりないようです。条件によってはモジュール版より速度が出でいるという結果もあるようです。
モジュール版PHP
Webサーバーの機能の1つとして、Webサーバーが立ち上がる時に一度だけPHPを読み込みます。 毎回読み込む必要がないので速度が早くなります。速度はPHPだけでなく、レンタルサーバー全体への負荷、ネットワークに流れているデータ量、WordPressならプラグインやテーマの読み込みなど、むしろこちらの方が大きく影響するので、速度だけの理由でモジュール版を選ぶのはやめましょう。
またPHPのバージョンによっても大きく変わります。例えばPHPバージョン5に比べて、バージョン7は2倍以上の速度が出るとも言われています。
セキュリティ
CGI版PHP
サーバーの設定にもよりますが、CGI版PHPはそれぞれのユーザーの権限で動かすことができます。 そして多くのレンタルサーバーではユーザー権限で動くように設定してあります。それぞれのユーザーの権限で動くので、同じレンタルサーバーを使っている他のユーザーからの干渉はありません。
またPHPが読み書きするデータファイル(拡張子csvやtxtなどのデータを保存するファイル)のパーミッションを、外部から見られないよう厳しく設定することができます。
モジュール版PHP
モジュール版PHPを動かしているのはWebサーバーです。 レンタルサーバーの場合、全てのユーザーが同じ権限で動かしていることになるので、理論上は他のユーザーに干渉できてしまいます。 レンタルサーバーによっては、干渉の問題をクリアしている所もあるようです。干渉とは違うのですが、ファイルに大切なデータを保存する場合、モジュール版では危険です。詳しくはデータファイルのパーミッションをご覧ください。
動作環境の切り替え
CGI版PHP
レンタルサーバーの設定にもよりますが、ディレクトリごとにPHPの環境を変えることができます。 【.htaccess】ファイルを用いてディレクト毎にPHPのバージョンを変えたり、【php.ini】ファイルでディレクト毎にPHPの動作環境を変えることができます。公式のマニュアルには書かれていなくても、可能なレンタルサーバーもあります。
複数のソフトウェアをインストールしてビジネスを行う場合、モジュール版に比べて圧倒的に有利な点です。
ソフトウェアAは古いバージョンでないと動かない、
ソフトウェアBはセキュリティ上新しいバージョンのPHPで動かす必要がある、
という場合、それぞれのソフトウェアをインストールしているディレクト毎にPHPのバージョンを変えて運用することができます。
また、ソフトウェアAが対応しているPHPのバージョンがアップしたので、ソフトウェアAのバージョンアップと、PHPのバージョンの変更を行いたいとます。
現在ソフトウェアAをインストールしているディレクトリとは別のディレクトリにインストール、
新しいディレクトリはPHPの新しいバージョンで環境を整え、
動作確認の後、
瞬時に新旧を入れ替える、
ということもできます。
つまりサービスを止める必要がないのです(実際には数秒止まりますが)。
このとき、別ディレクトリにインストールしているソフトウェアBには全く影響を与えません。
モジュール版では一斉にPHPのバージョンが変わるので、ソフトウェアAがエラーを吐いて止まったら解決するまでサービスは停止します。 もちろんこの時ソフトウェアBもエラーを吐いて止まる可能性もあります。
余談ですが、ソフトウェアは特別な理由がない限り最新のバージョンを使うようにしましょう。 ビジネスではお客様の大切な情報を扱うのですから、セキュリティが高くなるよう最新バージョンを使うようにしましょう。
モジュール版PHP
ディレクトリごとにPHPの環境を変えることはできません。複数のソフトウェアをインストールする場合、セキュリティ的に問題が起こることがあります。
ソフトウェアAは古いバージョンでないと動かない、
ソフトウェアBはセキュリティ上新しいバージョンのPHPで動かす必要がある、
という場合、ソフトウェアAが動かなくなるので、PHPのバージョンを上げることができません。
セキュリティ上問題があると分かっているのに、古いバージョンを使い続けているケースを見たことがあります。
またPHPのバージョンを変えると、サイト全体のPHPが変わってしまいます。
ソフトウェアAもソフトウェアBもエラーを吐いて止まる可能性があり、エラーが解消されるまで、サービスは停止するリスクが出てきます。
データファイルのパーミッション
ソフトウェアそのもの(PHPファイル)も大切ですが、もっと大切な情報が記録されているデータファイルは最優先で守るべきファイルです。
PHPでプログラミングされたソフトウェアがあり、データファイルを読み書きしているとします。
この場合のデータファイルのパーミッションを考えてみます。
モジュール版PHPの場合、データファイルのパーミションに関して困ったことが起こります。
その前に。
訪問者がブラウザでページにアクセス
↓
ブラウザがWebサーバーへページの内容を送るよう依頼
↓
Webサーバーがファイル読み込みをトライ
↓
Webサーバーに読み込み権限があればページの内容、権限がなければエラーを返す
↓
訪問者のブラウザが返された結果を表示
ざっとこういう流れになります。
大切なのはファイルへのアクセスはWebサーバーが行うということです。ファイルパーミッションでWebサーバーの読み込み権限が設定されていれば、Webサーバーはファイルの内容を読み込む事ができ、その結果、訪問者はファイルの中身を閲覧することができます。
Webサーバー実行権限で動いているモジュール版PHPの場合、スクリプトから作成されたファイルの所有者はWebサーバーになります。
前説明は終わって、いよいよ本題です。
Webサーバーに大切な情報を保存するデータファイルを置かなければいけない時のパーミッション値を、
データファイルをスクリプトから作成する場合と、
データファイルを予めFTPでアップロードしておく場合、
の2つを見ていきます。データファイルのパーミッションをどう設定して、(スクリプト以外の)外部からのアクセスを防げばいいでしょうか。
Webサーバーがデータファイルの読み込みを行うため、作成したデータファイルのその他に読み込みの権限を与えなければ、Webサーバーはデータファイルを読み込めなくなり、結果外部からの読み込みをブロックできます。
スクリプトの実行者もファイルの所有者もユーザーなので、自分自身にだけ読み書きの権限を与えればよく、パーミッションに400を設定すればスクリプトからは読み込み可能、外部からは読み込み不能になります(パーミッション600なら読み書きです)。
FTPからファイルをアップロードした場合も所有者はファイルのユーザーなので同様です。
PHPの実行権限がユーザーであるCGI版は問題は起こりません。
Webサーバーに読み書きの権限があると、外部からファイルの読み書きができてしまいますので、外部からの読み書きをブロックするためには、Webサーバーに読み書きの権限を与えてはいけません。 しかしPHPスクリプトを実行しているのはWebサーバーなので、Webサーバーに読み書きの権限がなければ、スクリプトからも読み書きできなくなります。
つまり、スクリプトから読み書きできるようにすると必ず外部からも読み書きできてしまうことになります。
FTPからファイルをアップロードすれば、所有者はユーザーになるので、この場合はどうなるか考えてみます。
ファイルの所有者はユーザーですから、スクリプトから読み書きできるようにするには、その他のパーミッションに読み書きの権限を与えなければいけません。パーミッションは606になります。 そうすると、当然Webサーバーがファイルを読み書きできるので、第三者もファイルの中身を見ることができます。
考えてみれば、ファイルを読み書きするWebサーバー自身がスクリプトの実行権限者なので、ファイルの所有者が誰であろうと必ずこうなりますよね。
モジュール版の場合、このように困った事が起こります。
ではどうすればよいのか。
フィアルシステムは一切使わず、データベースシステムだけで構築すれば、ディレクトリやファイルのパーミッションの問題は起こりません。
あるいは、Webからアクセスできない(Webより上位の)ディレクトリにデータファイルを置けばセキュアになります。 Webからアクセスできない(Webより上位の)ディレクトリはレンタルサーバーによっては使えないこともありますので、お使いのレンタルサーバーに確認が必要です。
例えばパーミッションが606なら良いのですが、604や600に設定してしまった場合、FTPからファイルを削除できません。 この場合、スクリプトからファイルを削除するか(スクリプトからパーミッションを変更してFTPで削除してもOK)、所有者を変更しなくてはいけません。 削除するスクリプトが用意されていればいいのですが、不慣れな方が自分で用意する場合は時間がかかるでしょう。
所有者の変更はroot権限がないとできないのですが、レンタルサーバーはでは通常その権限は与えられていません。
つまり不要になった時、ファイルを削除するのに一苦労ということになりかねないのです。
ファイル作成時にモジュール版かどうか判断して、パーミッションを明示的に設定してあれば良いのですが、デフォルトにまかせてある場合は注意が必要です。
自分が作ったファイルなのに、自分で操作できないというなんとも腹立たしい状況になってしまいます。
スクリプトの実行権限はどこにあるのか、隠すべきファイルはあるのか、をよく調べて選択しましょう。
特にモジュール版PHPを選択しようとしている場合は、慎重に検討してください。
よく耳にするレンタルサーバーについて、PHPの環境をまとめています。 ⇒ レンタルサーバーのPHPの対応状況
追記 1
CGI版PHPとモジュール版PHPはどちらか一方しか利用できないというものではなく、混在させて使うことができます。
レンタルサーバーが公式にサポートしていなくても、CGI版PHPとモジュール版PHPの両方を利用できるケースもあるようです。
追記 2
複数のレンタルサーバーから改良モジュール版PHPが提供され始めたり、更に高速化されたPHPも利用され始めているようです。
追記 3
某レンタルサーバーに問い合わせた時、「うちのモジュール版は安全です」と返信があったので、色々調べてみました。 どうやら干渉は起こらないということらしいのですが、ソフトウェアの仕様によってはファイルの中身が丸見えになること、バージョンアップの際苦労するであろうことは、何も言及していませんでした。
後記
もし何がなんだかわからないと思われた方は、CGI版(ただしFastCGI)をご利用になられるのが安心な上、楽だと思います。 正直、モジュール版はある程度分かっていないと難しいと思います。
あくまで個人的意見です。ご参考になれば幸いです。
モジュール版PHPの場合、データファイルのパーミションに関して困ったことが起こります。
その前に。
ファイルにアクセスするのはWebサーバー
Webページに訪問者がやって来た場合、訪問者がブラウザでページにアクセス
↓
ブラウザがWebサーバーへページの内容を送るよう依頼
↓
Webサーバーがファイル読み込みをトライ
↓
Webサーバーに読み込み権限があればページの内容、権限がなければエラーを返す
↓
訪問者のブラウザが返された結果を表示
ざっとこういう流れになります。
大切なのはファイルへのアクセスはWebサーバーが行うということです。ファイルパーミッションでWebサーバーの読み込み権限が設定されていれば、Webサーバーはファイルの内容を読み込む事ができ、その結果、訪問者はファイルの中身を閲覧することができます。
PHPスクリプトから作成されたファイルの所有者
ユーザー実行権限で動いているCGI版PHPの場合、スクリプトから作成されたファイルの所有者はユーザーになります。Webサーバー実行権限で動いているモジュール版PHPの場合、スクリプトから作成されたファイルの所有者はWebサーバーになります。
- 外部からアクセスがあった場合、ファイルを読み書き実行するのはWebサーバー
- スクリプトから作成したファイルの所有者は、CGI版:ユーザー、モジュール版:Webサーバー
前説明は終わって、いよいよ本題です。
Webサーバーに大切な情報を保存するデータファイルを置かなければいけない時のパーミッション値を、
データファイルをスクリプトから作成する場合と、
データファイルを予めFTPでアップロードしておく場合、
の2つを見ていきます。データファイルのパーミッションをどう設定して、(スクリプト以外の)外部からのアクセスを防げばいいでしょうか。
CGI版の場合
前述したように、CGI版PHPからファイルを作成した場合、作成したファイルの所有者はユーザーになり、Webサーバーの分類はその他になります。 CGI版PHPからデータファイルを作成し、作成したデータファイルへ外部からアクセスがあった場合を考えます。Webサーバーがデータファイルの読み込みを行うため、作成したデータファイルのその他に読み込みの権限を与えなければ、Webサーバーはデータファイルを読み込めなくなり、結果外部からの読み込みをブロックできます。
スクリプトの実行者もファイルの所有者もユーザーなので、自分自身にだけ読み書きの権限を与えればよく、パーミッションに400を設定すればスクリプトからは読み込み可能、外部からは読み込み不能になります(パーミッション600なら読み書きです)。
FTPからファイルをアップロードした場合も所有者はファイルのユーザーなので同様です。
PHPの実行権限がユーザーであるCGI版は問題は起こりません。
モジュール版の場合
モジュール版PHPからファイル作成を行った場合、作成したファイルの所有者はWebサーバーになります。 所有者がユーザーの場合はWebサーバーの分類はその他でしたが、所有者がWebサーバーの場合はWebサーバーは所有者自身であることに注意してください。Webサーバーに読み書きの権限があると、外部からファイルの読み書きができてしまいますので、外部からの読み書きをブロックするためには、Webサーバーに読み書きの権限を与えてはいけません。 しかしPHPスクリプトを実行しているのはWebサーバーなので、Webサーバーに読み書きの権限がなければ、スクリプトからも読み書きできなくなります。
つまり、スクリプトから読み書きできるようにすると必ず外部からも読み書きできてしまうことになります。
FTPからファイルをアップロードすれば、所有者はユーザーになるので、この場合はどうなるか考えてみます。
ファイルの所有者はユーザーですから、スクリプトから読み書きできるようにするには、その他のパーミッションに読み書きの権限を与えなければいけません。パーミッションは606になります。 そうすると、当然Webサーバーがファイルを読み書きできるので、第三者もファイルの中身を見ることができます。
考えてみれば、ファイルを読み書きするWebサーバー自身がスクリプトの実行権限者なので、ファイルの所有者が誰であろうと必ずこうなりますよね。
モジュール版の場合、このように困った事が起こります。
ではどうすればよいのか。
フィアルシステムは一切使わず、データベースシステムだけで構築すれば、ディレクトリやファイルのパーミッションの問題は起こりません。
あるいは、Webからアクセスできない(Webより上位の)ディレクトリにデータファイルを置けばセキュアになります。 Webからアクセスできない(Webより上位の)ディレクトリはレンタルサーバーによっては使えないこともありますので、お使いのレンタルサーバーに確認が必要です。
もう1つの厄介な問題
モジュール版PHPの場合、もう1つ厄介なことが起こることがあります。 PHPスクリプトから作成したファイルは所有者がWebサーバーになるので、パーミッションの設定を誤るとFTPからファイルを操作できなくなる場合があるのです。例えばパーミッションが606なら良いのですが、604や600に設定してしまった場合、FTPからファイルを削除できません。 この場合、スクリプトからファイルを削除するか(スクリプトからパーミッションを変更してFTPで削除してもOK)、所有者を変更しなくてはいけません。 削除するスクリプトが用意されていればいいのですが、不慣れな方が自分で用意する場合は時間がかかるでしょう。
所有者の変更はroot権限がないとできないのですが、レンタルサーバーはでは通常その権限は与えられていません。
つまり不要になった時、ファイルを削除するのに一苦労ということになりかねないのです。
ファイル作成時にモジュール版かどうか判断して、パーミッションを明示的に設定してあれば良いのですが、デフォルトにまかせてある場合は注意が必要です。
自分が作ったファイルなのに、自分で操作できないというなんとも腹立たしい状況になってしまいます。
スクリプトの実行権限はどこにあるのか、隠すべきファイルはあるのか、をよく調べて選択しましょう。
特にモジュール版PHPを選択しようとしている場合は、慎重に検討してください。
よく耳にするレンタルサーバーについて、PHPの環境をまとめています。 ⇒ レンタルサーバーのPHPの対応状況
追記 1
CGI版PHPとモジュール版PHPはどちらか一方しか利用できないというものではなく、混在させて使うことができます。
レンタルサーバーが公式にサポートしていなくても、CGI版PHPとモジュール版PHPの両方を利用できるケースもあるようです。
追記 2
複数のレンタルサーバーから改良モジュール版PHPが提供され始めたり、更に高速化されたPHPも利用され始めているようです。
追記 3
某レンタルサーバーに問い合わせた時、「うちのモジュール版は安全です」と返信があったので、色々調べてみました。 どうやら干渉は起こらないということらしいのですが、ソフトウェアの仕様によってはファイルの中身が丸見えになること、バージョンアップの際苦労するであろうことは、何も言及していませんでした。
後記
もし何がなんだかわからないと思われた方は、CGI版(ただしFastCGI)をご利用になられるのが安心な上、楽だと思います。 正直、モジュール版はある程度分かっていないと難しいと思います。
あくまで個人的意見です。ご参考になれば幸いです。