phpbar.de logo

Mailinglisten-Archive

[php] Re: Abändern alter PHP-Skripte (Zwischenergebnis 2)

[php] Re: Abändern alter PHP-Skripte (Zwischenergebnis 2)

Burkes burkes at gmx.de
Mit Jul 7 23:36:11 CEST 2004


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