Verweigern Sie den direkten Zugriff auf alle .php-Dateien mit Ausnahme von index.php

77

Ich möchte den direkten Zugriff auf alle .phpDateien außer einer verweigern :index.php

Der einzige Zugriff auf die anderen .phpDateien sollte über PHP erfolgen include.

Wenn möglich möchte ich alle Dateien im selben Ordner.

AKTUALISIEREN:

Eine allgemeine Regel wäre nett, daher muss ich nicht alle Dateien durchgehen. Das Risiko besteht darin, dass ich eine Datei oder Zeile vergesse.

UPDATE 2:

Das index.phpist in einem Ordnerwww.myadress.com/myfolder/index.php

Ich möchte den Zugriff auf alle .phpDateien in myfolderund Unterordner dieses Ordners verweigern .

Johan
quelle

Antworten:

107

Bist du sicher, dass du das machen willst? Sogar CSS und JS Dateien und Bilder und ...?

OK, überprüfen Sie zuerst, ob mod_access in Apache installiert ist, und fügen Sie dann Folgendes zu Ihrem .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 Dateien außer von localhost, da Order Deny,AllowAllow später angewendet wird und die zweite Direktive nur index.php betrifft.

Vorsichtsmaßnahme: Kein Leerzeichen nach dem Komma in der Bestellzeile.

Verwenden Sie diese Anweisung, um den Zugriff auf Dateien zu ermöglichen, die mit * .css oder * .js übereinstimmen:

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

Sie können jedoch keine Anweisungen für <Location>oder <Directory>in .htaccess-Dateien verwenden.

Sie können <FilesMatch ".*\.php$">die erste Erlaubnis verwenden, die Gruppe verweigern und dann explizit den Zugriff auf index.php zulassen.

Update für Apache 2.4: Diese Antwort ist für Apache 2.2 korrekt. In Apache 2.4 hat sich das Zugriffssteuerungsparadigma geändert, und es ist die richtige Syntax zu verwenden Require all denied.

Residuum
quelle
3
Hmm ... nein, nur für .php-Dateien
Johan
Ok, ich bin ein Neuling in .htaccess. Ich habe versucht, Ihren Code zu kopieren, und es funktioniert, um alle Dateien außer index.php zu verweigern, aber keine Nicht-PHP-Dateien zuzulassen. Hier ist meine .htaccess-Datei: Order Deny, Allow Deny from all Allow from 127.0.0.1 <Files index.php> Order Allow, Deny Allow from all </ Files> <FilesMatch "* \. (CSS | js) $" > Order Allow, Deny Allow von allen </ FilesMatch>
Johan
2
hat bei mir nicht funktioniert (aber ich habe dich nicht abgelehnt). Ich habe die Meldung "Server falsch konfiguriert" erhalten. Möglicherweise ist der Server wirklich falsch konfiguriert. Dies funktionierte: stackoverflow.com/a/1607587/539300
Tyler
85

Eigentlich kam ich mit der gleichen Frage hierher wie der Schöpfer des Themas, 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 einmal konfigurieren könnten? Der nächstgelegene war der von Residuum, aber dennoch schloss er ALLE Dateien aus, als ich nur PHP-Dateien ausschließen wollte, die nicht index.php hießen.

Also habe ich mir einen .htaccess ausgedacht, der Folgendes enthält:

<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, sodass sie perfekt zur Voraussetzung 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.

Jerska
quelle
34

Eine schräge Antwort auf die Frage besteht darin, den gesamten Code als Klassen zu schreiben, mit Ausnahme der index.php-Dateien, die dann die einzigen Einstiegspunkte sind. PHP-Dateien, die Klassen enthalten, verursachen 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>

Dadurch kann auf alle Dateien wie index.php, index2.php usw. zugegriffen werden, es wird jedoch jeglicher Zugriff auf andere .php-Dateien verweigert. Andere Dateitypen sind davon nicht betroffen.

user185631
quelle
Wenn Sie Joomla verwenden, haben Joomla-Sites normalerweise nur index.php und index2.php. Bitte beachten Sie, dass index2.php seit Joomla 1.6 veraltet ist.
Rineez
Gutes Zeug, aber das ist kaputt, wenn Sie andere index.php in Ihrer Anwendung haben (was in Ansichten in einigen Frameworks üblich ist).
Sliq
17

Sie können versuchen, eine Konstante in zu definieren index.phpund so etwas hinzuzufügen

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

an den Anfang der anderen Dateien.

ODER Sie können mod_rewriteAnforderungen verwenden und an index.php umleiten, indem Sie sie .htaccesswie folgt bearbeiten :

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

Dann sollten Sie in der Lage sein, alle eingehenden Anforderungen in der index.php zu analysieren und entsprechende Maßnahmen zu ergreifen.

Wenn Sie beispielsweise alle * .jpg-, * .gif-, * .css- und * .png-Dateien weglassen möchten, sollten Sie die zweite Zeile wie folgt bearbeiten:

