Gibt es eine Möglichkeit, zu verhindern, dass ein Benutzer eine Datei anzeigt, sie aber trotzdem als Bestandteil einer anderen Datei in PHP ?
Dies ist die beste Lösung und gehört zum grundlegenden Schutz der Website.
Gibt es eine Möglichkeit, zu verhindern, dass ein Benutzer eine Datei anzeigt, sie aber trotzdem als Bestandteil einer anderen Datei in PHP ?
Wenn Sie
define('APP_RAN');
in der Datei, die es enthält, und setzen Sie dann
if(!defined('APP_RAN')){ die(); }
oder alternativ
defined('APP_RAN') or die();
(was leichter zu lesen ist)
in eingeschlossenen Dateien würde es sterben, wenn Sie direkt auf sie zugreifen.
Es wäre wahrscheinlich besser, alle eingebundenen Dateien oberhalb des DocumentRoot zu platzieren.
Wenn sich Ihre Indexseite zum Beispiel auf
/my/server/domain/public_html
Sie sollten die eingebundenen Dateien in
/my/server/domain/
Beide, auch wenn Sie nur eines verwenden können. Der Pfad ist einfacher zu implementieren, die Definition wird einige Zeit in Anspruch nehmen.
Mein Vorschlag:
<?php
if (__FILE__ == $_SERVER['SCRIPT_FILENAME']) {
header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found');
exit("<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\r\n<html><head>\r\n<title>404 Not Found</title>\r\n</head><body>\r\n<h1>Not Found</h1>\r\n<p>The requested URL " . $_SERVER['SCRIPT_NAME'] . " was not found on this server.</p>\r\n</body></html>");
}
else {
// your code
}
?>
1.) es wird geprüft, ob es direkt aufgerufen wird, sonst wird ein Fehler ausgegeben
2.) Es gibt eine 404-Standard-Apache-Fehlerseite aus (bitte vergleichen Sie mit Ihrer ursprünglichen 404-Seite oder fügen Sie diese Seite einfach ein), um die Sicherheit durch Unklarheit zu erhöhen.
3.) Der else-Teil verhindert eine teilweise Ausführung, während die Datei in die Live-Umgebung hochgeladen wird (PHP wartet nicht auf das "?>"). Sie brauchen ihn nicht, wenn Ihre eingebundene Datei nur eine Funktion / eine Klasse enthält.
if (!defined('FLAG_FROM_A_PARENT'))
// Works in all scenarios but I personally dislike this
if (__FILE__ == get_included_files()[0])
// Doesn't work with PHP prepend unless calling [1] instead.
if (__FILE__ == $_SERVER['DOCUMENT_ROOT'] . $_SERVER['SCRIPT_FILENAME'])
// May break on Windows due to mixed DIRECTORY_SEPARATOR
if (basename(__FILE__) == basename($_SERVER['SCRIPT_FILENAME']))
// Doesn't work with files with the same basename but different paths
if (realpath(__FILE__) == realpath($_SERVER['DOCUMENT_ROOT'].$_SERVER['SCRIPT_NAME']))
// Seems to do the trick
Stimmt; wenn jemand den Namen Ihrer Include-Datei, die nur Funktionen und Klassen enthält, erraten kann, wird er nur eine leere Seite sehen, wenn er versucht, sie anzuzeigen. Wenn Sie HTML mit einem Include ausgeben (was ich nicht gerne tue), können Sie es stattdessen in eine Funktion einfügen, die Datei einbinden und die Funktion aufrufen.
Dies ist eine gute Lösung, aber Vorsicht: Wenn Sie Ihre Skripte im öffentlichen Verzeichnis belassen, denken Sie daran, entweder a) sicherzustellen, dass Sie keine Syntaxfehler haben, oder b) die Anzeige von Fehlern zu deaktivieren, da diese sonst immer noch angezeigt werden, selbst wenn die Datei nur Funktionen/Klassen enthält.
Es sollte darauf hingewiesen werden, dass diese Technik nicht nur für die Sperrung des direkten Zugangs nützlich ist. Mit der "needs external variable"-Technik kann man einer Datei andere Funktionen geben, wenn man direkt darauf zugreift. So können Sie z. B. ganz einfach Variablen aus post abrufen und die primäre Funktion ausführen, anstatt nur darauf zu warten, dass Funktionen aufgerufen werden, und eine Antwort zu drucken, wodurch Sie die Datei in eine einfache REST-Schnittstelle verwandeln können.
Nicht wirklich. Erfahrungsgemäß bestehen einige Module in einigen Frameworks darauf, dass Ihr zusätzlicher Code an bestimmten Stellen platziert wird, z. B. in Laravel.
@liljoshu Ja, und Frameworks wie Laravel speichern die meisten Ihrer Dateien ... raten Sie mal, wo, außerhalb des Web Root.
@Erik gestern Wenn Sie den Luxus haben, an einer Website zu arbeiten, die ordnungsgemäß entworfen wurde, oder Sie hatten den Vorteil, die Website selbst zu entwerfen, was nicht immer der Fall ist, kann das der Fall sein. Das letzte Laravel, mit dem ich gearbeitet habe, hatte leider nichts anderes als Web Root. Und selbst dann liegen nicht alle Dateien außerhalb von web Root. Manchmal muss man im Web Root arbeiten, entweder weil die Situation es erzwingt oder weil ein Framework so funktioniert. Es ist definitiv a gute Antwort. Einfach nicht der einzige gute Antwort.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.