-
Hey Leute =)
ich habe auf meiner Website einen "Passwort vergessen?" Button eingefügt.
Er funktioniert wie folgt:
Ein Benutzer gibt seine E-Mail-Adresse, seine Geheimfrage und seine Geheimantwort" ein. Sind die Angaben korrekt, wird ihm sein Passwort per Email zugeschickt.
Soweit so gut.
Ich habe dabei allerdings folgendes Problem:
Das Passwort wird bei der Registrierung des Benutzers verschlüsselt (md5) und daher wird ihm momentan das verschlüsselte Passwort zu gesandt....was natürlich nicht so sein sollte
Hier der Code mit dem ich das Passwort aus der Datenbank auslesen lasse:Habt ihr vielleicht ne Ahnung, wie ich den Code abändern müsste, damit das Passwort entschlüsselt versendet wird?PHP-Code:// Die userspezifischen Daten werden ausgelesen und in Variablen gespeichert.
$user = mysql_fetch_object($res);
$password = $user->password;
Vielen Dank für Eure Mühen
LG Zneaf =)
-
23.04.11 19:29 #2
So ein verschlüsseltes Passwort lässt sich nicht wiederherstellen (-> Einwegverschlüsselung).
Aber auch wenn du es unverschlüsselt speichern würdest, würde ich nicht empfehlen das "alte" per Email zu schicken.
Bei fast allen Websites wird ein eindeutiger Link per Email gesendet, bei dem du dann ein neues Passwort eingeben kannst.
Also im Prinzip musst du eine zufällige ID für diese "Passwort vergessen"-Aktion generieren, diese irgendwo speichern und auch per Email zuschicken.mfg ComFreek
Falls ich dir geholfen habe, würde ich mich über ein DANKE freuen!
Kenn mich am besten aus in C++, WEB-Sprachen (PHP, HTML, JavaScript) und vllt. mehr
[PHP] Überprüfen, ob Website erreichbar • Sicherheit in PHP-Codes schaffen • Google Chrome-Extension für tutorials.de • json_compress()
-
Hey ComFreek =)
erstmal vielen Dank für diese extrem schnelle Antwort
Also ich hab ungefähr verstanden, was du meinst....allerdings habe ich keine Ahnung, wie man soetwas umsetzt.
Bin halt ein Hobby-Programmierer
Ich weiß...es ist viel Arbeit, aber hättest du vllt. nen Beispiel-Code und kannst mir das ganze etwas näher erklären? =)
Wäre echt super nett von dir
Vielen Dank im Voraus
LG Zneaf =)
-
23.04.11 20:20 #4
Bitte Zneaf

Zuerst könntest du deiner Benutzertabelle in der DB eine neue Spalte hinzufügen, in die du im Falle die eindeutige ID zum Zurücksetzen speicherst:
Nachdem der Nutzer "Passwort vergessen" gedrückt hat und die Sicherheitsfrage richtig beantwortet hat, muss diese ID generiert werden, z.B. mit sha1() (erzeugt einen Hash mit 40 Zeichen):Code :1 2 3
username | .... | pw_reset_id pw_reset_id VARCHAR(40)
Der Hash sollte so zufällig wie möglich sein!PHP-Code:$id = sha1($username.time().rand(-3000,3000));
/* ID einfügen */
$sql = "UPDATE users SET pw_reset_id='".$id."' WHERE username='".$username."'";
mysql_query($sql);
So und in der Email schickst du eben einen Link zu einem PHP-Skript, welches eben die ID prüft und eine Eingabe eines neues Passwortes zulässt.
Schließlich noch das Skript, welches hinter dem Link steckt, z.B.:PHP-Code:$email = "............"
$email .= "http://www.example.org/reset-pw.php?username=".$username."&id=".$id;
Das ist hier eine einfache Variante. Zusätzlich könntest (solltest) du noch ein Zeitlimit einbauen (zus. Spalte 'pw_reset_time' und Prüfung im letzten Skript).PHP-Code:$id = mysql_real_escape_string($_GET['id']);
$username = mysql_real_escape_string($_GET['username']);
$sql = "SELECT id FROM users WHERE username='".$username."' AND pw_reset_id='".$id."'";
$result = mysql_query($sql);
if (mysql_num_rows($result) > 0)
{
/* Einblenden eines Formulares zum Ändern des Passwortes */
}
else
{
/* Falsch! */
}
Beachte außerdem, dass ich viele Prüfungen weggelassen habe (z.B. Benutzernamen vor MySQL-Query, Variableninhalte in URLs).Geändert von ComFreek (23.04.11 um 20:22 Uhr)
mfg ComFreek
Falls ich dir geholfen habe, würde ich mich über ein DANKE freuen!
Kenn mich am besten aus in C++, WEB-Sprachen (PHP, HTML, JavaScript) und vllt. mehr
[PHP] Überprüfen, ob Website erreichbar • Sicherheit in PHP-Codes schaffen • Google Chrome-Extension für tutorials.de • json_compress()
-
Hey ComFreek

