add to hatena hatena.comment (23) add to del.icio.us (0) add to livedoor.clip (2) add to Yahoo!Bookmark (0) Total: 25

1行で書けるPHPファイルを直接実行させない方法

Webサーバーのウェブルート以下に、クラスファイルやincludeされることが前提となっているライブラリファイルのような直接実行されることを意図していないPHPファイルを置いてしまった場合、意図していなくてもブラウザから直接URLを入力された場合はPHPファイルが実行されてしまいます。

もちろん、直接実行されては困るようなファイルをどこからでもアクセスできる公開ディレクトリに置くことが間違っていますが、アプリケーション設置をユーザー自身が行う場合に、「このファイルはhtdocsの上のディレクトリにlibディレクトリを作成して...」という手順を伝えるのが困難な場合もあるかもしれません。

.htaccessで対策する

というわけで、直接呼ばれないようにする方法として一番最初に思い浮かべるのが、ライブラリを配置するディレクトリを別に用意し、.htaccessでdenyを設定してしまうことでしょうか。

* .htaccess

CODE:
  1. order deny,allow
  2. deny from all

ただし、これもWebサーバーの設定によっては.htaccessが利用できない環境もあります。もし、.htaccessが無効な環境では普通に実行されてしまうでしょう。

PHPのコードで対策する

では、直接PHPスクリプトが呼び出されないようなコードを書けば良いのでは?ということで書いてみました。
以下の1行を直接実行させたくないPHPファイルの先頭に書くだけです。

PHP:
  1. <?php
  2. // check if this script is called directly
  3. if (array_shift(get_included_files()) === __FILE__) die('cannot call directly!');
  4.  
  5. // coading below

やっていることは簡単です。
get_included_files関数を利用しています。この関数はinclude,requireされたファイルのパス一覧の配列を返してくれるのですが、ポイントは

最初にコールされたスクリプトは "include されたファイル" という扱いに なります。そのため、include() やその仲間たちにより 読み込まれたファイルの一覧に含めて表示されます。

というところです。
これを利用して、get_included_files関数から返される配列の最初が自分自身のファイルだったらdieで終了しています。

このエントリを書いた後に、マニュアルページのコメントにも同様のアイデアが書かれていることに気づきました。でも、わざわざ関数にするまでも無いかなと思いました。

via: get_included_files

関連するその他の記事

Comments

Leave a Reply