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