Moin,
An dieser Lösung ist möglicherweise zu kritisieren, daß man von extern Variablenwerte einschleusen kann, aber da du ohnehin Werte prüfst, dürfte das nicht unbedingt schlimm sein. Der "Trick" ist, statt direkt auf Variablen zuzugreifen, diese aus den Hashes $HTTP_POST_VARS oder $HTTP_GET_VARS auszulesen.
Mir will immer nicht in den Kopf, warum das ein Problem sein soll. Ich meine, das ganze Skript ist doch extra dafür geschaffen worden, von extern Variablenwerte einzuschleusen, oder nicht? Es sollte also kein Problem sein, die globalen Werte zu benutzen, da man diesen eh nicht trauen kann, sie also im Zweifelsfall vom User manipuliert wurden.
Für die Variablenwerte die du selbst benutzt, _musst_ du natürlich sicherstellen, dass sie nicht vom User vorgegeben werden können, also am besten ist am Anfang des Skriptes einen Bereich zu haben, in dem man erstmal alle Variablen die man selbst benutzen will mit einem festen Wert belegt oder mit unset() behandelt. Das gilt insbesondere, falls du vorhast, die Information ob die Variablen die Eingabeprüfung korrekt überstanden haben, selbst in einer Variablen speichern willst.
Das folgende ist also eine der schlimmsten Sachen die du machen kannst:
<?php
// Variablen überprüfen
if(ist_ok($eingabe)) // oder so
$alles_klar = true;
if($alles_klar)
mysql_query(...); // Daten einfügen
?>
Noch ein wichtiger Punkt der an dem vorgeschlagenen Skript zu kritisieren ist: Die Variablen die vom User kommen, können gegebenenfalls HTML-Code oder Fragmente davon enthalten. Im einfachsten Fall geht es einfach nur schief, wenn der User ein " eingegeben hat und du die Variable in ein <input value=" "> knallst, im schlimmeren Fall handelst du dir Cross Site Scripting Probleme ein.
Also, ganz wichtig: _Alles_ was du ausgibst, und was vom User kommt ist als feindlicher HTML-Code zu betrachten und dementsprechend durch htmlentities() zu jagen. Und wo wir schon dabei sind, machen wir auch gleich noch ein stripslashes(), falls es nötig ist. Damit das nicht zuviel Aufwand machst, legst du dir dafür eine Funktion an.
Der grobe Code für dein Formular sieht also so aus:
<?php
function wp($text) { echo htmlentities( get_magic_quotes_gpc()? stripslashes($text) : $text ); }
unset($alles_klar); unset($hilfsvariable1); $fehlermeldungen=""; // ...
if($aktion == "Abschicken") {
$alles_klar = true;
if($eingabe < 0) { // Naja, oder so...
$fehlermeldungen .= "Das sollte größer 0 sein";
$alles_klar = false;
}
// evt. noch mehr überprüfungen
if($alles_klar) {
mysql_query(...) // Einfügen
// Ergebnisse anzeigen
exit();
}
}
?>
<!-- HTML-CODE -->
<?php if($fehlermeldungen!="") echo "Fehler: ".$fehlermeldungen; ?>
<form>
<input type="text" value="<?php wp($eingabe);?>">
<!--usw. usf. -->
(das hat natürlich noch Optimierungsmöglichkeiten)
Damit dürftest du einigermaßen sicher fahren. Bitte, bitte stell nicht noch ein anfälliges Formular ins Netz, davon gibt es schon genug.
--
Henryk Plötz
Grüße aus Berlin