Zum Inhalt springen

Umlaute im Usernamen mit: newloginbox, sr_feuser_register, kb_md5fepw

Erstellt am 12. November 2007 · 12 Antworten · letzte Antwort am 6. Mai 2009

Tags: Frage

Jehu ·

Hallo Leute,

ich habe ein Problem mit FE-Usernames mit Umlauten.
Sobald der Username einen Umlaut enthält ist kein Login mehr möglich.

TYPO3 4.1.1 mit [BE][forceCharset] = utf-8

Plugins:
kb_md5fepw 0.4.0
sr_feuser_register 2.5.8
newloginbox 3.1.0

Datenbank:
MySQL-Zeichensatz: UTF-8 Unicode (utf8-)

Ich habe gesucht, aber bisher keine konkrete Problemlösung gefunden, außer den Hinweis mit den UTF-Einstellungen, die aber seit der Installation schon korrekt sind.

Grüße
Jehu

vironic ·

Das Problem hatte ich auch. Hat mich ganz schön genervt bei >1500 importierten Mitgliedsdaten...

Das Problem liegt bei kb_md5fepw. Dies sorgt für eine MD5-Verschlüsselung von FE-User-Passwörtern im Backend und Frontend. Nach Umstellung auf UTF-8 und Installation von kb_md5fepw funktionierte das Login bei mir nicht mehr bei Benutzernamen, die Sonderzeichen (öäüß etc.) enthielten.

Hintergrund
Ursache ist vermutlich eine fehlerhafte MD5-Implementation:

Nach FE-User-Login überprüft kb_md5fepw die Eingabe gegen die gespeicherten Benutzerdaten (Ext. kb_md5fepw: class.tx_kbmd5fepw_sv1.php). Die entsprechende Zeile lautet

$OK = $this->compareUident($user, $this->login, 'superchallenged');

Die Überprüfung erfolgt also in der Methode compareUident($user, $loginData, $security_level='') in t3lib/class.t3lib_userauth.php ab der Zeile

switch ($security_level)    {
            case 'superchallenged':

Hier wird das im Login-Formular eingegebe Passwort (string)$loginData['uident']) gegen einen kombinierten MD5-Hash verglichen ((string)md5($user[$this->username_column].':'.$user[$this->userident_column].':'.$loginData['chalvalue']))

Das eingegebene Passwort selbst wird vorher von kb_md5fepw MD5-verschlüsselt und hier liegt wahrscheinlich das Problem: Die Verschlüsselung erfolgt per JavaScript in class.tx_kbmd5fepw_newloginbox.php ab der Zeile

function superchallenge_pass(form) {
        var pass = form.pass.value;

Diese Verschlüsselung ist wahrscheinlich nicht UTF-8 konform, kann zumindest jedoch nicht mit Sonderzeichen korrekt umgehen. Der MD5 Hash wird aus dem Benutzernamen, dem Passwort und einem Challange-Wert gebildet. Die Verwendung des Benutzernamens in der Verschlüsselung erklärt dann auch die Fehlfunktion.

Lösung
Das Problem habe ich mit einem quick-and-dirty Workaround beseitigt:

In class.tx_kbmd5fepw_sv1.php wird der Aufruf von compareUident ersetzt durch:

    // Checking password match for user:
            //$OK = $this->compareUident($user, $this->login, 'superchallenged');
            $OK = FALSE;
            if( md5($_POST['pass']) === $user['password']){
                $OK = TRUE;
            }

Das per POST ausgelesene Passwort wird also per MD5 verschlüsselt und mit dem Datenbank-Wert ($user['password']) verglichen. Hier könnte man statt $_POST['pass'] auch die entsprechende TYPO3-Variable nehmen (habe gerade vergessen, wie die heisst).

In class.tx_kbmd5fepw_newloginbox.php wird das JavaScript gelöscht per $js='':

function loginFormOnSubmit(&$params, &$ref) {
		$js = '
	function superchallenge_pass(form) {
		var pass = form.pass.value;
		if (pass) {
			var enc_pass = MD5(pass);
			var str = form.user.value+":"+enc_pass+":"+form.challenge.value;
			form.pass.value = MD5(str);
			return true;
		} else {
			return false;
		}
	}
';
// reset sucking $js:
$js = '';

Fazit: Zwei kleine Änderungen im kb_md5fepw-Code. Danach läuft das Login ohne Probleme und benötigt zudem kein Javascript mehr.

Gruß,
Kai

steffenk ·

deine Fehleranalyse ist richtig, Dein patch aber nicht.

Hier sollte die Ursache geklärt werden, also muss md5.js in utf-8 audgeführt werden.

Das sollte sich leicht so realisieren lassen:
<script type="text/javascript" src="md5.js" charset="UTF-8"></script>

vironic ·

Ist ja auch kein Patch sondern - wie geschrieben - ein Work-Around (eben quick & dirty, soll einfach funktionieren). Bei mir läuft's jedenfalls gut...

<script type="text/javascript" src="typo3/md5.js" charset="UTF-8"></script> funktioniert leider nicht. In typo3/md5.js findet sich die Implementation des md5-Alorithmus, aber ich habe zu wenig Ahnung von JS, um das auf Fehler zu checken.

Ehrlichgesagt stört mich auch, dass man JavaScript für das Login-Formular benötigt. Wenn man das JS wie oben beschrieben 'rausnimmt, funktioniert es auch mit ausgeschaltetem JS im Browser. Wenn einem ein unverschlüsseltes Password per POST zu unsicher ist, kann man ja z.B. SSL nehmen. Die restliche Kommunikation liefe sonst eh per Klartext (Kontodaten etc.). Irgendwie ist mir deshalb noch nicht klar geworden, warum die Passwörter schon beim Absenden per md5 verschlüsselt werden.

mavo ·

Hallo,

ich habe auch Probleme mit Passwörtern die Umlaute enthalten.
Ich habe die md5 Extension, feuserloginsystem und sr_feuser_register auf ner 4.1 TYPO3 Installation laufen.

Ist es wichtig, dass das JS wie oben beschrieben als uft-8 charset läuft?

matze73 ·

Hallo,

nachdem ich auch über dieses Problem gestolpert bin, habe ich die Ehre fast ein Jahr nach Eröffnung des Themas hier eine weitere Lösung vorstellen zu können. 🙂

Wie 'vironic' schon vermutete, liegt der Fehler in der client-seitigen MD5-Funktion, die mit Sonderzeichen / Umlauten nicht umgehen kann.

Die Lösung liegt darin, das Javascript 'typo3/md5.js' zu ersetzen.

Eine Javascript-Library, die zumindest mit UTF-8 zurecht kommt (Latin1 weiss ich nicht) ist z.B. hier zu sehen (es gibt sicher noch andere): http://www.webtoolkit.info/javascript-md5.html

Als neues "typo3/md5.js" hinterlegt, klappt der MD5 superchallenged Login dann auch mit Umlauten im Usernamen.

vironic ·

Super - das ist ein sehr guter Hinweis. Das werde ich bei der naechsten Installation mal ausprobieren.

Es wundert mich nur, dass eine Korrektur des Problems noch nicht in TYPO3 umgesetzt wurde. Ich hatte das damals auch als Bug gemeldet. Soweit ich weiss, wird kb_md5fepw aber nicht mehr weiterentwickelt oder gewartet. Eigentlich sollte die md5-Kodierung direkt ins System und nicht nur als Erweiterung verfuegbar sein.