Moin!
Es geht ja nicht darum, welche Daten du im freundlichen Normalbetrieb erwarten kannst, sondern welche Daten dir in feindlicher Angriffsumgebung geschickt werden.
Richtig, und darum ging es mir auch nicht.
Ich hatte bereits erwähnt die Variablen vorher auf das ausschließliche Vorkommen von Buchstaben und eventuell Leerzeichen zu überprüfen.
Wie man damit Injection betreiben kann, musst du mir erklären.
Es geht nicht darum, durch irgendwelche Spezialbehandlung von Strings im Einzelfall auszuschließen, dass keine Injection stattfindet. Denn diese Spezialbehandlung kann man der Variablen, die in den SQL-String eingebaut wird, nicht ansehen.
Es geht darum, dass Code sicher aussehen muß - auf den ersten Blick! Und dass jegliche Abweichung davon sofort Augen- oder Kopfschmerz bereiten sollte.
Beim Einbau von variablen Anteilen in SQL-Strings bedeutet das: Bedingungsloses Escaping, egal welcher Variableninhalt zu erwarten ist.
Wenn ich jetzt also eh nur noch Buchstaben "durch gelassen" habe,
was soll ich noch escapen?
Wenn du irgendwann deine Prüfung auf Buchstaben mal veränderst, oder sie durch einen Fehler unwirksam wird (auskommentiert, Fallabfrage falsch geschachtelt, etc.), dann kommt es ohne Escaping unerwartet zu Problemen - mit Escaping kann es _nie_ zu Problemen kommen.
Wir alle sollten bestrebt sein, sichere Applikationen zu programmieren. Und das geht nur, indem man die häufigsten Anfängerfehler schon von vornherein ausschließt und Sicherheitsmechanismen trotzdem einbaut, obwohl durch weitergehende Überlegungen vielleicht herauskommen könnte, dass z.B. keines der ankommenden Zeichen durch das Escaping auch nur ein Bit geändert bekommt.
htmlspecialchars() sorgt dafür, dass alle eingegebenen Zeichen auch exakt wieder so im Text der Seite auftauchen - und nicht als HTML-Tags fehlinterpretiert werden.
Mit Umlauten könnte man dabei aber Probleme bekommen.
Nein, das ist falsch.
Natürlich muß man sich um das Encoding der Website Gedanken machen. Bei neuen erstellten Websites ist dieser Gedankengang aber ganz schnell beendet: Nimm UTF-8, und gut ist. Nur bei alten Websites ist die Sache diffiziler.
- Sven Rautenberg
"Love your nation - respect the others."