くまきち

山と旅と家族が大事。
でも激しい物欲が理性と財布のタガを飛ばす
最近は自転車も乗ってる

ApacheとPHPのバージョン表示を隠す

2010-01-05 15:41:58 | SEまわり
 Apache + PHP で初期設定のままだと、バージョン情報は結構たくさん表示されてしまう。

 次のように。
 (太字は入力部)

  
% telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
HEAD / HTTP/1.0

HTTP/1.1 200 OK
Date: Tue, 04 Jan 2010 12:22:39 GMT
Server: Apache/2.2.14 (Unix) PHP/5.2.12
X-Powered-By: PHP/5.2.12
Cache-Control: no-cache
Pragma: no-cache
Connection: close
Content-Type: text/html; charset=EUC-JP

Connection closed by foreign host.
%



 Apache のバージョン、PHP のバージョン、OS情報(Unixだけだけど)が出てる。

 バージョン情報は出ない方がいいので、まず Apache の設定をいじる。

 httpd.conf に以下の定義をする。

  
ServerTokens Prod


 この ServerTokes ディレクティブの初期値は Full となっていて、全部吐き出してくれるので、Prod にする。 こうすると、製品名(Apache)だけが表示されるようになる。
 実際は、製品名すら不要なので、'Unknown Web Server' とか、任意の文字列を指定できると、もっといいのになとか思う。わざと IIS とか指定したりして。

 このディレクティブを設定してから再度 telnet で確認してみると、

  
% telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
HEAD / HTTP/1.0

HTTP/1.1 200 OK
Date: Tue, 04 Jan 2010 12:24:10 GMT
Server: Apache
X-Powered-By: PHP/5.2.12
Cache-Control: no-cache
Pragma: no-cache
Connection: close
Content-Type: text/html; charset=EUC-JP

Connection closed by foreign host.
%


 Server: のところが変わった。OS も表示されなくなった。

 でも、PHP のバージョンがマイナーレベルまできっちり表示されているので、これはよくない。PHP はまだまだ頻繁にセキュリティホールが発見されるので、多くの脆弱性を内包している可能性が高いから。
 ということで、PHP のバージョンも表示しないようにする。

 これは、php.ini をいじる。

 expose_php というディレクティブがあるので、これをオフにする。初期値はオンになってる。
 配布ファイル(tarball)を展開すると、php.ini は、php.ini-dist と、php.ini-recommended の2種類が出てきて、そのどちらからを /usr/local/lib/php.ini として配置するなどするんだけど、せめて recommended の方は、これをオフにしててもよさそうなもんだけどなあ…

  
expose_php = Off



 さて、変更したら apache のサービスを再起動させて、再度 telnet で確認してみる。

  
% telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
HEAD / HTTP/1.0

HTTP/1.1 200 OK
Date: Tue, 04 Jan 2010 12:25:32 GMT
Server: Apache
Cache-Control: no-cache
Pragma: no-cache
Connection: close
Content-Type: text/html; charset=EUC-JP

Connection closed by foreign host.
%



 これですっきり。

CakePHP: エラー出力のカスタマイズ

2010-01-05 11:36:03 | SEまわり
2度同じ部分を探す羽目になったので、メモを残す。


CakePHP にて、警告メッセージを表示する際、

  Controller::Session::setFlash()

を使って、メッセージをセットしてからビューを呼び出すと期待通りの動きをしてくれる。

例えば、ac1 というアクションで、数値エラーを見つけたらその旨の警告を表示したければ、コントローラ中で、次のように書く。

  function ac1() {
   ......
   if ( $data > 100 ) {
    $this->Session->setFlash('数値が大きすぎます');
    $this->redirect(array('action'=>'err')); // エラー用のアクションへ
   }
  }

で、エラー用のアクションは次のような感じで。

  function err() {
  }

これに対応するテンプレート err.ctp を用意すれば、その表示の中にエラーメッセージが埋め込まれて表示される。


というのが普通の使い方。


 この時のビューの動作は、

  1. ビューがセッションヘルパーをインスタンス化
  2. セッションヘルパーの flash() メソッドをコール(レイアウトファイル中で呼ばれる)
  3. flash() メソッドは、メッセージ(HTML)を出力

となっている。

 だから、この警告メッセージを、alert ダイアログで表示したいと思った場合、セッションヘルパーの flash() メソッドをカスタマイズしなければいけない。

 だからと言って、CakePHP 本体ライブラリのセッションヘルパーを書き換えるのは良くないので、libs/views/helpers/session.php を、各アプリケーションのディレクトリの下にある views/helpers の下にコピーし、これをカスタマイズすればいい。

 フレームワークは、アプリケーションのディレクトリを先に探してくれるので、そちらが優先される。