Da ich per PN nach der Bridge gefragt wurde, hole ich hier etwas aus:
Die Bridge ist u.a. seit 2 Jahren bei Wiimmfi.de im Einsatz um beim WBB4-Forum die Kennwörter abzugleichen. Aus Wiimmfi habe ich auch die Funktionen kopiert. Die beiden Funktionen LoginHandlerWBB4() und LoginWBB4() kann man natürlich zusammenfassen; sie sind bei mir nur getrennt, da sie Bestandteil einer Source-Lib sind und ich 2 Interfaces nutze.
Wichtig ist, dass nur Hashs im WBB3 und WBB4 Format unterstützt werden, nicht aber ältere. Bei jeder Kennwort-Änderung im WBB wird das jeweils aktuelle Hash-Verfahren verwendet. Ansonsten bleiben beim Update von WBB alte Hash-Formate erhalten.
Ich verwende das Object $DB, welches automatisch bei einem einen SQL-Fehler sowohl die Query als auch den Fehlerstatus ausgibt. Die Fehlerausgabe wäre hier auch sinnvoll. Denn wie ich schon im Forum schrieb: Ein gut genutzter Fehlerkanal hilft ungemein. Bei uns wird konsequent jeder Fehler im error log beseitigt, so dass das Log im Normalfall aktiviert ist und trotzdem leer bleibt.
Dann muss das Tipp-Spiel Lesezugriff auf die WBB4-Tabelle wcf1_users haben. DB- und Tabellen-Name müssen richtig angegeben sein. Zur Rechtevergabe nutze ich den SQL-Befehl:
Unter der Annahme, dass USER der DB-Nutzer des Tipp-Spiels ist und WBB4 der Datenbankname. Genau diese Rechtevergabe kann aber Probleme bereiten, wenn man nicht Herr der Datenbank ist und somit keine Rechte für GRANT hat.
Die Alternative ist, ein mysqli-Object mit den Anmeldedaten vom WBB4 zu erstellen, um den Benutzer zu verifizieren. Die Funktionen könnten dann so aussehen:
- function VerifyPasswordWBB4 ( $pw, $hash )
- {
- // Verify a password entered by the user against a WBB4 hash value.
- // Only WBB3 and WBB4 style hashes are supported.
- // Returns TRUE for a correct password and FALSE otherwise.
- if ( substr($hash,0,5) == 'wcf1:' ) // WBB3
- {
- $param = explode(':',substr($hash,5)); // hash:salt
- return count($param) == 2
- && sha1( $param[1] . sha1( $param[1] . sha1( $pw )) ) == $param[0];
- }
- return crypt( crypt($pw,$hash), $hash ) == $hash;
- }
- function LoginWBB4 ( $user, $pw )
- {
- global $WBB4_HOST, $WBB4_USER, $WBB4_PW, $WBB4_NAME, $WBB4_TAB;
- $db = new mysqli($WBB4_HOST,$WBB4_USER,$WBB4_PW,$WBB4_NAME);
- if (!$db)
- die("Can't open WBB4 DB");
- $query = "SELECT userid,username,password,banned FROM `$WBB4_TAB`"
- ." WHERE username=\"{$db->real_escape_string($user)}\"";
- $res = $db->query($query);
- if ( $res === FALSE )
- {
- error_log('#DB-ERROR: '.$db->error);
- die("Can't access WBB4 DB");
- }
- $row = $res->fetch_object('stdClass');
- $db->close();
- if ( !$row)
- return FALSE;
- // return an object
- $acc = (object)NULL;
- $acc->user_id = $row->userid;
- $acc->account = $row->username;
- $acc->disabled = $row->banned > 0;
- $acc->pw_ok = VerifyPasswordWBB4($pw,$row->password);
- return $acc;
- }
Anmerkungen:
- Der neue Kode wurde von mir auf die schnelle runtergeschriebenen und ist absolut ungetestet.
- Ich habe keine Ahnung, ob und wie sich die Klasse mysqli und die globalen Funktionen mysql_*() gegenseitig beeinflussen und ob sie störungsfrei nebeneinander genutzt werden können. Die Funktionen gelten sowieso schon lange als deprecated, so dass das TippSpiel kurzfristig auf die Klasse mysqli umgestellt werden muss.
- Ich weiß nicht, ob WBB4 auch auf Windows läuft. Ich weiß aber, dass die Funktion crypt() unter Windows andere Algorithmen unterstützt. Falls WBB4 Windows-tauglich ist, kann es durchaus sein, dass die Windows-Funktion den Hash anders berechnet. Dann müsste die Funktion VerifyPasswordWBB4() angepasst werden.