Mailinglisten-Archive |
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