Direkten Zugriff auf eine PHP-Include-Datei verhindern

Lesezeit: 8 Minuten

Direkten Zugriff auf eine PHP Include Datei verhindern
Alterlife

Ich habe eine PHP-Datei, die ich ausschließlich als Include verwenden werde. Daher möchte ich einen Fehler werfen, anstatt ihn auszuführen, wenn direkt darauf zugegriffen wird, indem die URL eingegeben wird, anstatt eingeschlossen zu werden.

Grundsätzlich muss ich in der PHP-Datei eine Überprüfung wie folgt durchführen:

if ( $REQUEST_URL == $URL_OF_CURRENT_PAGE ) die ("Direct access not premitted");

Gibt es eine einfache Möglichkeit, dies zu tun?

  • Anstelle von die() sollten Sie ‘header(“HTTP/1.1 404 File Not Found”, 404); Ausfahrt;’. Dadurch wird (zumindest auf Apache) der Server die normale 404-Seite zurückgeben.

    – Gnud

    4. Januar 2009 um 17:08 Uhr

  • Hier sind zwei einfache Methoden, die ich erklärt habe, um den direkten Zugriff in in PHP enthaltenen Dateien zu deaktivieren – codespeedy.com/disable-direct-access-to-the-php-include-file

    – Faruque Ahamed Mollick

    18. Juli 2017 um 21:06 Uhr

1646889850 271 Direkten Zugriff auf eine PHP Include Datei verhindern
Futter

Der einfachste Weg für die generische Situation „PHP-App, die auf einem Apache-Server ausgeführt wird, den Sie vollständig kontrollieren können oder nicht“ ist, Ihre Includes in einem Verzeichnis abzulegen und den Zugriff auf dieses Verzeichnis in Ihrer .htaccess-Datei zu verweigern. Um den Leuten das Googeln zu ersparen, wenn Sie Apache verwenden, fügen Sie dies in eine Datei namens “.htaccess” in das Verzeichnis ein, auf das Sie nicht zugreifen möchten:

Deny from all

Wenn Sie tatsächlich die volle Kontrolle über den Server haben (heutzutage häufiger sogar für kleine Apps als zu dem Zeitpunkt, als ich diese Antwort zum ersten Mal schrieb), besteht der beste Ansatz darin, die Dateien, die Sie schützen möchten, außerhalb des Verzeichnisses zu platzieren, aus dem Ihr Webserver dient . Also, wenn Ihre App drin ist /srv/YourApp/legen Sie den Server fest, von dem Dateien bereitgestellt werden /srv/YourApp/app/ und fügt die Includes ein /srv/YourApp/includesalso gibt es buchstäblich keine URL, die auf sie zugreifen kann.

  • Wenn Sie die volle Kontrolle über den Server haben, ist es besser, wenn Sie die Konfiguration in eine Verzeichnisdirektive in der Konfigurationsdatei des virtuellen Hosts einfügen. Apache liest es nur einmal beim Start, .htaccess wird bei jedem Zugriff gelesen und verlangsamt den Server

    – Eineki

    3. Januar 2009 um 19:43 Uhr

  • Es wäre schön, eine .htaccess-Beispieldatei als Teil dieser Antwort zu haben.

    – Graham Lea

    5. Juni 2012 um 11:47 Uhr

  • <Files ~ "\.inc$"> Order Allow,Deny Deny from All </Files>

    – Drakorat

    27. September 2012 um 16:53 Uhr

  • @James: Außerdem ist nicht jeder der Meinung, dass Stack Overflow eine “plz send teh codez” -Site sein sollte. Wenn es die Frage klar beantwortet, dann ist es eine gute Antwort. Das Bereitstellen eines Beispiels, wo keines benötigt wird, fördert nur das Kopieren und Einfügen der Codierung.

    – Chuck

    10. September 2013 um 21:03 Uhr


  • Ich habe das versucht und wenn du es tust Deny from all Es funktioniert nicht einmal in einem Include, es wird 404.

    – Michael Rogers

    3. Juli 2017 um 9:53 Uhr

  • Das ist eigentlich eine verdammt gute Idee, die Anzahl der enthaltenen Dateien zu überprüfen. Ich frage mich, was besser ist: Definitionen verwenden oder diese Methode verwenden? Das wirkt eigenständiger.

    – Akoi Meexx

    8. Juni 2011 um 16:40 Uhr

  • Das erste Mal, dass ich je jemanden gesehen habe, der darauf gekommen ist. Ich weiß jedoch nicht warum, denn es scheint so eigenständig wie möglich zu sein, und es misst direkt, was Sie eigentlich wissen möchten (ob enthalten ist oder nicht), anstatt etwas zu messen, von dem angenommen wird, dass es damit verbunden ist (wie eine bestimmte Konstante oder eine bestimmter Standort durch .htaccess gesperrt). Wunderschönen.

    – Jimbo Jonny

    8. August 2012 um 12:34 Uhr

  • Dies ist wirklich cool, da die Verwendung von .htaccess zum Blockieren aller .php-Dateien möglicherweise nicht immer möglich ist, da sich einige Dateien im selben Verzeichnis befinden können, die direkt oder sogar durch Javascript aufgerufen werden müssen. Danke für diese tolle Idee!

    – Anuj

    18. September 2012 um 20:55 Uhr

  • Dies funktioniert nur in PHP5 und höher. Pre-PHP5 möchten Sie wieder 0 statt 1 vergleichen.

    – Jmucchiello

    10. Juni 2013 um 1:26 Uhr

  • Dies ist eine wirklich clevere Lösung, mit der Sie den direkten Zugriff kontrollieren und nicht nur blockieren können – das gefällt mir. Normalerweise füge ich Unit-Tests in die Dateien selbst ein, und auf diese Weise kann ich meine Unit-Tests in diese if-Anweisung packen. Bin gespannt wie effizient das ist..

    – Weißatom

    12. Juli 2013 um 16:19 Uhr

