PHP Blogger

Startseite Schreib mir ne Mail! RSS Abo Webnews

Versteckte Daten absichern mit Tokens

Den Fehler macht jeder Entwickler nur einmal: Sich darauf verlassen, das die User einer Applikation keinen Mist bauen. Sobald man den ersten Vollidiot auf seiner Applikation hat, stellt sich heraus: Alles was keine Validierung hat, wird gnadenlos beim ersten Test plattgemacht.

Wenn man eine Web-Applikation ohne Sessions aufzieht, muss man oft Metainformationen (die man zum Darstellen eines Dialogs benötigt) quer durch alle Formulare schleifen. Da nimmt das Unheil schon seinen Lauf - meist ist man zu faul, um die Daten aus Hiddenfeldern nochmal zu validieren. Und die Rache folgt direkt hinterher, da kannst Du sicher sein.

Wie kann man seine Hidden-Fields absichern, ohne jedes Formularfeld mit einer Funktion zu prüfen (Was sicher der bessere Weg wäre, aber das machen ohnehin nur die wenigsten)? Die Zauberworte heissen Token oder Hashwert. Um die zu generieren bringt PHP von Haus aus schon schöne Funktionen mit. Die allerschönste ist MD5, und die verwenden wir auch gleich ;-)

Gut, hier ein Ausschnitt aus dem imaginären Formular:

<input name="meta[egal]" type="hidden" value="12345" />
<input name="meta[wurst]" type="hidden" value="54321" />

Jetzt kommt unser Token als Hidden-Field noch dazu:

<input name="token" type="hidden" value="?????" />

Nur wie setzen wir den Token so zusammen, das er hieb und stichfest ist und trotzdem reproduzierbar bleibt? Ganz easy: wir verketten $egal und $wurst und hauen ein MD5 drum:

$token= md5($egal . $wurst);

Ohje, da hab ich doch völlig vergessen, das alle Benutzer von grund auf bösartig sind ;-) Der Token ist sooo einfach, das ihn jedes Script-Kiddy problem nachbauen kann. Also kommt noch eine Prise Magie hinzu und schon haben wir die Latte etwas höher gelegt:

$token= md5($egal . $wurst . "supergeheimersaltwert");

Ersetze einfach “supergeheimersaltwert” durch irgendwas (Am besten total verwirrte Zeichenfolgen, aber das fällt Dir ja nicht schwer). Und damits sauber eingebaut ist, packen wir den Saltwert noch in eine Konstante:

define('app_saltwert', "kk*32245kj?0Z%123");
$token= md5($egal . $wurst . app_saltwert);

Das packen wir ins Formular:

<input name="token" type="hidden" value="<?= $token ?>" />

Und jetzt muss der Krempel noch beim Formularempfänger geprüft werden. Dafür bauen wir uns eine kleine Funktion:

function ValidToken($dataArr)
{
    $submittedToken= $_POST['token'];
    $generatedToken= '';
    $tmpData= '';   

    if(!$dataArr) $dataArr= array();
    foreach($dataArr as $data)
        $tmpData.= $data;   

    $generatedToken= md5($tmpData . app_saltwert);
    return ($submittedToken == $generatedToken);
}

Super, jetzt noch die eigentliche Überprüfung:

if(ValidToken($_POST['meta']))
{
    // Formular verarbeiten
}
else die('Hack detected!');
Teile und genieße
  • MisterWong
  • del.icio.us
  • Technorati
  • Digg
  • Slashdot
  • YahooMyWeb
  • Furl
  • Ma.gnolia
  • Spurl
  • Netscape
  • StumbleUpon
  • MyShare
  • blogmarks

Rassi meint dazu:

31. März 2007 um 08:34

Hallo , k

timi meint dazu:

31. März 2007 um 16:14

Hey Volker, Rettung naht - Mail ist unterwegs ;-)

phpblogger.net » Formulare gegen XSS Angriffe absichern - Frische Ideen rund um PHP meint dazu:

25. Juni 2007 um 06:51

[...] zur Absicherung von Formularen gab es bereits Artikel hier im Blog (”Versteckte Daten absichern mit Tokens”) Ich denke man sollte den Sicherheitsgedanken bei PHP weiter unterstützen, daher werden [...]

Brake meint dazu:

23. Juli 2007 um 12:58

Cool! Its really cool…

butzi meint dazu:

22. April 2008 um 16:08

Warum das Rad immer neu erfinden, in fast jedem Framework sind Formularvalidatoren enthalten (PEAR, Zend, …)

Generell aber eine gute Idee.

timi meint dazu:

22. April 2008 um 16:50

Soll nur zeigen wies funktioniert. Trotzdem nie vergessen: Viele Agenturen haben eigene Frameworks und halten sich an keinen Standard…

PHPKing meint dazu:

14. November 2008 um 07:34

Halli Hallo

meiner Meinung nach ist das Script nicht gerade sicher.
Ich habe immer noch die Möglichkeit mit ganz einfachen Mitteln,
das Formular zu nutzen.

Man lädt mit php über einen proxy die Seite in eine Variable.
Der Inhalt der Seite wird dann untersucht.

Man holt sich die Feldnamen und die Values aus dem String.
Baut einen neuen Post Request zusammen und sendet die Seite.

Und schon hat man mit ganz einfachen mitteln dein Formular für spams
missbraucht.

Das Problem ist, das der übergebene Token im Formular wieder mit
zurück gesendet wird und somit habe ich immer zugriff darauf.

timi meint dazu:

14. November 2008 um 08:21

Na, Du Namenloser PHP King, wer lesen kann ist klar im Vorteil ;)

Hier gehts ja auch nicht um einen Spamschutz, sondern nur darum, hidden Fields zu validieren, die unverändert bleiben sollen…

Ps: Verhindern, das man ein Formular mit einem Bot ausliest und abschickt, kann man ohnehin nicht. es geht im Nachhinein nur um eine wirkungsvolle Detection der ankommenden Spam-Formulare. Und das funktioniert recht gut. Wir mal einen Blick auf http://akismet.com/ - Super einfache Anbindung…

Schönen Gruß

RSS für Kommentare zu diesem Artikel · TrackBack URI

Schreib Deine Meinung