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 Anzahl von Includes nicht erreicht wird. Beachten Sie, dass die Basisseite vor PHP5 nicht als Include betrachtet wird.
2: Definieren und Überprüfen 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, wurde die Ausführung nicht von der Basisseite aus gestartet, und PHP wurde nicht mehr ausgeführt.
Beachten Sie, dass aus Gründen der Portabilität über Upgrades und zukünftige Änderungen hinweg die 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 für Protokollierungs- und Analysezwecke sowie zum Generieren geeigneter Antworten hinzugefügt werden checkdefined.php
.
Kredit, wo Kredit fällig ist: Die brillante Idee der Portabilität entstand aus dieser Antwort .
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 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 bei einer einzelnen Serverkonfiguration oder über eine Adress-Whitelist für eine Serverinfrastruktur mit mehreren Servern oder Lastenausgleich.
4: Token-Autorisierung
Ähnlich wie bei der vorherigen Methode kann GET oder POST verwendet werden, um ein Autorisierungstoken an die Include-Datei zu übergeben:
if($key!="serv97602"){header("Location: ".$dart);exit();}
Eine sehr unordentliche Methode, aber vielleicht auch die sicherste und vielseitigste zugleich, wenn sie richtig eingesetzt wird.
5: Webserver-spezifische Konfiguration
Auf den meisten Servern können Sie Berechtigungen für einzelne Dateien oder Verzeichnisse zuweisen. Sie können alle Ihre Includes in solchen eingeschränkten Verzeichnissen ablegen und den Server so konfigurieren, dass sie verweigert werden.
In APACHE wird die Konfiguration beispielsweise in der .htaccess
Datei gespeichert . Tutorial hier .
Beachten Sie jedoch, dass serverspezifische Konfigurationen von mir nicht empfohlen werden, da sie die Portabilität zwischen verschiedenen Webservern beeinträchtigen. In Fällen wie Content Management-Systemen, in denen der Verweigerungsalgorithmus komplex ist oder die Liste der verweigerten Verzeichnisse ziemlich groß ist, werden Rekonfigurationssitzungen möglicherweise nur ziemlich grausam. Am Ende ist es am besten, dies im Code zu behandeln.
6: Das Platzieren umfasst in einem sicheren Verzeichnis AUSSERHALB des Site-Stamms
Am wenigsten bevorzugt aufgrund von Zugriffsbeschränkungen in Serverumgebungen, 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 des
htdocs
Ordners anfordern, 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 es ein normales Programm mit den erforderlichen Berechtigungen kann.
- Indem Sie die Include-Dateien in dieses Verzeichnis stellen, können Sie sicherstellen, dass der PHP-Server auf sie zugreifen kann, während dem Benutzer die Verknüpfung verweigert wird.
- Selbst wenn die Dateisystemzugriffskonfiguration des Webservers nicht ordnungsgemäß durchgeführt wurde, würde diese Methode verhindern, dass diese Dateien versehentlich öffentlich werden.
Bitte entschuldigen Sie meine unorthodoxen Codierungskonventionen. Jedes Feedback wird geschätzt.