wow...hast dir ja ne Menge Arbeit gemacht =)
Vielen Dank erstmal dafür
Das mit $email hab ich allerdings nicht ganz verstanden (hauptsächlich die erste Zeile).
Also der folgende Code:Sobald ich etwas Zeit habe (denke mal bis Wochenende oderso) werd ich etwas daran arbeiten und Rückmeldung geben, ob ichs hin gekriegt habPHP-Code:$email = "............"
$email .= "http://www.example.org/reset-pw.php?username=".$username."&id=".$id;

Es könnte also sein, dass ich noch weitere Fragen habe
(ist sogar sehr warscheinlich
)
LG Zneaf =)
-
26.04.11 12:50 #6Diese Variable soll einfach nur den Inhalt der zu verschickende Email beinhalten.Das mit $email hab ich allerdings nicht ganz verstanden (hauptsächlich die erste Zeile).
Du hast doch gesagt, dass du jetzt schon Emails mit MD5-Passwörtern geschickt hast, das ist genau das gleiche, nur mit einem Link.
Falls du die Punkte nicht verstehst, das könnte irgendein Text sein (z.B. "Lieber Kunde, ...").
Einfach stellen, wenn du welche hastEs könnte also sein, dass ich noch weitere Fragen habe (ist sogar sehr warscheinlich )
mfg ComFreek
Falls ich dir geholfen habe, würde ich mich über ein DANKE freuen!
Kenn mich am besten aus in C++, WEB-Sprachen (PHP, HTML, JavaScript) und vllt. mehr
[PHP] Überprüfen, ob Website erreichbar • Sicherheit in PHP-Codes schaffen • Google Chrome-Extension für tutorials.de • json_compress()
-
Hey ComFreek,
also hat etwas länger gedauert....sry.
Hab das jetzt mal ausprobiert. Also die erste Datei (pwforgotten.php) funktioniert einwandfrei.
Dort wird ja die pwresetid erzeugt und abgespeichert und eine Mail mit dem Link versendet.
Die zweite Datei (pwreset.php) funktioniert allerdings nicht so richtig
Hier mal die pwforgotten.php:
Hier mal die pwreset.php:PHP-Code:<?php
// Überprüfen, ob das Formular abgeschickt wurde und ob alle Angaben gemacht wurden.
if( isset($_POST['username'], $_POST['email'], $_POST['gfrage'], $_POST['gantwort'])
AND
strcmp(trim($_POST['username']),'') != 0
AND
strcmp(trim($_POST['email']),'') != 0
AND
strcmp(trim($_POST['gfrage']),'') != 0
AND
strcmp(trim($_POST['gantwort']),'') != 0 ) {
// Einbinden der Konfigurationsdatei.
require_once 'config.php';
// SQL-Anweisung an die Datenbank senden, um erstens herauszufinden, ob
// diese Kombination von Daten überhaupt existiert.
$sql = "SELECT
username,
email,
gantwort,
gfrage
FROM
user
WHERE
username = '" . trim($_POST['username']) . "'
AND
email = '" . trim($_POST['email']) . "'
AND
gfrage = '" . trim($_POST['gfrage']) . "'
AND
gantwort = '" . trim($_POST['gantwort']) . "'";
$res = mysql_query($sql) or die( 'Error[SELECT|User]: <br /><pre>' . $sql . '</pre><br />MySQL-Error: ' . mysql_error() );
// Nur wenn genau ein Datensatz selektiert wurde, wird eine E-Mail an den User versendet.
// Ansonsten wird ihm eine Fehlermeldung angezeigt.
if( mysql_num_rows($res) != 1 ) {
echo "<font face=\"Arial\" color=\"#333333\">Die angegebenen Benutzerdaten sind nicht korrekt!</font>";
exit();
}else{
// Mail - From festlegen
$from = "From: \n";
$from .= "Reply-To: \n";
$from .= "Cc: \n";
$from .= "Bcc: \n";
$from .= "X-Mailer: PHP/" . phpversion(). "\n";
$from .= "X-Sender-IP: $REMOTE_ADDR\n";
$from .= "Content-Type: text/html";
// Benutzerdaten in Variablen speichern
$username = $_POST['username'];
$email = $_POST['email'];
// ID erzeugen
$id = sha1($username.time().rand(-3000,3000));
// Einbinden der Konfigurationsdatei.
require_once 'config.php';
// ID einfügen
$sql = "UPDATE user
SET pw_reset_id='".$id."'
WHERE username='".$username."'";
$res = mysql_query($sql) or die( 'Error[SELECT|User]: <br /><pre>' . $sql . '</pre><br />MySQL-Error: ' . mysql_error() );
// Mail - Daten zusammenfassen
$nachricht = "<table border=\"0\" cellpadding=\"0\" cellspacing=\"2\">
<table border=\"0\" cellpadding=\"0\" cellspacing=\"2\">
<tr>
<td><font face=\"Arial\" color=\"#333333\" size=\"+2\">Hallo <b>$username</b>,</font></td>
</tr>
</table>
<br>
<table border=\"0\" cellpadding=\"0\" cellspacing=\"2\">
<tr>
<td><font face=\"Arial\" color=\"#333333\">Verwende bitte den unten stehenden Link, um Dein Passwort ändern zu können.</font></td>
</tr>
<tr>
<td><font face=\"Arial\" color=\"#333333\">pwreset.php?username='.$username.'&id='.$id;</td>
</tr>
</table>
<br>
<table border=\"0\" cellpadding=\"0\" cellspacing=\"2\">
<tr>
<td><font face=\"Arial\" color=\"#333333\">Viel Spaß wünscht Dir das Team von <a href=\"\"></a></font></td>
</tr>
</table>";
//E - mail versenden
mail("$email", "Passwort vergessen", "$nachricht", "$from");
// Mail wurde versandt und der User bekommt eine Mitteilung angezeigt, in der er erfährt wie es weitergeht.
echo "<font face=\"Arial\" color=\"#333333\">Du hast soeben eine Mail von uns erhalten, mit der Du Dein Passwort ändern kannst.</font>";
exit();
}
}
?>
<!-- Eingabemaske -->
<form action="<?php $_SERVER['PHP_SELF']; ?>" method="post">
<table border="0" cellpadding="0" cellspacing="2">
<tr>
<td><font face="Arial" color="#333333">Username:</font></td>
</tr>
<tr>
<td><input type="text" name="username" size="30" maxlength="30"></td>
</tr>
<tr>
<td><font face="Arial" color="#333333">E - Mail:</font></td>
</tr>
<tr>
<td><input type="text" name="email" size="30" maxlength="30"></td>
</tr>
<tr>
<td><font face="Arial" color="#333333">Geheim - Frage:</font></td>
</tr>
<tr>
<td><input type="text" name="gfrage" size="30" maxlength="50"></td>
</tr>
<tr>
<td><font face="Arial" color="#333333">Geheim - Antwort:</font></td>
</tr>
<tr>
<td><input type="password" name="gantwort" size="30" maxlength="30"></td>
</tr>
<tr>
<td> </td>
</tr>
<tr>
<td><input type="submit" name="submit" value="Absenden"> <input type="reset" value="Abbrechen" name="reset"></td>
</tr>
</table>
</form>Um das Problem genauer zu beschreiben: irgendwas stimmt mit dem link nicht.PHP-Code:<?php
$id = mysql_real_escape_string($_GET['id']);
$username = mysql_real_escape_string($_GET['username']);
require_once("config.php");
$sql = "SELECT id
FROM user
WHERE username='".$username."'
AND pw_reset_id='".$id."'";
$res = mysql_query($sql) or die( 'Error[SELECT|User]: <br /><pre>' . $sql . '</pre><br />MySQL-Error: ' . mysql_error() );
if (mysql_num_rows($res) > 0){
?>
<center>
<form action="<?php $_SERVER['PHP_SELF']; ?>" method="post">
<table border="0" width="500" cellpadding="0" cellspacing="2">
<tr>
<td><font face="Arial" color="#333333">Neues Passwort:</font></td>
</tr>
<tr>
<td><input type="password" name="password1" size="30" maxlength="30"></td>
</tr>
</table>
<hr>
<table border="0" width="500" cellpadding="0" cellspacing="2">
<tr>
<td><font face="Arial" color="#333333">Passwort wiederholen:</font></td>
</tr>
<tr>
<td><input type="password" name="password2" size="30" maxlength="30"></td>
</tr>
<tr>
<td> </td>
</tr>
<tr>
<td><input type="submit" name="submit" value="Absenden"> <input type="reset" value="Abbrechen" name="reset"></td>
</tr>
</table>
</form>
</center>
<?php
// Daten auslesen
$password1 = $_POST['password1'];
$password2 = $_POST['password2'];
$password = $password1;
// SQL-Anweisung basteln, um Daten in die DB-Tabelle einzufügen.
if ($password1 == "" or $password2 == "") {
echo "<hr><center><font face=\"Arial\" color=\"#333333\"><b>Bitte trage Dein neues Passwort ein.</b></font></center><hr>";
}else{
if ($password1 != $password2) {
require_once("config.php");
$sql = "UPDATE user
SET password=\"MD5('".$password."'),\"";
// SQL-Anweisung an die DB schicken und im Fehlerfall eine Meldung ausgeben.
$res = mysql_query($sql) or exit( __LINE__.', '.__FILE__.'<br />' .mysql_error());
// Wenn kein Fehler aufgetreten ist auf die Startseite weiterleiten.
echo "<meta http-equiv='refresh' content='0; url=index.php?site=home'>" ;
}else{
echo "<font face=\"Arial\" color=\"#333333\">Die angegebenen Passwörter sind nicht identisch!</font>";
}
}else{
echo "<font face=\"Arial\" color=\"#333333\">Die angegebenen Benutzerdaten sind nicht korrekt!</font>";
}
?>
Hast du vllt. ne Idee, wo der Wurm drin sein könnte?
Vielen Dank im Voraus =)
LG Zneaf
-
12.05.11 14:43 #8
- Registriert seit
- Sep 2004
- Ort
- Möglingen (BaWü)
- Beiträge
- 3.109
Mir tränen gleich die Augen vor lauter Suchen. Welchen Link meist du?
Was aussieht wie ein Link ist das hier "pwreset.php?username='.$username.'&id='.$id;"
Das sieht aber auch nur so aus weil ja die Domain sleber fehlt und das < a > -Tag ist auch nicht vorhanden.Sollte ein Tipp von mir geholfen haben, habe ich nichts gegen eine entsprechende Bewertung oder ein Danke und wenn ein Problem gelöst ist, dann den Beitrag bitte auch als erledigt markieren.
Was ich gar nicht leiden kann sind User die es nicht für nötig halten auf Antworten zu reagieren, die Themen nicht als erledigt markieren und/oder die sich nicht für Hilfe bedanken.
-
Abgesehen von deinem momentanen Problem:
- Der User muss die Geheim-Frage selbst eingeben? Also wenn ich für alle Webseiten, bei denen ich ein Account habe, nicht nur die Antwort sondern auch noch die Frage im Kopf haben müsste, dann Prost! Vielleicht erinnere ich mich gerade noch an "irgendwas mit dem Mädchennamen meiner Mutter", aber dann auf die korrekte Formulierung samt Interpunktion und Groß-/Kleinschreibung zu kommen ist schlicht unmöglich. Sprich: Dein direkter Stringvergleich in der SQL-Abfrage wird NIE zutreffen, da sich kein User die konkrete Frage merken kann, die er vor ewig langer Zeit bei dir angegeben hat.
- Die benutzt die $_POST Variable direkt in deiner SQL-Abfrage, was SQL-Injections erlaubt. Du solltest vorher unbedingt soetwas wie mysql_real_escapte_string() anwenden.
Hilfreiche Beiträge dürfen gerne über den Stern oder den "Danke" Button unter jedem Post positiv bewertet werden ;) Danke...
-
12.05.11 17:55 #10
Hallo,
wie tombe sagte, welchen Link meinst du? Und zeig mal bitte den Quelltext her, der generiert wird.
Außerdem habe ich einen Fehler entdeckt: Du vergleichst im SQL-Query einen Integer mit einer Zeichenkette:
Entferne mal die Anführungsstriche.PHP-Code:$sql = "SELECT id
FROM user
WHERE username='".$username."'
AND pw_reset_id='".$id."'"; /* hier */
mfg ComFreek
Falls ich dir geholfen habe, würde ich mich über ein DANKE freuen!
Kenn mich am besten aus in C++, WEB-Sprachen (PHP, HTML, JavaScript) und vllt. mehr
[PHP] Überprüfen, ob Website erreichbar • Sicherheit in PHP-Codes schaffen • Google Chrome-Extension für tutorials.de • json_compress()
-
Die pw_reset_id ist ein SHA-1, also kein Integer. Die Spalte ist ja sicherlich auch als VARCHAR(40) definiert. Die Anführungszeichen würde ich also lassen

