1つを除くすべての.php
ファイルへの直接アクセスを拒否したい:index.php
他の.php
ファイルへのアクセスは、php include
を介してのみ行う必要があります。
可能であれば、すべてのファイルを同じフォルダーに入れます。
更新:
一般的なルールはニースなので、すべてのファイルを調べる必要はありません。リスクは、ファイルまたは行を忘れてしまうことです。
更新2:
index.php
はフォルダーwww.myadress.com/myfolder/index.php
にあります
myfolder
内のすべての.php
ファイルとそのフォルダーへのサブフォルダーへのアクセスを拒否します。
本当に、それをしたいですか? 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
を使用することです。
実際、私はトピックの作成者と同じ質問でここに来ましたが、与えられた解決策はどれも私の問題に対する完全な答えではありませんでした。一度設定するだけでコードをサーバー上のすべてのファイルに追加するのはなぜですか?最も近いものは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スクリプトなどにアクセスできます。
質問に対する斜めの答えは、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ファイルへのアクセスは拒否されます。他の種類のファイルには影響しません。
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)
Index.phpを除くすべての.phpファイルをWebルートの上に保持してはどうですか?書き換えルールやプログラムによる手間は必要ありません。
インクルードフォルダーをインクルードパスに追加すると、物事をシンプルに保ち、絶対パスなどを使用する必要がなくなります。
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
)
直接アクセスしたくないページの先頭にある自己完結型である変数を渡す代わりに、これは.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
}
?>
Apache 2.4では、アクセス制御の構文が変更されました。次のようなディレクティブを使用する場合:
Order deny,allow
Deny from all
動作しません。Apache2.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>
簡単な解決策は、index.php以外のすべてのファイルの名前を.incに変更し、*。incファイルへのアクセスを拒否することです。私は多くのプロジェクトでこれを使用しており、完全に問題なく動作します。
すべてのファイルを1つのフォルダーに入れます。そのフォルダーに.htaccessファイルを配置し、値にdeny allを指定します。次に、フォルダの外部に配置されたindex.phpで、ユーザー入力またはイベントに基づいて適切なページをエコーアウトします