Moin Moin!
Du mußt JEDE EINZELNE Benutzereingabe validieren. Validieren ist nicht Escapen. Validieren bedeutet, die Benutzereingabe auf Typ, Größe, Wert, Konsistenz zu prüfen. Wenn Du das konsequent machst, und zwar so paranoid wie möglich, dann ist ein Angriff über manipulierte Benutzereingaben schon einmal extrem schwierig.
Das öffnet ja völlig neue Türen, ich habe mittlerweile auch einen Einstieg gefunden, jetzt fehlen mir die Ideen, was sollte Sinnvollerweise alles geprüft werden, bzw. auf was soll geprüft werden?
Was ich bis jetzt habe (ich bin mir Sicher, es geht auch schöner):
[code lang=php]if($_GET) {
foreach($_GET as $keys => $vals) {/* Wenn 'http' oder 'inc' in den $_GET-Variablen vorkommen, Fehler melden */
if ((preg_match_all("|http|", "$keys $vals", $mein_get)) OR (preg_match_all("|inc|", "$keys $vals", $mein_get)))
{
echo 'Hab ich dich!';
}
Öm, hier machst Du es genau falschrum. Suche nicht nach "bösem" und nimm den Rest als "gut". Du kennst nicht alles "böse", und wenn es einen neuen Angriffsweg gibt, mußt Du nachrüsten.
Nimm stattdessen alles als "böse" an und beweise für jeden einzelnen Parameter, dass er gut ist. Und zwar für jeden nach individuellen Regeln. Wenn Du eine numerische ID und einen bis zu 255 Zeichen langen Text erwartest, prüfe den einen Parameter mindestens auf "nur Ziffern" plus Wertebereich und den anderen mindestens auf die Länge.
Auf Dauer wirst Du Dir wohl die eine oder andere Validierungsroutine anlegen -- isValidCount(), isValidInteger(), isValidFloat(), isValidName(), isValidISBN(), isValidURL(), isValidEMail(), usw. (die letzen beiden nur eingeschränkt, Du kannst bestenfals das Format prüfen).
/* Wenn $_GET Key oder Value mehr als 30 Zeichen hat, Fehler melden */
if ((strlen($keys) >= 30) OR (strlen($vals) >= 30))
{
echo 'URI zu lang';
}
Das ist irgendwie wirr. Warum erlaubst Du keine Parameter-Namen über 30 Zeichen? Warum keine Parameter-Werte über 30 Zeichen? Und was soll diese Prüfung überhaupt?
Um noch einmal auf das Beispiel ID+Text zurückzukommen:
http://www.example.com/hurtmeplenty.php?id=42;text=bla%20fasel
http://www.example.com/hurtmeplenty.php?id=42;text=bla%20fasel;waaah-grosses-chaos-wird-geschehen-der-weltuntergang=ist-nahe-wir-werden-alle-sterben-und-nur-weil-dieser-parameter-komplett-ignoriert-wird
Dich interessieren nur "id" und "text". Also ignoriere den Rest. Kein Grund, wegen überflüssiger Parameter Panik zu schieben. Weitergeben darfst Du den Müll natürlich auch nicht -- erst wenn der Parameter validiert ist.
isValidInteger($_GET['id']) or die "Crackeralarm!";
isValidString($_GET['text'],1,255) or die "Crackeralarm!";
machWasMit($_GET['id'],$_GET['text']);
Im Einsatz könnte ich dann statt Fehlermeldungen auszugeben, das Script beenden.
Oder stumpf zum Formular zurückfallen und dort über fehlerhafte Eingaben meckern.
Was wäre hier alles Sinnvoll
Prüfe jeden einzelnen Parameter so restriktiv wie möglich.
und was sollte ich definitiv meiden?
Ungeprüfte Parameter verarbeiten. Escaping und Validierung verwechseln.
Alexander
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".