Darüber würde ich mir auch mal Gedanken machen:
PHP-Code:if ($password1 != $password2) {
require_once("config.php");
$sql = "UPDATE user
SET password=\"MD5('".$password."'),\"";
//...
Geändert von DeeJTwoK (12.05.11 um 18:24 Uhr)
Hilfreiche Beiträge dürfen gerne über den Stern oder den "Danke" Button unter jedem Post positiv bewertet werden ;) Danke...
-
Hey Leute

also...ich weiß garnicht wo ich anfangen soll xD
1. @ tombe: ich meinte genau den Link, den du gepostet hast. Die Domain habe ich bei meinem Post hier extra entfernt, da ich diese noch nicht veröffentlichen möchte =)
Den Link erhält der Benutzer genau dann, wenn er die Daten eingegeben hat und somit eine Mail erhalten hat.
2. @ DeeJTwoK: Das mit der Geheimabfrage ist momentan nur zu Versuchszwecken...das werde ich natürlich nch verfeinern, sobald das Gerüst funktioniert
Mit " mysql_real_escapte_string()" hast du natürlich recht....sollte eigentlich drin sein. War ein Fehler meinerseits, der soeben behoben wurde
3. @ ComFreek: Ich meinte den Link, der automatisch erstellt und per Mail verschickt wird, sodass der User sein PW ändern kann. Mit "generiertem Quelltext" meinst du dann bestimmt auch diesen Link oder?
Falls ja, habe ich hier ein Testbeispiel (wieder ohne Domain):
http://DOMAIN.de/pwreset.php?usernam...bab700e543a7e;
So steht der Link dann in der Mail drin...natürlich mit domain
4. @ DeeJTwoK: Die if-Abfrage mit den Passwörtern sollte eig. genau anders herum lauten xD Danke fürs Aufzeigen
@all: Sind die Anführungszeichen jetzt richtig über die hier geredet wurden oder nicht?
Puh...hoffe ich konnte alles beantworten und habe nichts vergessen
Aber nochmal zu meinem Problem: Der Link leitet mich auf die gewünschte Seite (pwreset.php) weiter. Allerdings kommt dann folgende Fehlermeldung:
Error[SELECT|User]:
SELECT id
FROM user
WHERE username=''
AND pw_reset_id=''
MySQL-Error: Unknown column 'id' in 'field list'
Wenn ich das richtig verstehe, gibts da wohl nen Fehler beim Übertragen oder Auslesen der id. Habt ihr vllt. ne Ahnung, woran das liegen könnte?
Danke für eure Hilfe
LG Zneaf
-
13.05.11 12:39 #13
- Registriert seit
- Sep 2004
- Ort
- Möglingen (BaWü)
- Beiträge
- 3.109
Das bedeutet das du in der Tabelle "user" kein Feld mit dem Namen "id" hast.
Also einfach den Aufbau der Tabelle anschauen und den Namen im Skript oder der Tabelle ändern.Sollte ein Tipp von mir geholfen haben, habe ich nichts gegen eine entsprechende Bewertung oder ein Danke und wenn ein Problem gelöst ist, dann den Beitrag bitte auch als erledigt markieren.
Was ich gar nicht leiden kann sind User die es nicht für nötig halten auf Antworten zu reagieren, die Themen nicht als erledigt markieren und/oder die sich nicht für Hilfe bedanken.
-
Und der Link ist noch falsch, das siehst du ja auch selbst: Der Link enhält einfache Anführungszeichen und Punkte, die da nicht reingehören:
Generiere ihn nicht so:Code :1
http://domain.de/pwreset.php?username=%27.Zneaf.%27&id=%27.55c414bef5dab1b08f03a49ef81bab700e543a7e;
Sondern so:PHP-Code:$nachricht = "...
<td><font face=\"Arial\" color=\"#333333\">pwreset.php?username='.$username.'&id='.$id;</td>
...";
Oder besser noch so:PHP-Code:$nachricht = "...
<td><font face=\"Arial\" color=\"#333333\">pwreset.php?username=$username&id=$id</td>
...";
Ein schließendes </font> fehlt übrigens auch um den Link, genauso wie das schon erwähnte <a> Tag.PHP-Code:$nachricht = "...
<td><font face=\"Arial\" color=\"#333333\">pwreset.php?username=".$username."&id=".$id."</td>
...";
Hilfreiche Beiträge dürfen gerne über den Stern oder den "Danke" Button unter jedem Post positiv bewertet werden ;) Danke...
-
13.05.11 15:03 #15
Ja sorry. Danke DeeJTwoK. War schon etwas länger her, sodass ich meinen eigens vorgeschlagenen Datentyp vergessen hatte

