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!');

















