42 Stimmen

PHP: Prüfen, ob eine Datei direkt geladen wird, anstatt sie einzubinden?

Gibt es eine Möglichkeit, zu verhindern, dass ein Benutzer eine Datei anzeigt, sie aber trotzdem als Bestandteil einer anderen Datei in PHP ?

53voto

Tyler Carter Punkte 58971

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/

2 Stimmen

Dies ist die beste Lösung und gehört zum grundlegenden Schutz der Website.

0 Stimmen

Was ist besser: die Definition oder der Weg?

0 Stimmen

Beide, auch wenn Sie nur eines verwenden können. Der Pfad ist einfacher zu implementieren, die Definition wird einige Zeit in Anspruch nehmen.

15voto

mgutt Punkte 5317

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.

2 Stimmen

Um PHP sowohl unter Linux als auch unter Windows zu unterstützen, habe ich _ _ FILE _ _ mit str_replace(' \\ ', '/', _ _ DATEI _ _)

0 Stimmen

Nützlich, weil es nicht von externen Variablen abhängt.

14voto

tim Punkte 2028
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

12voto

user187291 Punkte 52315

Verwenden Sie in Ihren Dateien keinen globalen Code, sondern nur Funktionen und Methoden. Dann brauchen Sie sich nicht um Include oder direkte Verwendung zu kümmern.

3 Stimmen

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.

1 Stimmen

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.

0 Stimmen

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.

8voto

Erik Punkte 20180

Speichern Sie die Datei einfach außerhalb Ihres Web-Roots.

0 Stimmen

Nicht wirklich. Erfahrungsgemäß bestehen einige Module in einigen Frameworks darauf, dass Ihr zusätzlicher Code an bestimmten Stellen platziert wird, z. B. in Laravel.

1 Stimmen

@liljoshu Ja, und Frameworks wie Laravel speichern die meisten Ihrer Dateien ... raten Sie mal, wo, außerhalb des Web Root.

1 Stimmen

@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.com

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.

Powered by:

X