LPICの勉強が暗記ばかりになってきてつまらないのでちょっと息抜きです。
WordPressで利用しているプラグインの自動アップデートがうまくいかず今までずっと放置していたのですが、WordPressの古いバージョンにセキュリティホールが見つかったようなのでとりあえずアップデートしようと思っていろいろ調べてみました。
原因はなんとなくわかっていただのですがやはり利用しているレンタルサーバの環境に依存するもので、こちらのサイトに解決方法が載っていました。
.htaccessを修正しようと確認してみたらこんな記述が。
<files upload.php> AddHandler application/x-httpd-phpcgi .php </files> <files async-upload.php> AddHandler application/x-httpd-phpcgi .php </files>
たしかダッシュボードから画像がアップロードできなかったときに作成したものだと思います。
とりあえずサイトに載っていたものを追記したらアップデートできるようになりました。
で、いつもならこれで解決にするところなのですが、
- 「PHPのセーフモード」とはなんなのか?
- PHPのモジュール版とCGI版の違いはなんなのか?
これについてちょっと気になったので簡単に調べてみました。
■PHPのセーフモードとは?
まずはPHPのマニュアルから
PHP のセーフモードは、共有サーバでのセキュリティの問題を解決するための試みです。 この問題を PHP のレベルで解決しようとするのはアーキテクチャ上正しくありません。 しかし、Web サーバや OS レベルでの代替策はあまり現実的ではないため、 多くのユーザ、特に ISP ではセーフモードが現在使用されています。
とのこと。
レンサバなんかではセキュリティを考慮してPHPの動作に何かしらの制限をかけているのかな?と勝手に推測。
で、先ほどのサイトに
WordPress でサーバーに新しくディレクトリを作成した場合、ディレクトリの権限が Apache になってしまうのもセーフモードの制限によるものです。ディレクトリの権限が Apache になってしまうと、WordPress からファイルをアップロードすることができなくなります。
つまり PHP からディレクトリを作成すると、ファイルのアップロードが出来ないディレクトリになってしまう、ということです。
という説明がありましたが、会社で利用しているレンサバでも同じようなことがありました。「ファイルの所有者がapacheになっちゃって、スクリプトからじゃないと不要ファイルが削除できない」現象はこれが原因だったんですね。
さらに調べてみるとこちらのサイトでセーフモードの仕様というか挙動について説明がありました。
個人的な解釈では
PHPスクリプトファイルの所有者と、その処理対象となるファイル/ディレクトリの所有者を確認して処理に制限をかける
みたいな感じです。
共用サーバ上で悪意あるスクリプトをブラウザから実行した際に、セーフモードの設定がされていればFTPでファイルをアップロードしたときのユーザー(hoge)とスクリプトの実行ユーザー(apache)が違うので意図した処理(FTPでアップしたファイルの改竄や削除)を行わせないことができるのかな。
ちなみに、利用しているサーバがセーフモードかどうかはphpinfoの情報でわかるみたいです。こんな感じ。
CGIモード
Server API : CGI
モジュールモード
Server API : Apache
phpinfoがダメならPHPの「ini_get()」関数を利用して調べられるみたいです。
こんな感じ。
<?php
// Check for safe mode
if( ini_get('safe_mode') ){
// Do it the safe mode way
}else{
// Do it the regular way
}
?>
マニュアルによると「ini_get()」関数は「設定オプションの値を得る」ことのできる関数みたいですね。
■PHPのモジュール版とCGI版の違いは?
こちらに関してはけっこー前から疑問に思っていました。
とりあえずマニュアルから見てみました。
PHP:Apache モジュールとしてインストール
PHP:CGI バイナリとしてインストール
ただこの説明だとなかなかイメージがつかめないわけでして、さらにいといろ調べてみると様々な掲示板で同様の質問がされていましたので、回答を一部抜粋。
■モジュール版の特徴
スピードが速い(起動終了処理が不要)
メモリ使用量が多い(アクセスしていなくてもメモリが解放されない)
rootやapache権限で実行される
パーミッション604以上で動く
■CGI版の特徴
スピードが遅い(起動終了処理が必要)
メモリ使用量が少ない(アクセスがなければメモリを使用しない)
SuExecを使用できる(ユーザー権限で実行できる)
実行権を設定しないと起動しないようにできる
PHPをバージョンアップしてもApache再起動が不要
過負荷の時にtopで実際のスクリプト名が出てくる
動作が遅くなる
パーミッション700で動く
やっぱりイメージがつかみにくいところです。
そもそも「CGI」をちゃんと理解していないのが悪いのかと思い、こちらもちょっと調べてみました。
http://ja.wikipedia.org/wiki/Common_Gateway_Interface
http://www.studyinghttp.net/cgi
この辺のサイトを参考にして調べてみました。
Common Gateway Interface (コモン・ゲートウェイ・インタフェース)は、ウェブサーバ上でサーバプログラムから他のプログラムを呼び出し、その処理結果をクライアントに送信する連携法の取り決めであり 、
・WWWサーバがユーザエージェントから HTTP リクエストメッセージを受け取る
・WWWサーバは外部のプログラムに処理を依頼する
・CGI プログラムが実行される
・プログラムが WWWサーバに実行結果を返す
・WWWユーザエージェントが処理結果を受け取る
という形でユーザーが作成するプログラムをサーバ上で実行させるための仕組みのこと。
って感じで「仕組み」のことを「CGI」というんですね。
サイトでも紹介されていた「よくある誤解」のように、『プログラム』のことを「CGI」だと思っているとなかなか理解できませんでしたが、『仕組み』のことだと思えばなんだか納得できました。
この辺の設定は最近仕事でも必要になってきている知識なのでLPICの勉強が一段落したらもーちょっと細かいところまで勉強しようと思います。明日からはまたLPICの勉強がんばります。
で、勉強とは関係ありませんが、同僚のEmperorさんのブログが停止されていました。
>しかも管理画面のIDとパスワードも割れたみたいだし・・・
って割ったの自分だ・・・
この場を借りて謝らせていただきます。
Emperorさん、ごめんなさい。
ほんとにほんとにごめんなさい。