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