Probleme mit Script
schmichl
- php
Hallo Leute!
Ich arbeite gerade an einem Script, mit dem man ein Passwort ändern kann. Nur leider funktioniert es nicht so wie ich es will. Einmal hat es kurz funktioniert (leider nicht ganz richtig), dann hab ich es geändert und jetzt geht gar nix mehr. Also einmal das Script:
<h1>Passwort ändern</h1><br>
<?php
if ($sent==1) {
if (!$oldpw) {echo "Bitte geben Sie Ihr altes Passwort ein!"; unset($sent);}
if (!$newpw) {echo "Bitte geben Sie ein neues Passwort ein!"; unset($sent);}
$auslesen=fopen("passwort.txt", "r");
if ($oldpw!=$passwort) {
echo "Ihr altes Passwort war falsch!<br>"; unset($sent);
}
if ($oldpw==$passwort) {
fclose($auslesen);
$passwort="$passwort= "$newpw";";
$handle=fopen("passwort.txt", "w+");
fputs($handle, $passwort);
fclose($handle);
echo "Die Passwortänderung war erfolgreich!";
}
}//Ende Klammer If sent==1
if (!$sent)
{
?>
<form action="<?php echo $PHP_SELF; ?>" method="post">
<input type="hidden" name="sent" value="1"></input>
Altes Passwort: <input type="password" name="oldpw" size="15"></input><p>
Neues Passwort: <input type="text" name="newpw" size="15"></input><p>
<input type="submit" name="submit" value="OK"></input></form>
<?php
}
?>
Also es sollte so funktionieren:
Man macht eine Textdatei und schreibt das hinein:
$passwort="admin";
Dann wird es ausgelesen, wenn es mit der Eingabe des alten Passwortes (also eben "admin") übereinstimmt, wird es mit dem neuen überschrieben, sonst soll eine Fehlermeldung kommen. Nur leider, einmal hat es funktioniert obwohl eine Fehlermeldung gekommen ist, jetzt kommt immer eine Fehlermeldung (Ihr altes Passwort ist falsch!)
Was habe ich falsch gecodet?
MfG,
Michael
PS: Ich weiß, ihr werdet denken, na da kann ja jeder das Passwort sehen, wenn er die textdatei öffet, aber ich will es noch mit md5(); verschlüsseln (hoffentlich schaffe ich das)!!!
Moin schmichl,
<h1>Passwort ändern</h1><br>
<?phpif ($sent==1) {
if (!$oldpw) {echo "Bitte geben Sie Ihr altes Passwort ein!"; unset($sent);}
if (!$newpw) {echo "Bitte geben Sie ein neues Passwort ein!"; unset($sent);}$auslesen=fopen("passwort.txt", "r");
if ($oldpw!=$passwort) {
echo "Ihr altes Passwort war falsch!<br>"; unset($sent);
}
if ($oldpw==$passwort) {
fclose($auslesen);
$passwort="$passwort= "$newpw";";$handle=fopen("passwort.txt", "w+");
fputs($handle, $passwort);
fclose($handle);
echo "Die Passwortänderung war erfolgreich!";
}}//Ende Klammer If sent==1
if (!$sent)
{
?>
<form action="<?php echo $PHP_SELF; ?>" method="post">
<input type="hidden" name="sent" value="1"></input>
Altes Passwort: <input type="password" name="oldpw" size="15"></input><p>
Neues Passwort: <input type="text" name="newpw" size="15"></input><p>
<input type="submit" name="submit" value="OK"></input></form><?php
}
?>
an deinem Script stimmt leider überhaupt nichts.
1. welches Passwort von welchem User soll geändert werden.
2. Du fügst einen neuen Datensatz ein, aber Du änderst keinen.
3. Frage den Button ab und nicht das hidden Feld
4. Wenn das aktuelle Passwort vom Typ Passwort ist, dann sollte es auch das neue sein
5. usw... usw...
Gruß
Mike
Hallo Michael,
Ich arbeite gerade an einem Script, mit dem man ein Passwort ändern kann. Nur leider funktioniert es nicht so wie ich es will. Einmal hat es kurz funktioniert (leider nicht ganz richtig), dann hab ich es geändert und jetzt geht gar nix mehr. Also einmal das Script:
die Logik deines Scriptes scheint mir etwas durcheinander ...
$auslesen=fopen("passwort.txt", "r");
if ($oldpw!=$passwort) {
$auslesen ist dein Dateihandle. Um etwas aus deiner Datei zu lesen fehlt noch etwas wie fgets. So wie du es machst ist $passwort undefiniert.
if ($oldpw==$passwort) {
fclose($auslesen);
Immer. Nicht nur wenn das Passwort stimmt.
$handle=fopen("passwort.txt", "w+");
fputs($handle, $passwort);
fclose($handle);
ja, das sieht annehmabar aus. Wobei ich das Konstrukt $passwort="$passwort= "$newpw";"; nicht so recht verstehe. Wenn in deiner Datei folgendes steht:
passwort="ichbindaspasswort" dann musst du das beim auslesen natürlich wieder auseinanderklauben. Wenn du nur das nackte passwort reinschreibst, sparst du dir beim einlesen einen Schritt.
Grüße,
Jochen
Hi Jochen!
Könntest du mir das bitte auch mithilfe von php codes erklären, weil ich bin noch Anfänger in PHP (hab gerade mal ein Buch angefangen zu lesen und ein Kontaktformular gecodet...)!
Danke,
schmichl
Hallo Michael,
Könntest du mir das bitte auch mithilfe von php codes erklären
was war an meinem Posting unverständlich? Die prinzipielle Vorgehensweise sollte dir klar sein.
Wenn du es self machst, und es klappt ist dein Erfolg doch umso größer. Baue in deinen Code vor und nach jedem kritischen Schritt ein "echo" ein und überprüfe damit den Inhalt deiner Variablen. Du hast dir doch hoffentlich zum testen einen Server und PHP lokal installiert?
Grüße,
Jochen
Hallo Jochen!
Ja, ich habe einen PHP Server installiert!
- Das gespeicherte Passwort aus der Datei auslesen
- mit dem eingegebenen vergleichen
Wenn ich das auslese, muss ich es ja in eine variable packen, dass es vergleichbar ist, oder nicht?
Grüße,
Michael
Hi Mike!
danke erstmal für dein schnelles Posting!
an deinem Script stimmt leider überhaupt nichts.
Das hab ich mir fast gedacht *gg*
- welches Passwort von welchem User soll geändert werden.
Ich habe keine User, ich brauche nur ein Passwort für ein kleines CMS Script!
- Du fügst einen neuen Datensatz ein, aber Du änderst keinen.
?????
- Frage den Button ab und nicht das hidden Feld
verstehe ich auch nicht ganz...
- Wenn das aktuelle Passwort vom Typ Passwort ist, dann sollte es auch das neue sein
wie meinst du das, warum?
Moin,
ich muss die Kids in's Bett bringen. Wenn es bis dahin keine Antwort gibt, helfe ich dir weiter. Zeig mir mal deine passwort.txt
Gruß
Mike
Moin!
in der passwort.txt steht nur $passwort="admin";
wenn das passwort zB admin ist!
Gruß
schmichl
Hello,
nun mal langsam!
Es ist durchaus möglich, die Existenz eines Hidden-Fields abzufragen. Wenn man nämlich das Script initial aufruft (also über einen Link oder über die Adressleiste), dann wäre das Feld nicht vorhanden, wenn man es aber mittels ENTER aus dem Formular heraus aufruft, dann ist das Feld vorhanden.
Es ist besser, man hält auch bei den Affenformularen[Archiv] das EVA-Prinzip[Archiv] ein.
Das Script verfügt nicht über Dateilocking, was bei genügend böswilligen Zeitgenossen dazu führen kann, das man sich selber aussperrt. Die netten[tm] Leute müssen nur im selben Augenblick zugreifen, in dem Du Dein Passwort änderst, dann ist es passiert.
Ein Script wird in einem Zug ausgeführt, das bedeutet aber auch, dass man sich innerhalb eines Scriptes nicht zwei Handles holt auf dieselbe Datei, sondern das mit einem erledigt!
Es wird hier mit register_globals = on gearbeitet. Das ist antiquiert und nicht ungefährlich.
Nun zur Fehleranalyse:
Was funktioniert denn nicht an diesem Script?
Welche Debugmöglichkeiten wurden in Anspruch genommen?
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hello,
weil es so schön in mein Theam passte, habe ich mich mal damit beschäftigt:
<?php ### changepass.php ###
$dateiname = "password.txt";
$errormsg = "";
if ($_POST['sent'] == 1) ## Es liegt ein Post aus dem Form vor
{
if (!isset($_POST['oldpw']) or !(strlen(trim($_POST['oldpw'])) > 0))
{
$errormsg = "Bitte geben Sie Ihr altes Passwort ein!";
}
elseif (!isset($_POST['newpw']) or !(strlen(trim($_POST['newpw']))>0))
{
$errormsg = "Bitte geben Sie ein neues Passwort ein!";
}
elseif (!$fh = fopen($dateiname, "r+"))
{
$errormsg = "Datei lässt sich nicht öffnen";
}
elseif (!flock($fh,LOCK_EX + LOCK_NB))
{
$errormsg = "Datei wird bereits benutzt";
}
elseif (!$oldpw = fread($fh,filesize($dateiname)))
{
$errormsg = "Passwortdatei lässt sich nicht lesen";
}
elseif (trim($oldpw) != trim($_POST['oldpw']))
{
$errormsg = "Ihr altes Passwort ist falsch<br>";
}
elseif (0!=fseek($fh,0,SEEK_SET)) ## achtung ungewöhnlicher Rückgabewert
{
$errormsg = "Datei kann nicht rückgesetzt werden<br>";
}
elseif (!fwrite($fh, trim($_POST['newpw'])))
{
$errormsg = "Neues Passwort kann nicht geschrieben werden<br>";
}
elseif (!fclose($fh))
{
echo "Die Passwortdatei konnte nicht ordnungsgemäß geschlossen werden<br />";
}
else
{
$errormsg = "Passwort wurde geändert<br>";
}
}
echo "<p style="color:red; font-weight:bold;">$errormsg</p>";
echo '<p>Bitte neues Passwort eingeben</p>';
echo"
<form action="$_SERVER['PHP_SELF']" method="post">
<input type="hidden" name="sent" value="1" />
Altes Passwort: <input type="password" name="oldpw" size="15" /><p>
Neues Passwort: <input type="text" name="newpw" size="15" /><p>
<input type="submit" name="submit" value="OK" />
</form>";
?>
Angemerkt sei, dass ich diesen "elseif-Spaghetti" sonst nicht schreiben würde. Es hat mich halt nur gereizt, es mal an einem Bändle zu schreiben. Normalerweise würde ich das säuberlichst in Funktionen zerlegen *gg*
Nun muss man nur noch die automatische Fehlermeldung ausschalten (@) und dafür sorgen, dass die DPasswortdatei außerhalb der Doc-Root liegt...
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hi Tom, vielen Dank!!!
Ich hab es erst jetzt bemerkt, dass du gecodet hast!!!
Grüße nach Annerschbarrich,
schmichl
Moin nochmal,
eigentlich sollten Dir Tom's Ausführungen weiter geholfen haben!
Ist dem so?
Gruß
Mike