Direkten Zugriff auf eine PHP Include Datei verhindern
Panne

1: Überprüfen der Anzahl der enthaltenen Dateien

if( count(get_included_files()) == ((version_compare(PHP_VERSION, '5.0.0', '>='))?1:0) )
{
    exit('Restricted Access');
}

Logik: PHP wird beendet, wenn die minimale Include-Anzahl nicht erreicht wird. Beachten Sie, dass vor PHP5 die Basisseite nicht als Include betrachtet wird.


2: Definieren und Verifizieren einer globalen Konstante

// In the base page (directly accessed):
define('_DEFVAR', 1);

// In the include files (where direct access isn't permitted):
defined('_DEFVAR') or exit('Restricted Access');

Logik: Wenn die Konstante nicht definiert ist, startete die Ausführung nicht von der Basisseite und PHP würde die Ausführung stoppen.

Notiz dass aus Gründen der Übertragbarkeit über Upgrades und zukünftige Änderungen eine Modularisierung dieser Authentifizierungsmethode den Codierungsaufwand erheblich reduzieren würde, da die Änderungen nicht für jede einzelne Datei fest codiert werden müssen.

// Put the code in a separate file instead, say 'checkdefined.php':
defined('_DEFVAR') or exit('Restricted Access');

// Replace the same code in the include files with:
require_once('checkdefined.php');

Auf diese Weise kann zusätzlicher Code hinzugefügt werden checkdefined.php für Protokollierungs- und Analysezwecke sowie zur Generierung angemessener Antworten.

Kredit wem Kredit gebührt: Aus dieser Antwort entstand die brillante Idee der Portabilität. Diese Methode hat jedoch einen Nachteil. Dateien in verschiedenen Ordnern erfordern möglicherweise unterschiedliche Adressen, um diese Datei zu adressieren. Und die Server-Root-basierte Adressierung funktioniert möglicherweise nicht, wenn Sie die aktuelle Website von einem Unterordner der Hauptseite aus ausführen.


3: Remote-Adressautorisierung

// Call the include from the base page(directly accessed):
$includeData = file_get_contents("http://127.0.0.1/component.php?auth=token");

// In the include files (where direct access isn't permitted):
$src = $_SERVER['REMOTE_ADDR']; // Get the source address
$auth = authoriseIP($src); // Authorisation algorithm
if( !$auth ) exit('Restricted Access');

Der Nachteil bei dieser Methode ist die isolierte Ausführung, es sei denn, ein Sitzungstoken wird mit der internen Anforderung bereitgestellt. Überprüfen Sie dies über die Loopback-Adresse im Falle einer Einzelserverkonfiguration oder über eine Adress-Whitelist für eine Serverinfrastruktur mit mehreren Servern oder mit Lastenausgleich.


4: Token-Autorisierung

