Login bzw. Passwort vergessen

CreativPur

Erfahrenes Mitglied
Hi,
ich habe ein Login-Script, wo ich auch ein neues Passwort anfordern kann.

Der Login funktioniert super, aber nicht das Anfordern eines neues Passwortes.
Es kommen keine Emails an, die den Link zum zurücksetzen des Passwortes beinhalten..

Hier mein Script:
PHP:
<?php
session_start();
require_once("inc/config.inc.php");
require_once("inc/functions.inc.php");

include("templates/header.inc.php");
?>
 <div class="container small-container-330">
    <h2 >Passwort vergessen</h2>


<?php
$showForm = true;
 
if(isset($_GET['send']) ) {
    if(!isset($_POST['email']) || empty($_POST['email'])) {
        $error = "<b>Bitte eine E-Mail-Adresse eintragen</b>";
    } else {
        $statement = $pdo->prepare("SELECT * FROM users WHERE email = :email");
        $result = $statement->execute(array('email' => $_POST['email']));
        $user = $statement->fetch();       
 
        if($user === false) {
            $error = "<b>Kein Benutzer gefunden</b>";
        } else {
            
            $passwortcode = random_string();
            $statement = $pdo->prepare("UPDATE users SET passwortcode = :passwortcode, passwortcode_time = NOW() WHERE id = :userid");
            $result = $statement->execute(array('passwortcode' => sha1($passwortcode), 'userid' => $user['id']));
            
            $empfaenger = $user['email'];
            $betreff = "Neues Passwort für deinen Account auf www.meineWebseite.de"; //Ersetzt hier den Domain-Namen
            $from = "From: Vorname Nachname <meine@domain.de>"; //Ersetzt hier euren Name und E-Mail-Adresse
            $url_passwortcode = getSiteURL().'passwortzuruecksetzen.php?userid='.$user['id'].'&code='.$passwortcode; //Setzt hier eure richtige Domain ein
            $text = 'Hallo '.$user['vorname'].',
für deinen Account auf www.meineWebseite.de  wurde nach einem neuen Passwort gefragt. Um ein neues Passwort zu vergeben, rufe innerhalb der nächsten 24 Stunden die folgende Website auf:
'.$url_passwortcode.'
 
Sollte dir dein Passwort wieder eingefallen sein oder hast du dies nicht angefordert, so bitte ignoriere diese E-Mail.
 
Viele Grüße,
dein PHP-Einfach.de-Team';
            
            //echo $text;
            
            mail($empfaenger, $betreff, $text, $from);
 
            echo "Ein Link um dein Passwort zurückzusetzen wurde an deine E-Mail-Adresse gesendet.";   
            $showForm = false;
        }
    }
}
 
if($showForm):
?>
    Gib hier deine E-Mail-Adresse ein, um ein neues Passwort anzufordern.<br><br>
    
    <?php
    if(isset($error) && !empty($error)) {
        echo $error;
    }
    
    ?>
    <form action="?send=1" method="post">
        <label for="inputEmail">E-Mail</label>
        <input class="form-control" placeholder="E-Mail" name="email" type="email" value="<?php echo isset($_POST['email']) ? htmlentities($_POST['email']) : ''; ?>" required>
        <br>
        <input  class="btn btn-lg btn-primary btn-block" type="submit" value="Neues Passwort">
    </form>
<?php
endif; //Endif von if($showForm)
?>

</div> <!-- /container -->

woran kann das liegen ?
 
Mit der PHP-Funktion mail() kann man E-Mails versenden. Aber damit hat der Entwickler oft viele Sorgen. Für den korrekten E-Mail Versand sind verschiedene Mail-Header notwendig. Ohne die richtigen Header bekommen viele Mail-Clients Probleme bei der Anzeige oder empfangen diese erst gar nicht. Allerdings ist es aufgrund der Komplexität sehr aufwändig, alle sich damit befassenden RFC-Dokumente selbst durchzuarbeiten und anzuwenden. Stattdessen sollte man Mailerklassen verwenden, die diese Header korrekt einbinden. Ich nutze in der Regel den "phpMailer", damit hatte ich noch nie Probleme.

Ansonsten gilt auch hier:

Richtig debuggen
  1. Man bemerkt, dass ein Skript nicht das tut, was es soll.
  2. Man schreibt an den Anfang des Scriptes die Zeile: error_reporting(-1);
  3. Man verwendet ini_set('display_errors', true); damit die Fehler auch angezeigt werden.
  4. Man versucht, die Stelle die daran Schuld sein kann, schonmal einzugrenzen. Falls dies nicht geht, wird zunächst das komplette Skript als fehlerhaft angesehen.
  5. An markanten Stellen im Skript lässt man sich wichtige Variableninhalte ausgeben und ggf. auch in bedingten Anweisungen eine kurze Ausgabe machen, um zu überprüfen, welche Bedingung ausgeführt wurde. Wichtig bei MySQL Fehlern (...not a valid MySQL result resource...): mysqli_error() verwenden oder Abfrage ausgeben und zb mit phpmyadmin testen.
  6. Schritt 5 wird so lange wiederholt, bis Unstimmigkeiten im Skript auffallen
  7. Damit hat man das Problem (Unstimmigkeit) gefunden und kann versuchen diese zu beheben. Hierzu dienen dann die PHP-Dokumentation und andere Quellen als Ratgeber.
  8. Lässt sich das konkrete Problem trotzdem nicht beheben, kann man in Foren um Rat fragen.
  9. Das Programm läuft und man kann die Debug-Ausgaben wieder entfernen.
 
  • Wieso benutzt das Skript noch SHA1?
  • Wieso versendet das Skript das gehashte Passwort in der Mail?
  • Wieso interpoliert das Skript Nutzerdaten in der E-Mail? (Ähnliche Sicherheitslücke wie XSS.)
Ich kann dir nur empfehlen, dich ausgiebig in Sicherheitsthemen einzulesen und dann das Skript von Grund auf neu zu schreiben. Oder einfacher und sicherer: beauftrage jemanden, der bereits Sicherheitskenntnisse hat.
 
Zurück