auto_prepend_fileへのダイレクトアクセスをPHPで禁止する

設定オプションの値はini_getで取得できる

ダイレクトアクセスを禁止したいファイル名とini_getで取得したオプション情報を比較する

PHPファイルのダイレクトアクセス禁止処理を行っておきたい場合がある。

通常は、

if( count(get_included_files()) == 1 ){
        // ダイレクトアクセス
}

get_included_files関数を利用して、ダイレクトアクセス対象のファイルのみをインクルード中という直接アクセスの特徴を利用する方法になる。

ところが、上の方法で直接アクセスを捕捉するとサイト内のすべてのページが補足されてしまう事例に遭遇した。

php_value auto_prepend_file /path/to/start.php

auto_prepend_fileをhttpd.confで設定している場合で、上の例だとstart.phpに対するダイレクトアクセスをget_included_filesで禁止すると、他のファイルに対するアクセスも禁止することになってしまう。理由は、start.phpを事前に実行するためという理由になる。

そのため、auto_prepend_fileで設定したPHPスクリプトへのダイレクトアクセスを禁止するために以下のようにした。

if( basename(ini_get('auto_prepend_file')) == basename($_SERVER['SCRIPT_FILENAME']) )
{
	header("HTTP/1.1 404 Not Found");
	die('direct');
}
  • auto_prepend_fileの値から取得したファイル名
  • アクセス中のスクリプトのファイル名

双方を比較することでダイレクトアクセスを捕捉する方法になる。

ini_get('auto_prepend_file');

で設定オプションを得ることが可能。auto_prepend_fileの絶対パス値をbasenameに渡せばstart.phpが返されるので、その値とアクセス中のスクリプトファイル名を比較すれば、auto_prepend_fileへの直接アクセスを禁止することができる。

Webエンジニアブログにコメント

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

auto_prepend_fileへのダイレクトアクセスをPHPで禁止するの記事にコメントを投稿