Modulshop - Eine große Auswahl an neuen und hilfreichen Modulen für die modified eCommerce Shopsoftware
Neuigkeiten
  • Die modified eCommerce Shopsoftware ist kostenlos, aber nicht umsonst.
    Spenden
  • Damit wir die modified eCommerce Shopsoftware auch zukünftig kostenlos anbieten können:
    Spenden
  • Thema: Password Reset - Link wird immer als abgelaufen gemeldet

    matthiasr

    • Fördermitglied
    • Beiträge: 32
    • Geschlecht:
    Hi,

    Beim Klick auf den Link in der Mail zum Zurücksetzen des Passworts wird immer gemeldet, dass der Link bereits abgelaufen sei.
    Ich vermute mal, das liegt daran, dass die PHP und MySQL Timezones nicht identisch sind.
    Wir haben die PHP Timezone auf EUROPA/Berlin gesetzt, leider liegt die Timezone des SQL Servers 2 Stunden vor  der PHP Timezone.
    Ich könnte jetzt zwar die PHP Timezone auf die gleiche Timezone wie beim MySQL Server stellen, ich benötige aber für andere Anwendungen die korrekte Timezone. Daher würde ich das ungern ändern wollen.

    Der Provider hat mir geraten den Befehl SET time_zone = 'Europe/Berlin'; vor dem connect oder zu Beginn einer Session einzubinden.

    Kann ich das eventuell in der password_double_opt.php einbauen? Wenn ja, wo?

    Oder sollte ich besser die PHP Timezone wieder an die der MySQL DB anpassen?

    Gruß
    Matthias

    Linkback: https://www.modified-shop.org/forum/index.php?topic=37058.0

    hpzeller

    • Experte
    • Beiträge: 4.129
    • Geschlecht:
    Re: Password Reset - Link wird immer als abgelaufen gemeldet
    Antwort #1 am: 11. April 2017, 23:14:04
    Hallo Matthias,

    folgender Link,
    Passwort vergessen? > Link nur 60 Minuten gültig ist. > Der Link ist abgelaufen.
    oder ein Update auf die aktuelle Shopversion (2.0.2.1 rev 10607) kann dir helfen.

    Gruss
    Hanspeter

    awids

    • Experte
    • Beiträge: 3.803
    • Geschlecht:
    Re: Password Reset - Link wird immer als abgelaufen gemeldet
    Antwort #2 am: 12. April 2017, 00:48:40
    Eine unsaubere, aber funktionierende Lösung wäre, in der password_double_opt.php gleich am Anfang den Gültigkeitszeitraum:

    Code: PHP  [Auswählen]
    define('VALID_REQUEST_TIME', 60*60);

    so zu ändern (3 Stunden):

    Code: PHP  [Auswählen]
    define('VALID_REQUEST_TIME', 180*60);

    Damit der Kunde dann weiterhin von den normalen 60 Minuten ausgeht, die er ja nach meiner Rechnung auch nur noch hat, in der /lang/german/german.php (ggf. für weitere Sprachen) dies:

    Code: PHP  [Auswählen]
    define('TEXT_LINK_MAIL_SENDED','Ihre Anfrage nach einem neuen Passwort muss von Ihnen erst best&auml;tigt werden.<br />Deshalb wurde Ihnen vom System eine E-Mail mit einem Best&auml;tigungslink geschickt. Bitte klicken Sie nach Erhalt der E-Mail auf den mitgeschickten Link. Andernfalls k&ouml;nnen Sie kein neues Passwort vergeben! <br/><br/>Der Best&auml;tigungslink ist %s Minuten g&uuml;ltig.');

    so abändern:
    Code: PHP  [Auswählen]
    define('TEXT_LINK_MAIL_SENDED','Ihre Anfrage nach einem neuen Passwort muss von Ihnen erst best&auml;tigt werden.<br />Deshalb wurde Ihnen vom System eine E-Mail mit einem Best&auml;tigungslink geschickt. Bitte klicken Sie nach Erhalt der E-Mail auf den mitgeschickten Link. Andernfalls k&ouml;nnen Sie kein neues Passwort vergeben! <br/><br/>Der Best&auml;tigungslink ist 60 Minuten g&uuml;ltig.');

    Und damit keine Missverständnisse aufkommen, dasselbe Spiel in /templates/deintemplate/mail/german/new_password_mail.html und /templates/deintemplate/mail/german/new_password_mail.txt (ggf. für weitere Sprachen) wiederholen, indem du dort die Variable

    Code: PHP  [Auswählen]
    {$VALID_REQUEST_TIME}

    mit

    Code: PHP  [Auswählen]
    60

    ersetzt.

    matthiasr

    • Fördermitglied
    • Beiträge: 32
    • Geschlecht:
    Re: Password Reset - Link wird immer als abgelaufen gemeldet
    Antwort #3 am: 12. April 2017, 01:27:52
    Vielen Dank euch beiden. :)

    @hpzeller
    dein script funktioniert irgendwie nicht. Irgendwie wird der Unix_Timestamp nicht zurückgegeben. Ich werde es aber morgen noch einmal in Ruhe probieren.
    Ich habe übrigens die aktuellste Version. Trotzdem gibt es Probleme.

    @awids
    Vielen Dank, dass wäre eine Option.

    Ich habe jetzt mal testweise folgendes probiert: Ich setze vor dem Vergleich der aktuellen  mit der Zeit in der DB einfach eine andere Zeitzone. Ist das so machbar oder muss ich da irgendwelche Problem befürchten?

    Code: PHP  [Auswählen]
     
    $check_customer_query = xtc_db_query("SELECT  *
                                              FROM "
    .TABLE_CUSTOMERS."
                                             WHERE customers_id = '"
    .(int)$customers_id."'
                                               AND password_request_key = '"
    .xtc_db_input($key)."'");
      $check_customer = xtc_db_fetch_array($check_customer_query);

      // auf die Timezone von MySQL setzen
      date_default_timezone_set('UTC');
           
            if (!xtc_db_num_rows($check_customer_query) || $key == '') {
        $case = 'no_account';
        $messageStack->add('password_double_opt_in', TEXT_NO_ACCOUNT);
      } elseif (time() > (strtotime($check_customer['password_request_time']) + VALID_REQUEST_TIME)) {

            // hier wird wieder zurückgesetzt
            date_default_timezone_set('EUROPE/Berlin');

                    $case = 'double_opt';
      $messageStack->add('password_double_opt_in', TEXT_REQUEST_NOT_VALID);
      } else {
            // und dann hier nochmal
                    date_default_timezone_set('EUROPE/Berlin');
     

    matthiasr

    • Fördermitglied
    • Beiträge: 32
    • Geschlecht:
    Re: Password Reset - Link wird immer als abgelaufen gemeldet
    Antwort #4 am: 12. April 2017, 08:48:10
    @awids

    wäre es nicht einfacher noch einen weiteren Gültigkeitszeitraum zu definieren
    z.b.
    Code: PHP  [Auswählen]
    define('VALID_REQUEST_TIME_NEW', 180*60);
     

    und diesen dann beim Vergleich der aktuellen Zeit zu verwenden?
    Code: PHP  [Auswählen]
    elseif (time() > (strtotime($check_customer['password_request_time']) + VALID_REQUEST_TIME_NEW)) {

    Ich würde mir so doch die weiteren notwendigen Änderungen, die Du beschrieben hast, sparen.
    Oder gäbe es damit Probleme?

    awids

    • Experte
    • Beiträge: 3.803
    • Geschlecht:
    Re: Password Reset - Link wird immer als abgelaufen gemeldet
    Antwort #5 am: 12. April 2017, 08:50:44
    Klar, kannst es ja mal versuchen.  :mhhh: Wüsste nicht, was dagegen spricht und ist so natürlich schneller wieder ausgebaut, wenn dein Provider die DB-Server-Zeit doch mal anpassen würde. ;)

    hpzeller

    • Experte
    • Beiträge: 4.129
    • Geschlecht:
    Re: Password Reset - Link wird immer als abgelaufen gemeldet
    Antwort #6 am: 12. April 2017, 15:56:33
    [...]
    @hpzeller
    dein script funktioniert irgendwie nicht. Irgendwie wird der Unix_Timestamp nicht zurückgegeben. Ich werde es aber morgen noch einmal in Ruhe probieren.
    Ich habe übrigens die aktuellste Version. Trotzdem gibt es Probleme.
    [...]

    Merkwürdig, den verlinkten Code habe ich auf folgendem System getestet und dort hat er funktioniert.

    Server OS:     Linux #1 SMP Wed Oct 26 06:52:09 UTC 2016
    HTTP Server:     Apache/2.2.15 (CentOS)
    PHP Version:     5.6.21 (Zend: 2.6.0)
    Datenbank:     MySQL 5.1.73-log
    modified eCommerce Shopssoftware v2.0.2.1 rev 10607 dated: 2017-01-25
    Datenbank Version: "MOD_2.0.2.1"

    Vorschlag:
    Füge testweise nach diesem Code

    Code: PHP  [Auswählen]
      $check_customer = xtc_db_fetch_array($check_customer_query);

    diesen Code ein und schaue dir das Ergebnis im Browser an.

    Code: PHP  [Auswählen]
    echo '<pre>';  
    print_r($check_customer);
    echo 'Die erlaubte Zeit betraegt '.VALID_REQUEST_TIME.' Sekunden<br>';
    echo 'Zeitstempel der \'password_request_time\': '.strtotime($check_customer['password_request_time']).'<br>';
    echo 'UNIX Zeitstempel: '.$check_customer['db_timestamp'];
    echo '</pre>';

    Nachtrag:
    Folgende Zeile aus dem verlinkten Code könntest du mal testweise

    Code: PHP  [Auswählen]
      } elseif ($check_customer['db_timestamp'] > (strtotime($check_customer['password_request_time']) + VALID_REQUEST_TIME)) {

    mit dieser ersetzen.

    Code: PHP  [Auswählen]
      } elseif ((int)$check_customer['db_timestamp'] > (strtotime($check_customer['password_request_time']) + (int)VALID_REQUEST_TIME)) {

    PS:
    Grundsätzlich sollte man sich nicht auf Zeitsychronität von Webserver und Datenbankserver verlassen und das bedeutet, dass wenn man eine Zeit mit now() setzt man sie später auch mit der Datenbank-Zeit vergleichen sollte bzw. setzt man eine Zeit mit time() so sollte man sie später mit der Webserver-Zeit vergleichen, wenn ein Zeitspanne ermittelt werden soll.

    Gruss
    Hanspeter

    hpzeller

    • Experte
    • Beiträge: 4.129
    • Geschlecht:
    Re: Password Reset - Link wird immer als abgelaufen gemeldet
    Antwort #7 am: 19. April 2017, 11:40:48
    Nachtrag:

    Eine alternative Lösung hat Susanne hier gepostet.
    Re: Problem mit Passwort zurücksetzen Link.

    Gruss
    Hanspeter

    matthiasr

    • Fördermitglied
    • Beiträge: 32
    • Geschlecht:
    Re: Password Reset - Link wird immer als abgelaufen gemeldet
    Antwort #8 am: 19. April 2017, 11:47:11
    Hallo Hanspeter,

    vielen Dank für den Hinweis. Werde ich mal einbauen.
    Macht ja eigentlich auch Sinn entweder nur von PHP oder nur von MySQL die Zeitfunktionen zu nutzen.

    Gruß

    Matthias
    2 Antworten
    2349 Aufrufe
    30. Mai 2017, 23:27:39 von pascal1
    3 Antworten
    1882 Aufrufe
    24. April 2017, 15:55:12 von cts
    1 Antworten
    2003 Aufrufe
    18. September 2013, 17:18:57 von rokumedia
               
    anything