RewriteCond $1 !^(index\.php|*\.jpg|*\.gif|*\.css|*\.png)
n1313
quelle
Weißt du wie? Ich habe keine Ahnung.
Johan
Ist es wichtig, dass sich index.php in einem Ordner befindet?
Johan
Ja, Sie sollten den vollständigen absoluten Pfad dazu in RewriteRule schreiben, wie z. B. RewriteRule ^ (. *) $ /Somedir/anotherdir/index.php/$1 [L]
n1313
.htaccess: RewriteRule: unknown flag 'L][R'
Brock Hensley
Bearbeitet: Flaggen sollten durch Kommas getrennt werden
Brock Hensley
11

Wie wäre es, wenn Sie alle .php-Dateien außer index.php über dem Webstamm halten? Es sind keine Umschreiberegeln oder programmatischen Kludges erforderlich.

Das Hinzufügen des Includes-Ordners zu Ihrem Include-Pfad hilft dann dabei, die Dinge einfach zu halten, ohne dass absolute Pfade usw. verwendet werden müssen.

nikc.org
quelle
Ok, ich verschiebe meine Dateien in einen anderen Ordner. Vielen Dank für alle .htaccess-Hilfe, aber es war zu kompliziert für mich.
Johan
Oder vielleicht auch nicht, es waren zu viele Linkreferenzen zwischen meinen Dokumenten, also warte ich mit dieser Lösung.
Johan
Was meinst du mit Linkreferenz? Haben Sie den Ordner, in den Sie die Dateien verschoben haben, in Ihren Include-Pfad eingefügt?
Nikc.org
Linkreference = include('file.php')toinclude('myfolder/file.php')
Johan
Wenn Sie den Ordner, in den Sie die Dateien verschieben, in Ihren Include-Pfad ( ini_set('include_path', ini_get('include_pat'). ':/path/to/files');) aufnehmen, können Sie dasselbe tun, ohne dass etwas kaputt geht.
Nikc.org
6

Das Umschreiben von URLs kann verwendet werden, um eine URL PHP-Dateien zuzuordnen. Die folgenden Regeln können angeben, ob eine .php-Anforderung direkt gestellt oder neu geschrieben wurde. Es 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 enden .php. URLs wie /(die index.php auslösen), /test(die in index.php /test?f=index.phpumgeschrieben werden ) und (die index.php in Querystring enthalten) sind jedoch weiterhin zulässig.

THE_REQUESTenthält die volle Linie HTTP - Anforderung von dem Browser an den Server (zB gesendet GET /index.php?foo=bar HTTP/1.1)

Salman A.
quelle
1
Dies ist die Lösung, nach der ich gesucht habe. Ich wollte den Zugriff auf alle PHP mit Ausnahme meiner Umschreiberegeln verweigern. Vielen Dank!
Machineaddict
Ihre Antwort ist in der Nähe von dem, wonach ich suche. Wenn Sie noch hier sind, können Sie auf stackoverflow.com/questions/57260003/…
Serge
2

Anstatt eine Variable , das um ich dies tun , das ist in sich geschlossen am oberen Rand einer beliebigen Seite , die Sie nicht wollen , den direkten Zugriff auf dieses noch mit .htaccess Regeln kombiniert werden sollte , aber ich fühle mich sicherer zu wissen , gibt es eine ausfallsichere , wenn htaccess bringt immer Unordnung.

<?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
}
?>
Brock Hensley
quelle
Dies ist für kleine Anwendungen in Ordnung, aber wenn Sie eine Vielzahl von Controllern, Modellen und Vorlagen usw. haben, ist dies völlig unüberschaubar.
James
2

Mit Apache 2.4 hat sich die Syntax für die Zugriffssteuerung 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 auf Require all deniedeine 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>
Josiah
quelle
Der zweite scheint nicht zu funktionieren, wenn Sie example.org anfordern. Er funktioniert nur für example.org/index.php
Damien Bezborodow
1

Eine einfache Lösung besteht darin, alle Nicht-index.php-Dateien in .inc umzubenennen und dann den Zugriff auf * .inc-Dateien zu verweigern. Ich benutze dies in vielen meiner Projekte und es funktioniert einwandfrei.

Dan Ambrisco
quelle
0

Legen Sie alle Dateien in einem Ordner ab. Legen Sie eine .htaccess-Datei in diesen Ordner und geben Sie ihm den Wert "Alle verweigern". In index.php, das sich außerhalb des Ordners befindet, werden die richtigen Seiten basierend auf Benutzereingaben oder Ereignissen wiedergegeben

Quincy
quelle
-1
<Files ~ "^.*\.([Pp][Hh][Pp])">
 Order allow,deny
 Deny from all
 Satisfy All
</Files>
Kanomdook
quelle
-2

Erlaube nur 2 IP, alle anderen werden blockieren

Order Deny,Allow
Deny from all
Allow from 173.11.227.73 108.222.245.179
user2425846
quelle