Ähnlich wie bei der vorherigen Methode kann man GET oder POST verwenden, um ein Autorisierungstoken an die Include-Datei zu übergeben:

if($key!="serv97602"){header("Location: ".$dart);exit();}

Eine sehr umständliche Methode, aber bei richtiger Anwendung vielleicht auch die sicherste und vielseitigste zugleich.


5: Webserverspezifische Konfiguration

Bei den meisten Servern können Sie Berechtigungen für einzelne Dateien oder Verzeichnisse zuweisen. Sie könnten alle Ihre Includes in solchen eingeschränkten Verzeichnissen platzieren und den Server so konfigurieren, dass er sie ablehnt.

Beispielsweise wird in Apache die Konfiguration in der gespeichert .htaccess Datei. Lernprogramm Hier.

Notiz Allerdings werden serverspezifische Konfigurationen von mir nicht empfohlen, da sie schlecht für die Portabilität zwischen verschiedenen Webservern sind. In Fällen wie Content-Management-Systemen, bei denen der Deny-Algorithmus komplex ist oder die Liste der abgelehnten Verzeichnisse ziemlich groß ist, kann dies die Rekonfigurationssitzungen nur ziemlich grausam machen. Am Ende ist es am besten, dies im Code zu behandeln.


6: Platzieren von Includes in einem sicheren Verzeichnis AUSSERHALB des Site-Stammverzeichnisses

Aufgrund von Zugriffsbeschränkungen in Serverumgebungen am wenigsten bevorzugt, aber eine ziemlich leistungsfähige Methode, wenn Sie Zugriff auf das Dateisystem haben.

//Your secure dir path based on server file-system
$secure_dir=dirname($_SERVER['DOCUMENT_ROOT']).DIRECTORY_SEPARATOR."secure".DIRECTORY_SEPARATOR;
include($secure_dir."securepage.php");

Logik:

  • Der Benutzer kann keine Datei außerhalb von anfordern htdocs Ordner, da die Links außerhalb des Bereichs des Adresssystems der Website liegen würden.
  • Der PHP-Server greift nativ auf das Dateisystem zu und kann daher auf Dateien auf einem Computer zugreifen, genau wie ein normales Programm mit den erforderlichen Berechtigungen.
  • Indem Sie die Include-Dateien in dieses Verzeichnis legen, können Sie sicherstellen, dass der PHP-Server darauf zugreifen kann, während dem Benutzer das Hotlinking verweigert wird.
  • Selbst wenn die Konfiguration des Dateisystemzugriffs des Webservers nicht ordnungsgemäß durchgeführt wurde, würde diese Methode verhindern, dass diese Dateien versehentlich veröffentlicht werden.

Bitte entschuldigen Sie meine unorthodoxen Programmierkonventionen. Jedes Feedback ist willkommen.

  • Ich mag die Nummer 2

    – Baim falsch

    18. April 2018 um 14:53 Uhr

1646889850 611 Direkten Zugriff auf eine PHP Include Datei verhindern
Eran Galperin

Der beste Weg, den direkten Zugriff auf Dateien zu verhindern, besteht darin, sie außerhalb des Dokumentstammverzeichnisses des Webservers zu platzieren (normalerweise eine Ebene darüber). Sie können sie immer noch einschließen, aber es gibt keine Möglichkeit, dass jemand über eine http-Anforderung darauf zugreift.

Normalerweise gehe ich den ganzen Weg und platziere alle meine PHP-Dateien außerhalb des Dokumentstammverzeichnisses, abgesehen von der Bootstrap-Datei – eine einsame index.php im Document Root, die mit dem Routing der gesamten Website/Anwendung beginnt.

  • Ich mag die Nummer 2

    – Baim falsch

    18. April 2018 um 14:53 Uhr

1646889851 713 Direkten Zugriff auf eine PHP Include Datei verhindern
NullUserException

Eine Alternative (oder Ergänzung) zu Chucks Lösung wäre, den Zugriff auf Dateien zu verweigern, die einem bestimmten Muster entsprechen, indem Sie so etwas in Ihre .htaccess-Datei einfügen

<FilesMatch "\.(inc)$">
    Order deny,allow
    Deny from all
</FilesMatch>

  • Ich glaube, es wäre besser, .inc.php zu verwenden, und es ist eine gängige Praxis

    – Lisa

    16. Dezember 2019 um 9:37 Uhr

986370cookie-checkDirekten Zugriff auf eine PHP-Include-Datei verhindern

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy