web-dev-qa-db-ja.com

index.phpを除くすべての.phpファイルへの直接アクセスを拒否する

1つを除くすべての.phpファイルへの直接アクセスを拒否したい:index.php

他の.phpファイルへのアクセスは、php includeを介してのみ行う必要があります。

可能であれば、すべてのファイルを同じフォルダーに入れます。

更新:

一般的なルールはニースなので、すべてのファイルを調べる必要はありません。リスクは、ファイルまたは行を忘れてしまうことです。

更新2:

index.phpはフォルダーwww.myadress.com/myfolder/index.phpにあります

myfolder内のすべての.phpファイルとそのフォルダーへのサブフォルダーへのアクセスを拒否します。

75
Johan

本当に、それをしたいですか? CSSやJSのファイルや画像、そして...?

OK、まずmod_accessがApacheにインストールされているかどうかを確認し、次に.htaccessに次を追加します。

Order Deny,Allow
Deny from all
Allow from 127.0.0.1

<Files /index.php>
    Order Allow,Deny
    Allow from all
</Files>

最初のディレクティブはlocalhost以外のファイルへのアクセスを禁止します。これは、Order Deny,Allow、Allowは後で適用されるため、2番目のディレクティブはindex.phpにのみ影響します。

警告:注文行のコンマの後にスペースはありません。

* .cssまたは* .jsに一致するファイルへのアクセスを許可するには、次のディレクティブを使用します。

<FilesMatch ".*\.(css|js)$">
    Order Allow,Deny
    Allow from all
</FilesMatch>

ただし、.htaccessファイル内で<Location>または<Directory>のディレクティブを使用することはできません。

あなたのオプションは、最初のallow、denyグループの周りで<FilesMatch ".*\.php$">を使用してから、明示的にindex.phpへのアクセスを許可することです。

Apache 2.4のアップデート:この回答は、Apache 2.2に対して正しいものです。 Apache 2.4では、 アクセス制御パラダイム が変更されており、正しい構文はRequire all deniedを使用することです。

104
Residuum

実際、私はトピックの作成者と同じ質問でここに来ましたが、与えられた解決策はどれも私の問題に対する完全な答えではありませんでした。一度設定するだけでコードをサーバー上のすべてのファイルに追加するのはなぜですか?最も近いものはResiduumのものでしたが、それでも、index.phpという名前ではないphpファイルのみを除外したいときに、彼はすべてのファイルを除外していました。

だから私はこれを含む.htaccessを思い付きました:

<Files *.php>
    Order Deny,Allow
    Deny from all
    Allow from 127.0.0.1
</Files>

<Files index.php>
    Order Allow,Deny
    Allow from all
</Files>

(htaccessファイルは再帰的に機能するため、質問の前提条件に完全に適合します。)

さあ、いくぞ。ユーザーがアクセスできる唯一のphpファイルは、index.phpという名前のファイルです。ただし、すべての画像、CSSスタイルシート、JSスクリプトなどにアクセスできます。

80
Jerska

質問に対する斜めの答えは、index.phpファイルを除くすべてのコードをクラスとして記述することです。これは、唯一のエントリポイントです。クラスを含むPHPファイルは、Apacheから直接呼び出されても、何も起こりません。

直接的な答えは、.htaccessに以下を含めることです。

<FilesMatch "\.php$">
    Order Allow,Deny
    Deny from all
</FilesMatch>
<FilesMatch "index[0-9]?\.php$">
    Order Allow,Deny
    Allow from all
</FilesMatch>

これにより、index.php、index2.phpなどのファイルへのアクセスが許可されますが、他の.phpファイルへのアクセスは拒否されます。他の種類のファイルには影響しません。

34
user185631

index.phpで定数を定義して、次のようなものを追加してみてください。

if (!defined("YOUR_CONSTANT")) die('No direct access');

他のファイルの先頭に。

または、mod_rewriteを使用してindex.phpにリクエストをリダイレクトし、次のように.htaccessを編集できます。

RewriteEngine on
RewriteCond $1 !^(index\.php)
RewriteRule ^(.*)$ /index.php/$1 [L,R=301]

その後、index.php内のすべての着信リクエストを分析し、適切なアクションを実行できるようになります。

たとえば、すべての* .jpg、*。gif、*。css、および* .pngファイルを除外する場合は、次のように2行目を編集する必要があります。

RewriteCond $1 !^(index\.php|*\.jpg|*\.gif|*\.css|*\.png)
16
n1313

Index.phpを除くすべての.phpファイルをWebルートの上に保持してはどうですか?書き換えルールやプログラムによる手間は必要ありません。

インクルードフォルダーをインクルードパスに追加すると、物事をシンプルに保ち、絶対パスなどを使用する必要がなくなります。

11
nikc.org

URLの書き換えを使用して、URLを.phpファイルにマッピングできます。次のルールは、.phpリクエストが直接行われたか、書き換えられたかを識別できます。最初のケースではリクエストを禁止します:

RewriteEngine On
RewriteCond %{THE_REQUEST} ^.+?\ [^?]+\.php[?\ ]
RewriteRule \.php$ - [F]
RewriteRule test index.php

これらのルールは、.phpで終わるすべてのリクエストを禁止します。ただし、/(index.phpを起動する)、/test(index.phpに書き換える)、/test?f=index.php(クエリ文字列にindex.phpを含む)などのURLは引き続き許可されます。

THE_REQUESTにはブラウザからサーバーに送信される完全なHTTPリクエスト行(例:GET /index.php?foo=bar HTTP/1.1

6
Salman A

直接アクセスしたくないページの先頭にある自己完結型である変数を渡す代わりに、これは.htaccessルールとペアにする必要がありますが、 htaccessがめちゃくちゃになった場合、フェイルセーフがあります。

<?php
// Security check: Deny direct file access; must be loaded through index
if (count(get_included_files()) == 1) {
    header("Location: index.php"); // Send to index
    die("403"); // Must include to stop PHP from continuing
}
?>
2
Brock Hensley

Apache 2.4では、アクセス制御の構文が変更されました。次のようなディレクティブを使用する場合:

Order deny,allow
Deny from all

動作しません。Apache2.4を使用している可能性があります。

Apache 2.4ドキュメントはこちら

次のいずれかの方法でRequire all deniedを使用する必要があります。

# you can do it this way (with "not match")

<FilesMatch ^((?!index\.php).)*$>
  Require all denied
</FilesMatch>

# or 

Require all denied

<Files index.php>
  Require all granted
</Files>
1
Josiah

簡単な解決策は、index.php以外のすべてのファイルの名前を.incに変更し、*。incファイルへのアクセスを拒否することです。私は多くのプロジェクトでこれを使用しており、完全に問題なく動作します。

1
Dan Ambrisco

すべてのファイルを1つのフォルダーに入れます。そのフォルダーに.htaccessファイルを配置し、値にdeny allを指定します。次に、フォルダの外部に配置されたindex.phpで、ユーザー入力またはイベントに基づいて適切なページをエコーアウトします

0
Quincy