Bobo: Include erkennen

Hallo,

ist es möglich zu erkennen, ob eine Datei included wurde oder nicht?
Ich habe zB die Datei index.php und eine inc.php. In der index.php steht nun

include(inc.php);  
...

Nun ist es für den Benutzer aber an sich ja kein Problem auch die inc.php direkt aufzurufen (anstatt die index.php), da sie bei mir in einem öffentlichen Verzeichnis liegt.
Das möchte ich aber verhindern.

Weiss jemand wie ich innerhalb der inc.php herausfinden kann, ob diese direkt aufgerufen oder included wurde oder wie ich generell den Direkt-Aufruf verhindern kann?

... mal abgesehen davon, dass ich in der index.php eine Variable setzen könnte, die in der inc.php überprüft wird :)

Gruss,
Bobo

  1. Lieber Bobo,

    Nun ist es für den Benutzer aber an sich ja kein Problem auch die inc.php direkt aufzurufen (anstatt die index.php), da sie bei mir in einem öffentlichen Verzeichnis liegt.

    Design-"Fehler"?

    Das möchte ich aber verhindern.

    Designfehler!

    Weiss jemand wie ich innerhalb der inc.php herausfinden kann, ob diese direkt aufgerufen oder included wurde oder wie ich generell den Direkt-Aufruf verhindern kann?

    $_SERVER['SCRIPT_FILENAME'] ?

    ... mal abgesehen davon, dass ich in der index.php eine Variable setzen könnte, die in der inc.php überprüft wird :)

    Wie Du willst.

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
  2. Nun ist es für den Benutzer aber an sich ja kein Problem auch die inc.php direkt aufzurufen (anstatt die index.php), da sie bei mir in einem öffentlichen Verzeichnis liegt.
    Das möchte ich aber verhindern.

    Du solltest (imho) deine Struktur verändern, sodass auf Scripts die nur inkludiert werden kein direkter Zugriff möglich ist. ".htacces" ist dafür wohl das beste "Stichwort"...

    Wenn du in deinem Root-Verzeichnis einen Sub-Verzeichnis anlegst in dem alle Scripts liegen die inkludiert werden einfach den Client-Zugriff sperren (via .htacces) und fertig.

    ist es möglich zu erkennen, ob eine Datei included wurde oder nicht?

    Wenn du nicht weißt ob ein Script eingebunden wurde oder nicht solltest du vielleicht auch mal deine Struktur im Allgemeinen überdenken.

    MfG
    ich

    1. Hi,

      Du solltest (imho) deine Struktur verändern, sodass auf Scripts die nur inkludiert werden kein direkter Zugriff möglich ist. ".htacces" ist dafür wohl das beste "Stichwort"...

      Nö. Ein Verzeichnis zu benutzen, das gar nicht erreichbar ist (also eins außerhalb der documentroot des Apache), ist noch besser.

      Abgesehen davon wäre das Stichwort eher authentification, denn eine .htaccess (mit 2 s) ist dafür nicht unbedingt notwendig.

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      O o ostern ...
      Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
  3. Hi,

    da sie bei mir in einem öffentlichen Verzeichnis liegt.
    Das möchte ich aber verhindern.

    dann mach das doch.
    Verhindere, daß sie in einem öffentlichen Verzeichnis liegt.
    Alles außerhalb des documentroot bietet sich an.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
  4. Hi!

    ist es möglich zu erkennen, ob eine Datei included wurde oder nicht?
    ... mal abgesehen davon, dass ich in der index.php eine Variable setzen könnte, die in der inc.php überprüft wird :)

    Wenn register_globals (immer noch) eingeschaltet ist, kann man diese Variable einfach überschreiben. Besser wäre eine Konstante.

    Der Aufruf der inc.php brächte dem Aufrufer gar nichts, wenn kein Code ausgeführt wird, der irgend ein sofortiges Ergebnis bringt. Das Zuweisen von Variablen ist harmlos, ebenso das Deklarieren von Funktionen und Klassen.

    Ansonsten kann man testen, ob __FILE__ ungleich dem aufgerufenen Script ist, das in einer ser $_SERVER-Einträge genannt wird. Und man könnte den debug_backtrace() auswerten, was aber ungleich aufwändiger als der Dateinamensvergleich ist.

    Abgesehen von diesen direkten Lösungen ist es besser, das Problem durch Verwendung eines Außerhalb-DocumentRoot-Verzeichnisses ganz zu vermeiden. Dazu braucht es eine Verzeichnisstruktur ähnlich jenem Beispiel. Die Wurzel des Kundenverzeichnisses und die projektspezifischen Wurzeln sowie alle Verzeichnisse "neben" den docroots sind unereichbar, wenn alle zum Hosting-Paket gehörenden Domains (inklusive Inklusivdomains bei manchen Hostern (1&1 zum Beispiel)) nur auf diese docroot-Verzeichnisse zeigen und nicht auf Wurzeln.

    Lo!