Hallo,
ich habe aktuell ein paar Verständnisprobleme bzw. habe mich in das Thema Byte/Multibyte verrannt.
Also ich habe eine UTF-8 codierte Seite. Input und Output ist entsprechend nur UTF-8 zulässig.
Um mich vor XSS zu schützen, habe ich nun die folgende Funktion realisiert (deckt auch charset xss ab):
Soweit so gut.
Nun möchte ich einen Filter für Usernamen schreiben. Hier möchte ich neben der Prüfung auf einen validen Zeichensatz und das Escapen von Entities auch bestimmte Zeichen ausschließen.
Dazu zählt z.B. auch chr(160) (non-breaking space) oder chr(170) (soft hyphen).
Bei meiner Recherche bin ich auch auf die ganzen ASCII non-printing Zeichen gestoßen (chr(0) bis chr(31)).
Erstmal soweit mein Ergebnis dazu:
(ich weiß trim ist eigentlich nicht für Multi-Byte empfohlen, aber ich habe noch keinen Kommentar gefunden, der Probleme resultierte)
Nun meine Fragen dazu:
1.) Ersetze ich mit str_replace() versehentlich ein Byte eines Multibyte-Zeichens oder sind die 255 ASCII Zeichen "reserviert", so dass sowas nicht passieren kann?
2.) Treffe ich mit str_replace() überhaupt meine gewünschten Zeichen, wenn der Zeichensatz UTF-8 ist? Also gibt es für das jeweilige ASCII-Zeichen noch einen (zusätzlichen) entsprechenden UTF-8 Multibyte-Ersatz, den ich separat erkennen müsste?
ich habe aktuell ein paar Verständnisprobleme bzw. habe mich in das Thema Byte/Multibyte verrannt.
Also ich habe eine UTF-8 codierte Seite. Input und Output ist entsprechend nur UTF-8 zulässig.
Um mich vor XSS zu schützen, habe ich nun die folgende Funktion realisiert (deckt auch charset xss ab):
Code:
function filter_text($val, $charset='UTF-8') { return !mb_check_encoding($val, $charset) ? '' : htmlentities(trim($val), ENT_QUOTES, $charset); }
Nun möchte ich einen Filter für Usernamen schreiben. Hier möchte ich neben der Prüfung auf einen validen Zeichensatz und das Escapen von Entities auch bestimmte Zeichen ausschließen.
Dazu zählt z.B. auch chr(160) (non-breaking space) oder chr(170) (soft hyphen).
Bei meiner Recherche bin ich auch auf die ganzen ASCII non-printing Zeichen gestoßen (chr(0) bis chr(31)).
Erstmal soweit mein Ergebnis dazu:
Code:
function filter_username($val, $charset='UTF-8') { if (!mb_check_encoding($val, $charset)) { return ''; } if ($val != str_replace(array( "\n", // line feed "\r", // carriage return chr(0), chr(1), chr(2), chr(3), chr(4), chr(5), chr(6), chr(7), chr(8), chr(9), chr(10), chr(11), chr(12), chr(13), chr(14), chr(15), chr(16), chr(17), chr(18), chr(19), chr(20), chr(21), chr(22), chr(23), chr(24), chr(25), chr(26), chr(27), chr(28), chr(29), chr(30), chr(31), chr(127), chr(129), chr(141), chr(143), chr(144), chr(157), // non-printing ascii chr(160), // non-breaking space chr(173), // soft hyphen ), '', $val)) { return ''; } return htmlentities(trim($val), ENT_QUOTES, $charset); }
Nun meine Fragen dazu:
1.) Ersetze ich mit str_replace() versehentlich ein Byte eines Multibyte-Zeichens oder sind die 255 ASCII Zeichen "reserviert", so dass sowas nicht passieren kann?
2.) Treffe ich mit str_replace() überhaupt meine gewünschten Zeichen, wenn der Zeichensatz UTF-8 ist? Also gibt es für das jeweilige ASCII-Zeichen noch einen (zusätzlichen) entsprechenden UTF-8 Multibyte-Ersatz, den ich separat erkennen müsste?
Kommentar