Semikolon in MySQL
Thomas
- php
0 Philipp0 Thomas
0 Harry0 Sven Rautenberg
Hallo allerseits!
Habe ein kleine HP geschrieben, bei der man sich
anmelden kann und Artikel einstellen kann.
Jetzt habe ich aber was gelesen:
Was passiert, wenn sich jemand unter dem namen ' oder "
anmeldet?
Ich denke, solche Zeichen Sollte ich besser aus dem
Text entfernen.
Reicht dazu die Funktion htmlentities oder htmlspecialchars aus?
Welche ist besser?
Außerdem: Bei Benutzern, die das nicht absichtlich
machen sondern sich aus Unwissen mit irgend einem
unerlaubten Sonderzeichen im Dateinamen anmelden, kann
ich nicht einfach die Sonderzeichen herausstreichen:
Ich muß irgendwie wissen, ob überhaupt welche drin
sind. So etwas geht doch mit regular expressions, oder?
Noch eine Frage: Welche Zeichen sind in MySQL
eigentlich nicht erlaubt?
Vielen Dank schon mal im Voraus
Thomas
Hallo allerseits!
Hallo!
Was passiert, wenn sich jemand unter dem namen ' oder "
anmeldet?
Du meinst die Zeichenfolge ' OR '1'='1
Du darfst halt nicht einfach per SQL abfragen, ohne dass du die Eingabe vorher überprüft hast. Also nicht
"select ... where name='$name' AND password='$password'", da sonst mit der obigen Zeichenfolge das hier passiert:
select ... where name='' OR '1'='1' AND password='' OR '1'='1'
Tata! Und so wird der erste Benutzer ausgewählt.
Also vorher auf nicht erlaubte zeichen überprüfen...
htmlspecialchars und htmlentities ist nicht sinnvoll, da diese eigentlich nur zum schreiben in HTML-Files gedacht sind...
MfG TarZ
Dankschö!
Die Funktion addslashes() habe ich auch zwischendurch mal gesehen... Mit StripSlashes entfernt mal sie wieder, oder?
Nur wie erkläre ich es dem Benutzer, dass er sich mit Backslashes anmelden soll?
Dafür die Überprüfung, im Text ist das ja egal...
Danke an alle!
Holladiewaldfee,
Reicht dazu die Funktion htmlentities oder htmlspecialchars aus?
Welche ist besser?
Ich für meinen Teil würde ja einfach addslashes() hernehmen ;-)
unerlaubten Sonderzeichen im Dateinamen anmelden, kann
ich nicht einfach die Sonderzeichen herausstreichen:
Ich muß irgendwie wissen, ob überhaupt welche drin
sind. So etwas geht doch mit regular expressions, oder?
Sehr restriktiv:
if(!preg_match("/^([a-zA-Z0-9_-]|\s)$/i", $benutzername))
echo "bla fehler laber";
Ciao,
Harry
Moin!
Was passiert, wenn sich jemand unter dem namen ' oder "
anmeldet?
Du kannst generell prüfen, dass im Anmeldenamen nur Buchstaben und Ziffern enthalten sind.
Es macht aber durchaus Sinn, Einträge, die in die Datenbank gehen, _immer_ mit der Funktion mysql_escape_string() in die Datenbank zu schreiben. Diese Funktion sorgt dafür, dass alle Sonderzeichen entsprechend escaped sind, also keinen Schaden anrichten können.
Ja, die Funktion addslashes() macht (bei MySQL) im Prinzip dasselbe. Und außerdem ist noch die Option "magic_quotes_gpc" eingeschaltet, die ohnehin alle Benutzereingaben mit Slashes versieht. Im Prinzip sind alle diese Funktionen also nur dafür da, dass unwissende PHP-Programmierer sich nicht gleich beim ersten Mal die Datenbank zerschießen.
Es ist aber vom Prinzip her besser, wenn du prüfst, ob magic_quotes_gpc eingeschaltet ist, und in diesem Falle dessen Slashes mit stripslashes() entfernst und danach mit mysql_escape_string() den String für die Datenbank vorbereitest, als dich auf Automatismen zu verlassen. Was ist, wenn der Serveradmin plötzlich magic_quotes_gpc ausschaltet? Du wirst davon nichts merken, weil mit "normalen" Daten erstmal alles so läuft wie bisher. Bis es dann irgendwann zu spät ist. Außerdem bist du, wenn du es ordentlich programmierst, systemunabhängig und kannst deine Skripte auf jedem beliebigen PHP-Server laufen lassen, nicht nur auf dem, auf dem du es entwickelt hast.
Reicht dazu die Funktion htmlentities oder htmlspecialchars aus?
Welche ist besser?
Keine dieser Funktionen hilft bei deinem Problem.
- Sven Rautenberg