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 ?

7voto

moebius_eye Punkte 554
if (__FILE__ == $_SERVER['DOCUMENT_ROOT'].$_SERVER['PHP_SELF']){
  die("Direct access forbidden");
}

Es funktioniert unabhängig vom Standort. (Vielen Dank an @col-sharpnel für den Hinweis auf eine unvollständige, aber gute Lösung).

0 Stimmen

-1 Verlassen Sie sich nicht auf PHP_SELF, da dies eine Sicherheitslücke in site.com/myfile.php/badstring.php darstellt.

1 Stimmen

Ich verstehe nicht, wie dies eine Schwachstelle sein kann. site.com/myfile.php/badstring.php führt bei einer einfachen Installation einfach zu einem 404-Fehler.

0 Stimmen

Php_self wird vom Agenten auf der Grundlage der Anfrage-URI gesetzt. /index.php/dummy_hijack.php wird nicht zu /index.php aufgelöst. $_SERVER['DOCUMENT_ROOT'].$_SERVER['SCRIPT_NAME'] tut es. Ihr Beispiel ist in gewisser Weise sicher, aber nicht genau. Benutzer, die basename verwenden, sind in Schwierigkeiten, wenn sie PHP_SELF verwenden. if (basename( DATEI ) == basename($_SERVER['PHP_SELF']))

5voto

moebius_eye Punkte 554

Da ist die get_included_files Funktion. Sie könnten sie so verwenden:

if ( empty(get_included_files()) ) die("Direct access forbidden");

4 Stimmen

Zu beachten ist, dass ab PHP5 diese Bedingung nie erfüllt wird. Siehe dieser Kommentar in den Dokumenten . Die aktuelle Datei befindet sich immer im Array, so dass das Array immer mindestens 1 Element hat, also nie leer ist. In PHP5+ könnte man versuchen if ( count(get_included_files()) === 1 ) die("Direct access forbidden"); stattdessen.

0 Stimmen

Das wird funktionieren; get_included_files()[0] === __FILE__

2voto

zneak Punkte 129366

Unter Apache ist dies einfach: Fügen Sie eine <Files> Direktive in Ihrer .htaccess, um den Zugriff von einem Webbrowser zu verhindern. Dies gilt nicht für PHP includes und es ist eine gute Praxis, mehrere Dateien vor dem Zugriff des Browsers zu verstecken (obwohl Sie normalerweise versuchen werden, alle nicht zugänglichen Dateien in einem einzigen Verzeichnis zusammenzufassen).

<Files="myprivatefile.php">
    deny from all
</Files>

Unter einem anderen Webserver können Sie die Datei aus Ihrem Dokument Root ausblenden, aber in einigen Fällen (z. B. wenn Ihre Skripte open_basedir d in einer strengen Weise), wird es nicht funktionieren.

0 Stimmen

Dies ist der "Standard"-Weg in den meisten Geschäftsumgebungen, die den LAMP-Stack verwenden (wo Sie PHP am häufigsten in der Geschäftswelt sehen).

2voto

HelpNeeder Punkte 6201

Prüfen Sie, wie viele Dateien enthalten sind...

if(count(get_required_files()) < 2) { die(); }

Oder wie viele es mindestens sein sollten, statt 2

1 Stimmen

Das scheint ziemlich narrensicher zu sein, wow. (Solange Sie daran denken, es zu tun.)

1 Stimmen

Scheint ziemlich gut zu sein, solange die Datei, auf die Sie es setzen, keine Dateien erfordert (oder Sie setzen das Häkchen über der Anforderung der Dateien).

1 Stimmen

get_included_files()[0] === __FILE__

1voto

Daan Punkte 1809

Ich würde mich für Chacha102's Lösung .

Außerdem, wie der Titel Ihrer Frage sagt, " wie man siehe "Sie können dies auch tun, ohne eine Variable definieren zu müssen, indem Sie

// secret.php is the name of this file.
if($_SERVER["SCRIPT_FILENAME"]=='secret.php') die();

4 Stimmen

Dies wird nicht funktionieren, da SCRIPT_FILENAME den vollständigen Pfad und nicht nur den Dateinamen enthält.

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