Zurecht werden sich meine Leser seit Montag gefragt haben, wo denn eigentlich nun die versprochenen Resultate der Umfrage unter meinen Leser bleibt?
Klar, werden meine Kritiker sagen: Die Resultate sind niederschmetternd, deshalb veröffentlicht er sie nicht. Falsch. Oder: think eMeidi benötigt noch ein wenig Zeit, um die Resultate zu fälschen. Seine abgrundtiefe Bösheit hat er ja bei drei Partyguide-Hacks unter Beweis gestellt – wieso sollte er hier anders handeln?
Nun, um es kurz zu machen – nichts von alledem ist wahr. Hier sind die Resultate:
- Ja, such dir endlich ein richtiges Hobby! – 22
- Nein, ohne Partyguide-Hacks ist das Leben todlangweilig! – 41
Quelle: Resultate der Umfrage
Das Resultat ist nicht berauschend, aber ich hätte nicht gedacht, dass mein Tun bei der Mehrheit der Abstimmenden nicht auf unverständliches Kopfschütteln stösst, wie das Partyguide-Fanboys immer darstellen möchten.
Scripts richtig absichern
Natürlich wäre es lächerlich, derart über die Unfähigkeit der Partyguide-Programmierer herzuziehen, und dann dieselben Böcke zu schiessen wie Oberprogrammierer Jason und seine Argonauten. Ich habe deshalb die bei mir üblichen Sicherheitsstandards auch bei diesem Mini-Script angewendet. Ich schlage vor, dass Jason und seine Scripting-Slaves nun ihre Ohren spitzen und genau mitlesen. Hier steht ganz, ganz, ganz viel wichtiges, wie man sichere Web-Scripts entwickelt (gilt nicht nur für PHP – die grundlegenden Regeln gelten für alle Scriptingsprachen):
- register_globals = off. Jeder ernstzunehmende PHP-Programmierer, der persönliche Daten von Benutzern in seiner DB liegen hat, muss den entsprechenden Abschnitt im PHP-Manual gelesen haben. Wenn nicht: An die Wand mit ihm.
- POST und nichts anderes. Die Formulardaten müssen in den $_POST-Variablen daherkommen. Ist das $_POST-Array leer, bricht das Script mit die(); ab. $_REQUEST und $_GET werden nicht beachtet (auf Partyguide übrigens schon …) Dies verhindert, dass Spassvögel wie Kollege fixnetdata (s. unten), die mit wget und GET-Variablen Amok laufen (Script-Kiddie halt), Schaden anrichten können.
- <input type=“hidden“> Die Variable process des Submit-Buttons muss auch im $_POST-Array vorkommen, sonst ist etwas faul. Es wäre dann zu vermuten, dass die Abfrage nicht von einem Browser aus gesendet wurde.
- Don’t trust GPC: Alles was von Clients kommt, betrachtet man per se als nicht vertrauenswürdig. Plausiblitätstest sind nötig (besonders beim dritten Partyguide-Hack mangelte es eben gerade an diesem Plausiblitätstest. Motto: „Der Client will das Feld passwort durchsuchen – dann durchsuchen wir es halt und geben es zurück. Er wird schon wissen, wieso er das will“.). Ich speichere also nicht einfach $_POST['value'] direkt in die Datenbank, sondern a) wandle es mit intval(); in einen Integer-Wert um und prüfe dann, ob der Wert 0 oder 1 entspricht. Falls nicht, stirbt das Script mit die();
- Loggen, loggen, loggen: Man nimmt bei einer solchen Umfrage eben halt auch nicht einfach nur das Abstimmungsresultat entgegen. Ich loggte – sofern alle vorangegangen Tests bestanden wurden – folgende Informationen:
- Datum & Uhrzeit: Sehr wichtig, vgl. Abschnitt Falschwähler in den Resultaten
- IP-Adresse: Wer sendet die Anfrage? (beachte hierbei auch $_SERVER['X-FORWARDED-FOR'], das von einigen Proxy-Server mitgesendet wird und die tatsächliche IP-Adresse des Clients enthält. Sowohl bei proxy.unibe.ch wie auch proxy.hispeed.ch wird dieser Wert mitgesendet – von anonymen surfen als keine Spur, wenn auch kaum jemand dieses Feld mitloggt).
- User Agent: Mit welchem Browser wird abgestimmt?
Der Witzbold von fixnetdata
Keine Ahnung, wer du bist, aber du hast noch viel zu lernen:
- Zuerst stimmst du manuell 28 Mal ab.
- Danach zeigst du dein wahres Können, indem du wget bemühst und doch tatsächlich meinst, dass ich GET-Variablen akzeptiere werde.
Gerade zweitere Abstimmungsfälschung fand ich sehr amüsant und machte mich mit der Vorgehensweise anhand der access.log kundig:
ibook:~/Desktop mario$ cat access_log.2006-07-12 | grep fixnet | grep HEAD | wc -l 9562
9562 Aufrufe gab es also insgesamt von Herr … nennen wir ihn … fixnetdata (oder war es eine sie? dann sollten wir uns einmal kennen lernen … *grins*).
Hier ein Beispiel:
117-183.63-81.stat.fixnetdata.ch - - [12/Jul/2006:16:10:31 +0200] "HEAD /scripts/vote.php?value=0 HTTP/1.1" 200 - "-" "curl/7.13.1 (powerpc-apple-darwin8.0) libcurl/7.13.1 OpenSSL/0.9.7i zlib/1.2.3" 117-183.63-81.stat.fixnetdata.ch - - [12/Jul/2006:16:10:31 +0200] "HEAD / HTTP/1.1" 200 - "-" "curl/7.13.1 (powerpc-apple-darwin8.0) libcurl/7.13.1 OpenSSL/0.9.7i zlib/1.2.3"
Erkenntnis am Rande: Ist es nicht überaus Schade, dass solche Personen auch Mac-User sind?
Und wann startete und endete die Attacke eigentlich?
cat access_log.2006-07-12 | grep fixnet | grep HEAD | cut -d " " -f 4 [12/Jul/2006:15:51:55 ... [12/Jul/2006:16:10:37
Wenn das sein Arbeitgeber wüsste …
So, und jetzt nähme mich Wunder, was du dir dabei gedacht hast. Natürlich darfst du anonym antworten, das passt zu deinem Charakter.