Daten hinzufügen Prozess
Ich möchte Benutzereingaben von einem Formular in die Tabelle einer Datenbank eintragen. Zuerst muss ich die Variablen des Formulars holen, dann muss ich sie prüfen, das heist mit meinen Erwartungen velgleichen. Entspricht die Benutzereingabe nicht den zulässigen Parametern, muss sie gelöscht werden. Nur wenn die Vorgaben erfüllt sind, kann der Eintrag in die Datenbank oder die Ausgabe auf der Webseite erfolgen.
User Eingaben im Formular
Jede Eingabe ist potenziell gefährlich!
Die Usereingaben dürften keines Falls ungeprüft in die Datenbank geschrieben werden!
- Enthält die Eingabe überhaupt Zeichen? Leere Einträge hinzufügen bringt ja auch nichts.
- Bei kurzen Einträgen kann ich auch auf eine maximale Anzahl Zeichen prüfen, die nicht überschritten werden darf.
- Enthält die Eingabe Zeichen, die in Codezeilen vorkommen, wie Anführungszeichen (" oder '),
HTML-Tags (< >) oder das Ampersand (&), dann werden diese durch die PHP-Funktion
htmlentities($benutzereingabe,ENT_QUOTES)unschädlich gemacht. -
Die Farbe wurde mit einer Auswahlliste gewählt, ich weiss also ganz genau,
was die zulässigen Werte sind. Sie sind vom Datentyp Zahl und dreistellig.
(int)$benutzereingabe;wandelt einen String in einen Integer um oder auch die Funktion:intval($benutzereingabe);. Ich könnte auch fragen 'Ist das ein nummerischer String?' und wenn die Antwort TRUE ist weiterfahren:if (is_numeric($benutzereingabe)) { weiterfahren; }. Formulare übermitteln immer Strings, ich kann also nicht fragen, 'Ist dies eine Zahl?' etwa soif(is_int($benutzereingabe)){...}. -
Für Einträge in die Datenbank, kann ich ganz böse Worte suchen, z.B. mittels
der Funktion
stristr($benutzereingabe,"BöSESWORT");oder löschen z.B. durchstr_replace("BöSESWORT","Ersatz",$benutzereingabe);. Auch reguläre Ausdrücke können Schlüsselworte herausfiltern. Gelänge es nämlich das Schlüsselwotz DELETE, TRUNCATE oder DROP einzuschleusen, könnte dies die ganze Tabelle Löschen, UPDATE könnte alles überschreiben. - Nach jeder Prüfung muss ich das Ergebnis (OK oder ERROR, etc.) in einer Variablen speichern (z.B. $test). Nur wenn die Prüfung erfolgreich war (z.B. $test=="OK"), erfolgt ein Eintrag in die Datenbank und ev. in die Logdatei. Sonst erfolgt vielleicht eine E-Mail an den DB-Manager und auch ein Logeintrag.
- Ich gebe einem Angreifer keine Hinweise durch (Details in den) Fehlermeldungen.
- Siehe auch: Sicherheit Und: Reguläre Ausdrücke
// erst holen
$neu_veilchen = isset($_POST["neu_veilchen"]);
$neu_color = isset($_POST["neu_color"]);
$neu_beschrieb = isset($_POST["neu_beschrieb"]);
// dann prüfen bzw. unschädlich machen
if ($neu_veilchen == "" || $neu_veilchen == " ") { // || bedeutet 'oder'
$test1 = "LEER";
} elseif (stristr($neu_veilchen,"href")){
$neu_veilchen = "";
$test1 = "URL gefunden, kein Eintrag";
} else {
$neu_veilchen = htmlentities($neu_veilchen,ENT_QUOTES);
$test1 = "OK";
}
$neu_color = (int)$neu_color;
if ($neu_beschrieb == "" || $neu_beschrieb == " ") {
$test2 = "LEER";
} elseif (stristr($neu_beschrieb,"href")){
$neu_beschrieb = "";
$test2 = "URL gefunden, kein Eintrag";
} else {
$neu_veilchen = htmlentities($neu_veilchen,ENT_QUOTES);
$test2 = "OK";
}
// und ausgeben
print "Die Benutzereingaben nach der Prüfung sind:
Test 1=".$test1.", Test 2=".$test2."<br />\n";
echo "Veilchenname: ".$neu_veilchen;
echo "Farbe: ". $neu_color;
echo "Beschreibung: ". $neu_beschrieb;
Veilchenname:
Farbe: 0
Beschreibung:
Daten der Datenbank-Tabelle hinzufügen
Dann muss ich die Verbindung zu Server und Datenbank herstellen (falls keine besteht).
Jetzt werden in einer Variablen namens '$eintrag' die ganzen Einträge gespeichert;
nach dem INSERT INTO Befehl zuerst die Tabelle dann (in Klammern und durch Kommas getrennt
die Spaltennamen) dann VALUES (in Klammern und Anführungszeichen die Werte -
ich füge die obigen Variablen des Forumars ein).
Beachten: Die doppelten
und einfachen Anführungszeichen!
Der Wert im Feld 'id' wird durch die Tabelle (so wie sie angelegt ist)
jeweils automatisch um 1 erhöht und muss hier nicht eingegeben werden.
Beachte: Tabelle und eine Spalte können gleich heissen (veilchen).
INSERT INTO
mysql_query()
<?php
// Nur bei erfolgreichem Test!!!
if ($test1=="OK" && $test2=="OK"){ // && bedeutet 'und'
// Eintrag zusammenstellen
$eintrag = "INSERT INTO veilchen (veilchen, color, beschrieb) VALUES
('$neu_veilchen', '$neu_color','$neu_beschrieb')";
// Ausführung
$ausfuehren = mysql_query($eintrag);
}
// Das geht auch kompakter (ohne neue if und nur einer Variablen $test).
?>
Der Eintrag wird nun wie bei der Abfrage durch den Befehl
mysql_query() ausgeführt.
Stimmen Anzahl Spalten und Werte nicht überein, erfolgt kein Eintrag in die Datenbank.
Die Verbindung muss nicht zwingend gekillt werden.
Bei Gelingen könnte eine Bestätigung ausgegeben oder ein
Eintrag an eine Log-Datei angefügt werden. Fertig!
<?php
if (isset($ausfuehren) == 'true'){ // falls TRUE zurückgegeben wurde hat es geklappt
echo "Danke für die Blumen.";
} else { echo "Kein Blumentopf gewonnen."}
?>
Die Tabelle wird ganz unten auf der Seite Tabelle ausgeben ausgegeben.