Mailinglisten-Archive |
Vielen Dank, Sebastian, Chris, Sven, für Euere Hinweise. Ich musste mich erst neu einlesen in die Themen "Superglobal" und "Session", weil ich ja, wie gesagt, Anfänger bin (Ich Freitag, nix verstehen). Ich hoffe, ich habe das jetzt alles richtig umgesetzt. Wenn nicht, bitte korrigiert die entsprechenden Stellen, wie ihr es formulieren würdet. Danke. Ab hier: Entwurf - 2. Fassung Anleitung für Umschreiben von Skripten für aktuelle PHP-Versionn ( >= PHP 4.1) ###################################################################### ################ Notfallmaßnahme für lokale Skripte bei Umstellung auf neuere PHP-Versionen I. Rein lokal eingesetzte Skripte, die nach PHP-Update nicht mehr funktionieren, und die nicht später im Netz eingespeist werden und auch nicht als Freeware verbreitet werden, können durch folgende Schnellmaßnahmen zum Laufen gebracht werden (evtl. u. Verwendung von phpinfo()): In der php.ini: Register_globals=on error_reporting = E_ALL & ~E_WARNING (oder: error_reporting = E_ALL^E_NOTICE) Im Skript selbst, am besten zu Beginn: $PHP_SELF = $_SERVER[‚PHP_SELF'] Diese Notfallmaßnahmen sind für Online-Skripte oder zu verbreitende Skripte nicht geeignet ###################################################################### ################## Anleitung für Umschreiben von Skripten Folgendes Schema gilt gleichgültig, ob auf dem verwendeten Server register_globals on gesetzt ist und error_reporting auf geringe Stufe gesetzt ist. 1a) Wenn im Skript $_SERVER['PHP_SELF'] statt $PHP_SELF verwendet wird, ist dieser Punkt erledigt. Es sei denn, man will das Skript an Dritte geben und abwärtkompatibel machen, dann die folgende Formel in Ziffer 1.b verwenden. Wenn PHP_SELF in alter Schreibeweise ($PHP_SELF) vorkommt, dann folgende Änderung im Skript (vor dem ersten Auftauchen von PHP_SELF): $PHP_SELF=$_SERVER['PHP_SELF']; oder, wenn das Skript verbreitet werden soll und abwärtkompatibel sein soll (wenn Skript auch auf einem Server mit alter PHP-Version vor 4.1 laufen soll) if(!empty($HTTP_SERVER_VARS['PHP_SELF'])) { $PHP_SELF = $HTTP_SERVER_VARS['PHP_SELF']; } else if(!empty($_SERVER['PHP_SELF'])) { $PHP_SELF = $_SERVER['PHP_SELF']; } else { $PHP_SELF = ''; } 1c) Alternativ kann man jedes $PHP_SELF im Text durch $_SERVER['PHP_SELF'] ersetzen. 2) Prüfen, ob alle Variablen im Text initialisiert sind Alle Variablen, die sich auf (potentielle) Formularparametern oder Cookie-Parametern beziehen, initialisieren. Zum Überprüfen kann man error_reporting auf E_ALL setzen und das Skript aufrufen, dort dann auf die Warnmeldung "Undefined Variable" achten. Dies sollte man aus Sicherheitsgründen auch dann tun, wenn die Error-Meldungen auf dem Online-Server unterdrückt werden (http://www.oreilly.de/catalog/progphpger/chapter/ch12.pdf) (http://www.informatik.tu-cottbus.de/~tk/lehre/Skriptprogrammierung_WS 0203/Sicherheit_in_Webanwendungen.pdf) Vorbemerkung zur Intialisierung $superuser = false; // = Intialisierung einer True/False Variable if (check_privileges( )) $superuser = true; oder: $name=""; // = Intialisierung einer Stringvariablen $name = $vorname." ".$nachname; 3) Die Übergabevariablen im Skript zu Beginn des Skripts oder bei jedem ersten Auftauchen umdefinieren: $name=""; // initialisieren $name = $_SERVER['NAME]; // ab jetzt funktioniert $name wieder. Bei Übergabevariablen (Formularparameter, z.B. www.php.net/xyz.php?name=meier) besteht noch die Gefahr, dass die behandelte Variable gar nicht übergeben wurde und es zu einer Warnmeldung kommt. Daher ist obige Formel zu erweitern: $name=""; if (isset($_SERVER['NAME']) $name = $_SERVER['NAME]; Alternative wäre, JEDES Auftauchen von "$name" durch $_SERVER['NAME'] zu ersetzen, dann ist aber noch auf erstmalige Intialisierung zu achten und die IF-Abrage zu verwenden. Hinweis für Erstellung neuer Skripte: $_SERVER['Variablenname'] ist im Gegensatz zur bisherigen $variablenname superglobal, weshalb überlegenswert ist, die o.g. Alternative zu verwenden, zumindest in Funktionen und Klassen. $_SERVER['Variablenname'] hat aber den Nachteil, dass damit keine variable Variable definiert werden kann. Vgl. Jason E. Sweat; http://www.zend.com/zend/art/art-sweat4.php Für all das bisher gesagte gibt es noch Alternativen für die Variable $_SERVER[], die aus Sicherheitsgründen überlegenswert sind. $_POST['VARIABLENNAME'] für alle mit Post übergebenen Formularvariablen (damit kann man sichern, dass der Parameter wirklich über das Formular kam und auf andere Weise an die URL angehängt wurde. $_GET['VARIABLENNAME'] für alle mit GET übergebenen Formularinhalte. $_COOKIES[] $_SESSION[] also am Skriptanfang oder bei jedem ersten Auftauchen umdefinieren: $name=""; if (isset($_POST['NAME']) $name = $_POST['NAME]; oder jeweils einzeln im Text statt $name künftig $_POST['NAME'] $HTTP_POST_VARS["name"] und $HTTP_GET_VARS["name"] etc. sollten nicht mehr verwendet werden. Sie werden irgendwann verschwinden. Von Schnellmaßnahmen wie extract($_SERVER) oder extract($_POST) wird aus Sicherheitsgründen dringend abgeraten. Vgl. Hierzu http://www.php.net/manual/en/function.extract.php Umstellung der Session-Befehle auf neue Befehle: Statt: $vorname="peter"; session_register("vorname"); jetzt: $_SESSION['VORNAME'] = "peter" ' Achtung - SESSION['VORNAME'] ersetzt nicht, wie das alte session_register, den vorher eigentlich notwendigen session_start() Befehl. Also eventuell noch vor der ersten Session-Variable den session_start-Befehl einbauen, wenn dieser fehlt, auch wenn Skript bisher funktionierte. ferner umstellen: Statt session_unregister() -> unset() verwenden Statt session_is_registered() -> isset() verwenden Aus dem PHP-Handbuch: Wenn Sie $_SESSION ...verwenden, sollten Sie nicht session_register(), session_is_registered() und session_unregister() verwenden. ###################################################################### ################################## Ende Anleitung Grüße Peter Burkes --
php::bar PHP Wiki - Listenarchive