Xtc2oxid - Probleme bei Passwörtern mit Umlauten

Hi,

die Migration von xtc auf oxid hat in einem ersten Test soweit funktioniert, Probleme gibt es nur mit Passwörtern von Kunden aus xtc (einfach md5 kopiert ohne salt) die Umlaute beinhalten, diese können sich nicht anmelden, Kunden mit Passwörtern ohne Umlaute hingegen schon.

Ich vermute es liegt an der Zeichenkodierung. Ich stelle es mir so vor, dass das vom Kunden eingegebene Passwort “konvertiert” wird bevor es in md5 umgewandelt wird, mir ist unklar ob xtc dies immer gemacht hat und oxid nicht oder andersherum.

Oxid sowie xtc sind mit UTF-8 installiert worden und es gibt auch sonst keine Darstellungprobleme.

Ich hoffe Ihr könnt mir bei dem Problem helfen.

Danke und Grüße

crus

Hi crus,

probier mal, ob es klappt, wenn Du vor dem Imort mit iconv in UTF-8 konvertierst.

Gruß

Hi Marco,

vorab eine Ergänzung, das Frontend von xtc läuft auf “ISO-8859-15”.

Dein Vorschlag klappt nicht, nach meinen Verständnis dürfte dies auch nicht klappen, da ich ja nur den MD5 hash in UTF-8 konvertieren würde. Damit es funktioniert, müsste ich das eigentliche Passwort von “ISO-8859-15” in “UTF-8” konvertieren, nur den Zugriff auf das eigentlich Passwort soll MD5 ja verhindern. Oder habe ich hier etwas missverstanden?

mein Lösungsversuch im Detail:

Ich bin dabei von einem xtc-fork auf oxid PE Edition umzusteigen. Dabei ergibt sich folgendes Problem:

In xtc wurde im Frontend “ISO-8859-15” verwendet und dementsprechend basieren die aus den Passwörtern generierten MD5 hashes auf den Passwörtern in “ISO-8859-15” Format.

Alle Stamm- und Bewegungsdaten werden per Skript (danke avenger) in die oxid-DB migriert. Da ich die MD5 hashes nicht rückumwandeln kann, werden diese ohne Anpassung der Zeichenkodierung in die oxid-DB geschrieben.

Oxid soll komplett in “UTF-8” laufen und dadurch können sich Kunden, die sich bereits in xtc ein Konto erstellt haben und in den Passwörtern z.B. Umlaute verwendet haben, nicht anmelden.

Nach meinem Verständnis musste ich nur einen Weg finden, dass beim Login, das vom Kunden eingegebene Passwort zusätzlich in “ISO-8859-15” konvertiert wird. Realisiert habe ich dies über eine Codeanpassung der oxuser.php. Bei folgenden Punkten bräuchte ich bitte Euren Rat:

  1. Könnt Ihr Euch bitte die Code-Anpassung anschauen und mir sagen ob dies so in Ordnung ist. (Ich bin kein PHP-Programmierer, eher versierter Anwender und mir meines Laien"wissen" bewußt.)
  2. Um es update-sicher zu machen, würde ich dies gerne noch als Modul einbinden, mir ist aber nach dem Lesen mehrer Tutorials immer noch einiges unklar.
  • Kann ich über die /modules/functions.php Funktionen aus der Klasse “oxuser” überladen?
  • Falls nein, kann ich dies über ein Modul realisieren?

Code:
(Dieselbe Codeanpassung habe ich auf für die “public function encodePassword” gemacht.)

/application/models/oxuser.php

protected function _getLoginQuery( $sUser, $sPassword, $sShopID, $blAdmin )
    {
        $myConfig = $this->getConfig();
        $oDb = oxDb::getDb();

        $sUserSelect = is_numeric( $sUser ) ? "oxuser.oxcustnr = {$sUser} " : "oxuser.oxusername = " . $oDb->quote( $sUser );

/* angepasster Code */
		if ( strlen( $this->oxuser__oxsalt->value ) === 0 )
		{
		$sPassword = $oDb->quote( $sPassword );
		$sPassword = mb_convert_encoding($sPassword, "ISO-8859-15", "UTF-8");
		
		$sPassSelect = " oxuser.oxpassword = MD5( CONCAT( ".$sPassword.", UNHEX( oxuser.oxpasssalt ) ) ) ";
		}
		else
		{
		$sPassSelect = " oxuser.oxpassword = MD5( CONCAT( ".$oDb->quote( $sPassword ).", UNHEX( oxuser.oxpasssalt ) ) ) ";
		}
/* angepasster Code */
		
/* ursprünglischer Code 
		$sPassSelect = " oxuser.oxpassword = MD5( CONCAT( ".$oDb->quote( $sPassword ).", UNHEX( oxuser.oxpasssalt ) ) ) ";
*/
		
		
        $sShopSelect = "";
		



        // admin view: can only login with higher than 'user' rights
        if ( $blAdmin ) {
            $sShopSelect = " and ( oxrights != 'user' ) ";
        }

        $blStagingMode = false;
        $blDemoMode = false;
        $sWhat = "oxid";
            if ($myConfig->isDemoShop()) {
                $blDemoMode = true;
            }

        $sSelect = "select $sWhat from oxuser where oxuser.oxactive = 1 and {$sPassSelect} and {$sUserSelect} {$sShopSelect} ";
        if ( ( $blDemoMode || $blStagingMode ) && $blAdmin ) {
            if ( $sPassword == "admin" && $sUser == "admin" ) {
                $sSelect = "select $sWhat from oxuser where oxrights = 'malladmin' ";
            } elseif ( $blDemoMode ) {
                $oEx = oxNew( 'oxUserException' );
                $oEx->setMessage( 'EXCEPTION_USER_NOVALIDLOGIN' );
                throw $oEx;
            }
        }

        return $sSelect;
    }

Findet sich wirklich niemand der einmal kurz über den Code schauen kann?

es ist unsinnig den md5 Hash des Paswortes mit iconv oder mb_convert_encoding zu verrsuchen zu konvertieren … da es ja NUR ein Hash (Prüfsumme) ist und nicht das Passwort selbst.

:wink:

Hi Rene,

erstmal danke für die Antwort.

Ganz komme ich bei deiner Antwort nicht mit.

Betrachen wir nur den MD5 Abschnitt:

 MD5( CONCAT( ".$oDb->quote( $sPassword ).", UNHEX( oxuser.oxpasssalt ) ) ) ";

Hier wird über die MD5 Funktion der MD5 hash aus dem übergebenen Passwort und dem vorhadenenen Salt generiert. Dabei enthält

$sPassword

das vom Benutzer eingebene Passwort in Klartext oder verstehe ich hier etwas falsch?

Grüße

crus