phpbar.de logo

Mailinglisten-Archive

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

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

Sebastian Mendel lists at sebastianmendel.de
Die Jul 6 09:39:49 CEST 2004


Burkes schrieb:

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

$HTTP_SERVER_VARS würde ich weglassen, das ist DEPRECATED


> 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???

wieso Superglobal? $PHP_SELF ist auch nicht superglobal wenn es selbst 
gesetzt wird ... dies oben ist kein Ersatz für die alte superglobale 
$PHP_SELF ... man sollte im gesamten Script alle Aufrufe von $PHP_SELF 
durch $_SERVER['PHP_SELF'] ersetzen


> 
> 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']

$HTTP_*_VARS ist DEPRECATED !

index.php?var=1

//register_gloabls = on
$var = $_REQUEST['var'];
function blah() { //$var existiert }

//register_gloabls = off
$var = $_REQUEST['var'];
function blah() { //$var existiert _nicht_ }


$name = $_REQUEST['name'];
ist kein ersatz für register_globals = on !

die einzige Richtige/Sichere variante ein Script auf register_gloabls = 
off umzustellen ist alle externen Variablen über ihre zugehörige 
superglobale aufzurufen


> 
> 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")):()

man sollte $_SESSION verwenden
session_is_registered() und session_register() ist DEPRECATED !


> 
> ################## Zusammenfassung Ende ########
> 
> Kann man das so lassen?

nein,
du empfiehlst register_gloabls = on, ganz oben
du empfiehlst das verwenden von DEPRECATED Variablen und Funktionen




-- 
Sebastian Mendel

www.sebastianmendel.de www.warzonez.de www.tekkno4u.de www.nofetish.com
www.sf.net/projects/phpdatetime        www.sf.net/projects/phptimesheet

php::bar PHP Wiki   -   Listenarchive