phpbar.de logo

Mailinglisten-Archive

[php] Re: Abändern alter PHP-Skripte [hier: Zwischenergebnis]

[php] Re: Abändern alter PHP-Skripte [hier: Zwischenergebnis]

Burkes burkes at gmx.de
Die Jul 6 08:39:51 CEST 2004


Vielen Dank für die Antworten

Ich versuche das mal als Zwischenergebnis zusammenzufassen, wobei ich
weglasse, was wackelig und nicht unbedingt nötig ist. Ich habe
inzwischen noch zwei sehr informative Beiträge über Sicherheit beim
Programmieren entdeckt, die ich mit berücksichtigt habe.

http://www.oreilly.de/catalog/progphpger/chapter/ch12.pdf
http://www.informatik.tu-cottbus.de/~tk/lehre/Skriptprogrammierung_WS0
203/Sicherheit_in_Webanwendungen.pdf


Zusammenfassung und Entwurf einer Anleitung (in Kurzform):

#############################

I. 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:

In der php.ini:

Register_globals=on
error_reporting =  E_ALL & ~E_WARNING
(oder: error_reporting = E_ALL^E_NOTICE)

Am Beginn des Skripts  $PHP_SELF durch $_SERVER[‚PHP_SELF'] ersetzen:

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 = '';
}

II. Wenn die Skripte später ins Netz gespielt werden oder schon im
Netz verwendet werden:

Mit phpinfo() 

a) Version prüfen (über 4.1), 
b) register_globals prüfen
c) error_reporting prüfen. 

1. Wenn eigener Server (PHP-ini-Einstellungen können geändert werden:
Notfallmaßnahme register_global auf on dabei auch gleich
Error_reporting ändern und obige $php_Self-Routine. Dann aber auf
lokalem PC mit Hilfe von strengeren Einstellungen die Skripte ändern
(III), denn die veränderten Systemeinstellungen sollen Programmierer
zwingen, sicherere Skripte zu schreiben - decken also Schwachstellen
auf.

2. Wenn kein Zugang zu PHP-INI-Einstellungen,  wie in III vorgehen.

III. Gründliche Umschreibung der Skripte (u.U. abwärtskompatibel)

1a) Wenn $_SERVER['PHP_SELF']  im Skript vorkommt ist dieser Punkt
gecheckt. Es sei denn, man will das Skript an Dritte geben und
abwärtkompatibel machen, dann die folgende Formel in Ziffer III.1.b
verwenden:

1b)Wenn PHP_SELF in anderer Schreibeweise vorkommt, dann folgende
Routine an den Anfang der Datei:

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 = '';
}
Man kann $PHP_SELF auch durch $FREIERNAME ersetzen, in obiger Routine
und überall im Text            // fraglich, ob dann noch
superglobal???

2)  Alle Variablen, die sich auf (potentielle) Formularparametern
oder Cookie-Parametern   beziehen, initialisieren., zumindest wenn
Error-Meldungen kommen. Schwachstellen können auch lokal mit
php-ini-Einstellung error_reporting=E_ALL aufgedeckt werden,
ansonsten muss man das Skript durchgehen. 
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)

Keine Intialisierung - Sicherheitslücke:

<?php
if (check_privileges( )) {
$superuser = true;
}
?>

Mit Intialisierung

<?php
$superuser = false;
if (check_privileges( )) {
$superuser = true;
}
?>

Das war ein Beispiel für TRUE/FALSE. Ansonsten wird so intialisiert:

$name="";
$name=$_SERVER['NAME']

und damit die Fehlermeldung auch unterdrückt wird:

    if (isset($_SERVER{'NAME'}) $name = $_SERVER{'NAME};

Das heisst, überall dort, wo eine Übergabevariable zuerst auftaucht
(oder am Anfang des Skripts) erfolgt diese Umsetzung und ab dann kann
im Skript einfach $name verwendet werden.

Statt        $name=$_SERVER['NAME']
Kann man auch verwenden:

$_POST["name"] // bei POST-Methode:; oder:
$HTTP_POST_VARS["name"] 
$_GET["varname"] // Bei GET-Methode:; oder:
$HTTP_GET_VARS["name"]
$_COOKIE["name"]
$_SESSION["name"]. 
$_REQUEST['name']

Schnellmaßnahmen wie extract($_REQUEST) sind gefährlich. Lieber jede
Variable gesondert definieren.

Auch die Session-Variablen müssen intialisiert werden, sonst führen
sie bei einem PHP-Update zu den Warnmeldungen.

sinnvollerweise sollte man ausserdem jede session-variable
registrieren, dann geht man sicher, dass sie da ist:

session_name("dumme_session");
session_start();
(!session_is_registered("sess_var"))?(session_register("sess_var")):()

################## Zusammenfassung Ende ########

Kann man das so lassen?

Peter Burkes
burkes at gmx.de


php::bar PHP Wiki   -   Listenarchive