Ich möchte den direkten Zugriff auf alle .php
-Dateien außer einer einzigen verweigern: index.php
Der einzige Zugriff auf die anderen .php
-Dateien sollte über php include
erfolgen.
Wenn möglich möchte ich alle Dateien im selben Ordner.
UPDATE:
Eine allgemeine Regel wäre Nizza, sodass ich nicht alle Dateien durchgehen muss. Das Risiko ist, dass ich eine Datei oder Zeile vergesse.
UPDATE 2:
Der index.php
befindet sich in einem Ordner www.myadress.com/myfolder/index.php
Ich möchte den Zugriff auf alle .php
-Dateien in myfolder
und Unterordner dieses Ordners verweigern.
Bist du sicher, dass du das machen willst? Sogar css und js Dateien und Bilder und ...?
OK, überprüfe zuerst, ob mod_access in Apache installiert ist, und füge dann Folgendes zu deinem .htaccess hinzu:
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
<Files /index.php>
Order Allow,Deny
Allow from all
</Files>
Die erste Direktive verbietet den Zugriff auf alle Dateien außer localhost. Aufgrund von Order Deny,Allow
wird Allow später angewendet, die zweite Direktive wirkt sich nur auf index.php aus.
Vorbehalt: Nach dem Komma ist kein Platz in der Bestellzeile.
Um den Zugriff auf Dateien zu ermöglichen, die mit * .css oder * .js übereinstimmen, verwenden Sie diese Anweisung:
<FilesMatch ".*\.(css|js)$">
Order Allow,Deny
Allow from all
</FilesMatch>
Sie können jedoch keine Direktiven für <Location>
oder <Directory>
in .htaccess-Dateien verwenden.
Ihre Option wäre, <FilesMatch ".*\.php$">
für die erste zulassen, ablehnen-Gruppe zu verwenden und dann explizit den Zugriff auf index.php zu erlauben.
Update für Apache 2.4: Diese Antwort ist für Apache 2.2 korrekt. In Apache 2.4 hat sich das Access Control-Paradigma geändert, und die korrekte Syntax lautet Require all denied
.
Eigentlich kam ich mit der gleichen Frage wie der Ersteller des Themas hierher, aber keine der angegebenen Lösungen war eine vollständige Antwort auf mein Problem ... Warum sollten Sie ALLEN Dateien auf Ihrem Server einen Code hinzufügen, wenn Sie ihn einfach konfigurieren könnten? einmal? Der engste war der von Residuum, aber er schloss ALLE Dateien aus, als ich nur PHP-Dateien ausschließen wollte, die nicht index.php hießen.
Also kam ich mit einem .htaccess auf, der Folgendes enthielt:
<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>
(Denken Sie daran, dass htaccess-Dateien rekursiv arbeiten, damit sie perfekt zu den Voraussetzungen der Frage passen.)
Und es geht los. Die einzigen PHP-Dateien, auf die ein Benutzer zugreifen kann, sind die mit dem Namen index.php . Sie können jedoch weiterhin auf jedes Bild, css-Stylesheet, js-Skript usw. zugreifen.
Eine offene Antwort auf die Frage besteht darin, den gesamten Code als Klassen mit Ausnahme der Dateien index.php zu schreiben, die dann die einzigen Eintrittspunkte sind. PHP -Dateien, die Klassen enthalten, bewirken nichts, selbst wenn sie direkt über Apache aufgerufen werden.
Eine direkte Antwort besteht darin, Folgendes in .htaccess aufzunehmen:
<FilesMatch "\.php$">
Order Allow,Deny
Deny from all
</FilesMatch>
<FilesMatch "index[0-9]?\.php$">
Order Allow,Deny
Allow from all
</FilesMatch>
Dies ermöglicht den Zugriff auf Dateien wie index.php, index2.php usw., verweigert jedoch den Zugriff auf andere .php-Dateien. Andere Dateitypen werden nicht beeinflusst.
Sie können versuchen, eine Konstante in index.php
zu definieren und etwas hinzuzufügen
if (!defined("YOUR_CONSTANT")) die('No direct access');
an den Anfang der anderen Dateien.
ODER Sie können mod_rewrite
verwenden und Anforderungen an index.php umleiten und .htaccess
wie folgt bearbeiten:
RewriteEngine on
RewriteCond $1 !^(index\.php)
RewriteRule ^(.*)$ /index.php/$1 [L,R=301]
Dann sollten Sie in der Lage sein, alle eingehenden Anfragen in der index.php zu analysieren und entsprechende Maßnahmen zu ergreifen.
Wenn Sie beispielsweise alle * .jpg-, * .gif-, * .css- und * .png-Dateien auslassen möchten, sollten Sie die zweite Zeile folgendermaßen bearbeiten:
RewriteCond $1 !^(index\.php|*\.jpg|*\.gif|*\.css|*\.png)
Wie wäre es, alle .php-Dateien außer index.php über dem Webstamm zu halten? Es sind keine Regeln zum Umschreiben oder programmatische Fehler erforderlich.
Das Hinzufügen des Include-Ordners zu Ihrem Include-Pfad hilft Ihnen, die Dinge einfach zu halten, ohne absolute Pfade verwenden zu müssen.
Das Umschreiben von URLs kann zum Zuordnen einer URL zu .php-Dateien verwendet werden. Die folgenden Regeln können feststellen, ob eine .php-Anforderung direkt gestellt wurde oder neu geschrieben wurde. Sie verbietet die Anfrage im ersten Fall:
RewriteEngine On
RewriteCond %{THE_REQUEST} ^.+?\ [^?]+\.php[?\ ]
RewriteRule \.php$ - [F]
RewriteRule test index.php
Diese Regeln verbieten alle Anfragen, die mit .php
enden. URLs wie /
(die index.php auslöst), /test
(die in index.php umschreibt) und /test?f=index.php
(die index.php in Querzeichenfolge enthält) sind jedoch weiterhin zulässig.
THE_REQUEST
enthält die vollständige HTTP-Anforderungszeile, die vom Browser an den Server gesendet wird (z. B. GET /index.php?foo=bar HTTP/1.1
)
Anstatt eine Variable zu übergeben, mache ich das in sich abgeschlossene oben auf jeder Seite, auf die Sie keinen direkten Zugriff haben möchten. Dies sollte immer noch mit den .htaccess-Regeln gepaart werden ausfallsicher, wenn htaccess jemals durcheinander gerät.
<?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
}
?>
Eine einfache Lösung besteht darin, alle Nicht-Index.php-Dateien in .inc umzubenennen und den Zugriff auf * .inc-Dateien zu verweigern. Ich verwende dies in vielen meiner Projekte und es funktioniert einwandfrei.
Mit Apache 2.4 hat sich die Syntax für die Zugriffskontrolle geändert. Bei Verwendung von Anweisungen wie:
Order deny,allow
Deny from all
funktioniert nicht, Sie verwenden wahrscheinlich Apache 2.4.
Die Apache 2.4-Dokumente sind hier .
Sie müssen Require all denied
auf eine der folgenden Arten verwenden:
# 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>
legen Sie alle Dateien in einem Ordner ab. Legen Sie eine .htaccess -Datei in diesem Ordner ab und geben Sie den Wert Alle verweigern an. In index.php wird das außerhalb des Ordners plaziert, sodass die richtigen Seiten basierend auf Benutzereingaben oder Ereignissen ausgegeben werden