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 ?

1voto

ZeekDaGeek Punkte 21

Wenn Sie verhindern wollen, dass sie jemals angezeigt wird, wenn sie nicht enthalten ist, gibt es einen automatisierten Weg.

if (basename(__FILE__) == basename($_SERVER['PHP_SELF'])) header("HTTP/1.0 404 Not Found");

Auf diese Weise funktioniert es auch dann, wenn Sie den Dateinamen ändern oder ähnliches.

3 Stimmen

Dies funktioniert nicht, wenn der eingeschlossene Dateiname denselben Namen hat wie der globale.

1voto

mechimdi Punkte 308
if($argv[0] == basename(__FILE__))
    include_once('/path/to/file.php');

0 Stimmen

Nahe dran, aber immer noch nicht ganz; schlägt fehl, wenn der Aufruf aus einem anderen Verzeichnis erfolgt

1voto

Chris Middleton Punkte 5134

Es gibt viele gute Antworten in diesem Thread - hier ist eine, die noch nicht erwähnt wurde.

Sie können Ihre eingebundenen PHP-Dateien mit einem i in der Erweiterung, z.B. someincludedfile.phpi und konfigurieren Sie dann Apache so, dass er keine phpi Dateien. Voilà.

Nachteile:

  • (!) stark von der Apache-Konfiguration abhängt (so dass Sie anfällig sind, wenn jemand diese Zeile vernachlässigt) -- und in einem solchen Fall könnte der Browser das gesamte PHP-Skript im Klartext sehen, da es nicht an PHP weitergeleitet wird (wirklich schlecht!)
  • es kann lästig sein, die enthaltenen Dateien umzubenennen

Vorteile:

  • macht deutlich, welche Dateien in Ihrem Code enthalten sein sollen und welche nicht
  • Sie müssen Ihre Dateihierarchie nicht umstellen.

Ich persönlich würde die Dateien lieber in ein Verzeichnis außerhalb des Dokumentenstamms verschieben, aber wenn Sie eine große Legacy-Anwendung haben, könnte dies schneller zu ändern sein.

Link: http://www.ducea.com/2006/07/21/apache-tips-tricks-deny-access-to-certain-file-types/

0voto

sdaau Punkte 34279

Nur um die Lösungen mit $_SERVER Variablen - unten ist eine kleine .php-Datei, und in den Kommentaren ist eine Kopie einer bash Test, den ich unter Ubuntu durchgeführt habe; der Punkt ist, dass sich diese Variablen je nach Art des Zugriffs und je nachdem, ob Symlinks verwendet werden, ziemlich stark ändern können ( Beachten Sie auch, dass ich im untenstehenden Code das ' <code>?\></code> ' in der echo-Anweisung, sonst bricht die Syntaxfarbe; entfernen Sie den Backslash, wenn Sie den Code versuchen ) :

<?php

function report($label, $value) {
  printf ("%23s: %s\n", $label, $value);
}

report("DOCUMENT_ROOT.PHP_SELF",  $_SERVER['DOCUMENT_ROOT'].$_SERVER['PHP_SELF'] );
report("SCRIPT_FILENAME",         $_SERVER['SCRIPT_FILENAME'] );
report("__FILE__",                __FILE__ );
report("PHP_SAPI",                PHP_SAPI );

/*
# the test (bash):

home~$ mkdir /tmp/ptest
home~$ cd /tmp/ptest/
ptest$ ln -s /real/path/to/varcheck.php .
ptest$ echo '<? require_once "varcheck.php"; ?\>' > varcheckincl.php

# ... and in a separate terminal, run
# php (>5.4) cli server at same (/tmp/ptest) location:

ptest$ php-5.4.10 -S localhost:8000

# back to first terminal, the test - and output:

ptest$ php varcheck.php
 DOCUMENT_ROOT.PHP_SELF: varcheck.php
        SCRIPT_FILENAME: varcheck.php
               __FILE__: /real/path/to/varcheck.php
               PHP_SAPI: cli

ptest$ php -r 'require_once "varcheck.php";'
 DOCUMENT_ROOT.PHP_SELF: -
        SCRIPT_FILENAME:
               __FILE__: /real/path/to/varcheck.php
               PHP_SAPI: cli

ptest$ php varcheckincl.php
 DOCUMENT_ROOT.PHP_SELF: varcheckincl.php
        SCRIPT_FILENAME: varcheckincl.php
               __FILE__: /real/path/to/varcheck.php
               PHP_SAPI: cli

ptest$ wget http://localhost:8000/varcheck.php -q -O -
 DOCUMENT_ROOT.PHP_SELF: /tmp/ptest/varcheck.php
        SCRIPT_FILENAME: /tmp/ptest/varcheck.php
               __FILE__: /real/path/to/varcheck.php
               PHP_SAPI: cli-server

ptest$ wget http://localhost:8000/varcheckincl.php -q -O -
 DOCUMENT_ROOT.PHP_SELF: /tmp/ptest/varcheckincl.php
        SCRIPT_FILENAME: /tmp/ptest/varcheckincl.php
               __FILE__: /real/path/to/varcheck.php
               PHP_SAPI: cli-server
*/
?>

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