@Zneaf:
Zeig doch mal den generierten SQL-Code her. "Generiert" heißt, dass der PHP-Code bzw. die Variablen (z.B. $id) schon eingesetzt worden sind.
Hier mit:
Übrigens ist der Font-Tag veraltet, also lieber auf CSS umsteigen, z.B.:PHP-Code:echo $sql;
Code css:1 2 3 4
#myspan { color: green; }
HTML-Code:<span id="myspan">text</span>
mfg ComFreek
Falls ich dir geholfen habe, würde ich mich über ein DANKE freuen!
Kenn mich am besten aus in C++, WEB-Sprachen (PHP, HTML, JavaScript) und vllt. mehr
[PHP] Überprüfen, ob Website erreichbar • Sicherheit in PHP-Codes schaffen • Google Chrome-Extension für tutorials.de • json_compress()
Ähnliche Themen
-
Win XP - Passwort vergessen.
Von gothic ghost im Forum Microsoft WindowsAntworten: 16Letzter Beitrag: 18.09.11, 08:12 -
XP-Passwort vergessen
Von Christoph im Forum Microsoft WindowsAntworten: 9Letzter Beitrag: 02.04.09, 20:08 -
PDF Passwort vergessen
Von borsti im Forum TypografieAntworten: 1Letzter Beitrag: 16.12.04, 16:46 -
Passwort vergessen...
Von eVoDarkAngel im Forum PHPAntworten: 2Letzter Beitrag: 01.02.04, 11:35 -
Passwort vergessen
Von lohokla im Forum Linux & UnixAntworten: 1Letzter Beitrag: 25.05.03, 19:31



30Danke

Zitieren



Login






[PHP][Snippet] Array zu XML konvertieren