Sicherheit und usernamen

ThiKool

Erfahrenes Mitglied
Hallo Community,

Ich programmiere gerade an einem kleinen eingabescript wofür sich user registrieren sollen.

Meine Frage ist nun:
Ist es sinnvoll nur Buchstaben und Zahlen als Usernamen zuzulassen da ich gerne mit user='$usernamen' Abfragen möchte oder kann die Abfrage gestört erden, wenn ein User in seinem Namen beispielsweise ein $ hat?

Auch bei der texteingabe habe ich festgestellt, dass zB html Codes möglich sind bzw. dargestellt werden. Dies möchte ich auch unbedingt unterbinden.

Danke schonmal
 
Hi

du fragst nach einer Mischung aus SQL-Injections, XSS, Unicode und so einigem.
Nur so als Stichwortgrundlage.

Antwort in Kürze: Nein, nicht sinnvoll.
a) Es schränkt die Benutzer unnötig ein.

b) Bei schlechter Programmierung kann es zwar Probleme geben,
aber dann programmiert man eben nicht schlecht... Die User können nichts dafür.
real_escape_string, Prepared Statements, html_special_chars, striptags, mb_*, ...

c) Bei "nur Buchstaben und Zahlen": Was ist ein Buchstabe? Klingt blöd, ist aber alles andere als trivial.
a und ä und Å und Л und 地 sind Buchstaben
Unicode 0x0303 (und einige andere) sind Buchstabenteile
0xf1 und 0xFFFE00630303 und 0xC3B1 sind alles die selben Buchstaben
2 ist eine Zahl, ² auch, ① vielleicht auch? Und was ist ɘ?
...sicher gibt es gute Implementierungen, die "Buchstabe ja/nein" sagen können.
Aber das wird nicht so sein, wie du es erwartest.


Und user='$usernamen' ist kein gültiger PHP/SQL-Code,
keine Ahnung was du genau machen willst.
 
Zuletzt bearbeitet:
Ok wusste gar nicht das das so umfangreich ist.

Wie wird sowas denn im "Normalfall" gehandhabt bzw wie gehe ich da nun am besten ran?
 
Hi,

ich würde alle Datenbankanfragen ausnahmslos über Prepared Statements absenden. Hierbei musst du dich nicht um richtiges Escaping (vorallem zwecks Sicherheit) Gedanken machen, das erledigt dir PHP und MySQL von sich aus.

Grüße,
BK
 
Und in die andere Richtung (PHP->Browser) gibts eben htmlspecialchars etc.,
die auch praktisch schon alles erledigen, so dass jeder Name angezeigt werden kann
(Es ist kein "was ist erlaubt" sondern "was ist nicht erlaubt", und das ist relativ einfach)

Und nicht nur sicherheitsrelevant, aber je nach Programm auch: Richtiger Umgang mit Unicode.
Einfacher technischer Teil:
*PHP-Dateien als UTF-8 abspeichern (jeder gute Editor hat das einstellbar).
*Beim Zeug was an den Browser gesendet wird mit header und im HTML <meta> festlegen dass es UTF-8 ist
*Bei DB-Verbindungen auch UTF-8 festlegen (wie man das macht ist abhängig
von verwendeten PHP-Funktionen. Geht in einer Zeile)
*Die DB selber (Tabellen, Spalteninhalte etc.) als UTF-8 einstellen

Wenn man PHP nur dazu verwendet um Variablenwerte zwischen Browser und DB herumzureichen wars das.
Für alles Andere muss man aufpassen, angefangen bei Vergleichen mit Variablen
oder Zugriff auf einzelne Buchstaben eines Strings usw.

Ist leider nicht schnell beschreibbar, was man alle wissen sollte.
Multibytesachen (mb_...), BOMs, Verschiedene Bytefolgen für den selben Text
(http://php.net/manual/en/class.normalizer.php), Buchstabenteile,
"unsichtbare" Zeichen die keinen Platz brauchen usw.
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück