Beiträge von Wiimm

Ich habe einen Blog Artikel verfasst - Wie benutze ich die Suche richtig - Bitte diesen beachten und auch umsetzen bevor Ihr ein Neues Thema eröffnet!

    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:

    Code
    1. grant select on WBB4.wcf1_user for USER@localhost

    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:


    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.

    Ich habe in ./include/inc.config.php die beiden Zeilen auskommentiert, weiß aber nicht, ob es so gedacht ist:

    Code
    1. #$CONFIG['MENU']['MAIN']['FORUM']['TEXT'] = "Forum";
    2. #$CONFIG['MENU']['MAIN']['FORUM']['LINK'] = "forum/";

    Klappt leider beides nicht. Weder der neue Pfad noch die TEST.PHP?! Bei der TEST.PHP bekomme ich ein Seitenladefehler (Fehler im Quelltext?!).

    Merkwürdig. Ich nutze das Script schon seit Jahren und passe nur den freien Text an. Allerdings ist php beim Umgang der End-Marke des Here-Documents (__EOT__) sehr pingelig. Kein Leerzeichen davor oder danach ist möglich (also auch keine Einrückung). Neben dem Marker ist nur ein Semikolon erlaubt.

    oh je du setzt voraus das sich alle User mit php was nicht der Fall ist auskennen und auch einen error log bekommen viele haben aber nur kostenlosen webspace und da gibt es in der Regel keinen error log

    Nein, dass setze ich nicht voraus. Ich beantworte nur die Frage, wie man bessere Fehlermeldungen erhält mit der Beschreibung einer durchaus üblichen und verbreiteten Methode.


    Allerdings gebe ich die Recht, das viele Anwender damit überfordert sind. Deswegen gehört es ja auch zu den Aufgaben eines Entwicklers, eine vernünftige Fehlerauswertung zu liefern. Sie würde allen, Entwicklern und Anwendern, enorm helfen. Und wenn der Fehlerkanal nicht verfügbar ist, dann geht es auch bedingt für Admins mit "<pre> print_r() </pre>" auch über die Weboberfläche.

    lege doch mal im Hauptverzeichnis die Datei "test.php" wie folgt an:


    Dann rufe http://deine.domain.de/EM2016/test.php auf und schaue, was dabei herauskommt.

    Zuerst das error log aktivieren (Zeile auskommentieren; error log wird relativ schnell voll):

    Code
    1. --- inc.config.php.orig 2016-05-30 15:37:30.098294776 +0200+++ inc.config.php 2016-05-30 10:57:48.857325882 +0200@@ -222,7 +222,7 @@ ########################################################-error_reporting(0); # NUR BEI BEDARF �NDERN und wenn man wei� was man tut! #+#error_reporting(0); # NUR BEI BEDARF �NDERN und wenn man wei� was man tut! # ########################################################


    Dann hinter jeder verdächtigen SQL-Anfrage sowas schreiben:

    Code
    1. $xxx = mysql_query(...)if ( $xxx === FALSE ) error_log('#DB-ERROR: '.mysql_error());


    Übertragen für die Registrierung:


    Und jetzt im error log nach #DB-ERROR: suchen.

    Das / ist ein notwendiger Begrenzer, der vorne und hinten steht. Mann kann auch andere Zeichen nutzen wie z.B. +. Der Begrenzer selbst darf nur mit führendem \ im Suchstring (pattern) vorkommen (Ausnahme in [...])


    Im obigen Beispiel: /pattern/i
    Das "i" am Ende steht dann für "ignore case", so dass strtolower() hier unnötig ist.

    Ja, über Kommandozeile.
    Und es wirkte, da mein patch durch die SMTP-Tests mit FiedlWdd ja wieder überschrieben wurde. Und auch ein Auszug eines Dumps zeigt es:
    `bezahlt` int(11) NOT NULL DEFAULT '0',


    Und aktiv getestet wurde es auch, weil ich nach dem SMTP-Update für alle 3 Mail-Einstellungen neue Nutzer angelegt hatte.

    was soll das nützen da werden nur die Tabellen aufgelistet

    Nicht, da ich mich im Thema vertan habe.
    Ich bin ja noch neu hier und habe mir diverse Themen angeschaut. Und diese Antwort sollte eine Hilfe für jemanden sein, der beim Datenimport Probleme hatte. Da hatte ich wohl zuviele Fenster offen.


    Der Beitrag könnte daher hier gelöscht werden, auch wenn ich ihn grundsätzlich als nützlich halte.

    Führe mal diese SQL-Anweisung aus und ersetze dabei DATABASE_NAME durch den richtigen Namen:

    SQL
    1. SELECT c.table_name, count(c.column_name) columns, t.table_rows rowsFROM information_schema.columns c, information_schema.tables tWHERE c.table_schema = "DATABASE_NAME" && t.table_schema = c.table_schema && t.table_name = c.table_nameGROUP BY c.table_name


    Zum Vergleich: Bei meinem fast leeren Testsystem kommt dann sowas raus:

    Man denkt als Lösung sofort an etwas wie:

    Code
    1. insert into emtipp_users(usr,email,pwd,name,...)select username as usr, email, password as pwd, username as name, ...from wbb4.wcf1_user

    Leider wird es an der anderen Art des password-hash scheitern.


    Die Lösung ist eine Login-Bridge:
    Anstatt die eigene Tabelle zum Verifizieren des Kennwortes zu nutzen, wird die WBB4-Tabelle genutzt (Lesezugriff notwendig). Ist nach erfolgreicher Anmeldung der Benutzer noch nicht existent, dann muss ein entsprechender Datensatz in emtipp_users angelegt werden.


    Diese Lösung hat auch den Vorteil, dass neue WBB4-User Zugang zum Tipp-Spiel erhalten. Ich habe eine solche Bridge auch schon realisiert, einmal für Mediawiki und einmal für selbst geschriebene Software. Beide greifen auf die Anmeldedaten von WBB4 zurück und haben nur Lesezugriff auf die WBB4-Tabelle .


    Da ich mich in der Tipp-Software nicht auskenne, kann ich nichts dazu sagen, wie man dort die Bridge einhängt. Ich kann aber den WBB4-Part zur Verfügung stellen:


    Natürlich muss der DB-Zugriff noch an das DB-Objekt vom Tipp-Spiel angepasst werden. Daher ist es nur eine Vorlage zur Umsetzung.

    Er kennt den Index ALL_HTTP nicht, deshalb die Abfrage ergänzen und prüfen ob der Index verfügbar ist.

    Code
    1. if (isset($_SERVER['ALL_HTTP']) && strpos(strtolower($_SERVER['ALL_HTTP']),'OperaMini') > 0) {
    2. $mobile_browser++;
    3. }

    So, wie der code dort steht, kann man die Zeile auch gleich ganz weglassen. Denn durch das strtolower() ist die IF-Bedingung immer falsch. Ich denke, man sollte 'operamini' kleinschreiben, damit es sinnvoll wird.

    Ich habe eine Sicherheitslücke im Backup-System gefunden. Ich habe auch ein Script geschrieben, welches dieses Lücke nutzt und mir innerhalb weniger Sekunden ein frisch erstelltes Backup auf meinem Rechner kopiert. Dazu muss ich noch nicht einmal angemeldet sein. Weitere Details werde ich nicht nennen. Mit dem Backup habe ich die Zugangsdaten und einen guten Ansatz für Identitätsdiebstahl, da die Kennwörter nur schwach verschlüsselt sind. Das ich auch die Tipps der anderen kenne ist eher irrelevant.


    Die Entwickler wissen Bescheid und haben mich zu diesem Post aufgefordert.


    Lösung 1:
    Ihr müsst das Verzeichnis ./backup/ vor jeglichem Zugriff schützen. Üblicherweise reicht es, die Datei ./backup/.htaccess (also im Backup-Verzeichnis) mit der folgenden Zeile anzulegen:

    Code
    1. Order allow,deny


    Losung 2:
    Keine Backups aus dem System anlegen.

    Man verzeihe mir den Doppelpost, aber ich habe den Fehler gefunden. Als erstes der Patch:

    Code
    1. --- home.registrieren.php.orig 2016-05-01 15:48:12.000000000 +0200+++ home.registrieren.php 2016-05-27 16:18:14.647598917 +0200@@ -809,7 +809,7 @@ $valid_until = 0; $hash = "";- $sql = "INSERT INTO ". $CONFIG['MYSQL']['PREFIX'] ."users (usr,email,pwd,name,department,regDate,fav,gfav,isUnlocked,remarks,showflash) VALUES "+ $sql = "INSERT INTO ". $CONFIG['MYSQL']['PREFIX'] ."users (usr,email,pwd,name,department,regDate,fav,gfav,isUnlocked,remarks,showflash,bezahlt) VALUES " ."('". mysql_real_escape_string($_POST['req']['username']) ."'," ."'". mysql_real_escape_string($_POST['req']['email']) ."'," ."md5('". mysql_real_escape_string($_POST['req']['passwort']) ."'),"@@ -820,8 +820,11 @@ ."'". $_POST['opt']['geheimfavorit'] ."'," ."'". ($CONFIG['OPTIN']['MAIL'] == TRUE ? 0 : $CONFIG['NEEDACTIVATION']) ."'," ."'". mysql_real_escape_string($_POST['opt']['remarks']) ."',"- ."'". $_POST['opt']['showflash'] ."')";+ ."'". $_POST['opt']['showflash'] ."',"+ ."0)"; $result = mysql_query($sql);+#if ($result===FALSE) foreach( explode("\n",print_r($sql,true)) as $line ) error_log($line."\n");+ $newuserid = mysql_insert_id(); // Prüfeintrag in der Datenbank aktualisieren


    Erläuterung:
    Mit der letzten Änderung (Zeile 20), die nun wieder auskommentiert ist, habe ich mir die SQL-Anweisung im Fehlerfalle ausgeben lassen. Manuell ausgeführt gab es dann den Fehler:
    * ERROR 1364 (HY000) at line 1: Field 'bezahlt' doesn't have a default value
    Ältere mysql-Versionen akzeptieren solche Dinge fälschlicherweise, so dass es nur bei neueren Versionen zu Problemen führt. Ich hoffe, dass nicht noch weitere derartige Fehler enthalten sind.


    Mit dem Patch wird nun auch dem Feld "bezahlt" der Standardwert "0" zugewiesen, so dass eine Registrierung nun funzt.


    Nachtrag:
    Alternativ kann man auch die Tabelle anpassen:

    Code
    1. alter table emtipp_users modify bezahlt int not NULL default 0

    Ich helfe gerne, siehe PN.


    Dann habe ich die Bestätigungsmail (double opt in) deaktiviert um den Mail-Transfer auszuschließen, Leider brachte es keine Besserung: Es werden keine Nutzer angelegt. Mir ist nur eine Änderung aufgefallen: Die Tabelle emtipp_user_hashs erhält nun keine neuen Einträge mehr, was mutmaßlich (so, wie ich den Sinn der Tabelle verstehe) auch richtig ist.