it-swarm-eu.dev

Direkten Zugriff auf alle .php-Dateien mit Ausnahme von index.php verweigern

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.

73
Johan

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.

103
Residuum

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.

79
Jerska

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.

34
user185631

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)
16
n1313

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.

10
nikc.org

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)

5
Salman A

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
}
?>
2
Brock Hensley

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.

1
Dan Ambrisco

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>
0
Josiah

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 

0
Quincy