Passwort Ändern

  • Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Spitzer

Mitglied
23 März 2020
73
0
6
21
Hay.

Ich bin fleissig am php lernen und versuche nun ein Formular zu erstellen.

Nun versuche ich einen wert in meinem fall ein Passwort zu updaten.

Bis auf das ändern funktioniert alles, nur dass Updaten nicht jedoch gibt es auch keine Fehlermeldungen.

(Bin noch am lernen und ich will noch herausfinden wie ich das ganze etwas kompakter schreiben kann, daher nehmt es mir nicht übel ich mache das wirklich nur zum lernen)

ich habe mir das so gedacht:
HTML:
<?php
//Verbindung zur DB
require_once ('mysql-connection.php');

$db = new mysqli( $host_MYSQL , $user_MYSQL , $password_MYSQL , $database_MYSQL);

    if($db->connect_error):
        echo 'Verbindung Fehlgeschlagen';
    endif;

$abfrage = $db->query("SELECT * From user");

    //Session select user
    $search_user = $db->prepare("SELECT * FROM user WHERE id = ?");
    $search_user->bind_param('i',$_SESSION['user']);
    $search_user->execute();
    $search_result = $search_user->get_result();

    if($search_result->num_rows == 1):
        $search_object = $search_result->fetch_object();
        //Logout funktion
        if(isset($_POST['logout'])):
            session_destroy();
            header('Location: ./index.php');
        endif;
    endif;

    //Passwort Ändern
    while($ausgabe         = $abfrage->fetch_object()){
    $name                = $search_object->user;
    $active_password    = $ausgabe->password;
    $old_password         = $_POST['old_password'];
    $new_password         = $_POST['new_password'];
    $confirm_password     = $_POST['confirm_password']; 
    };   

    //Funktion zum Updaten
    $update = mysqli_query($db, "UPDATE user Set password = $new_password' WHERE id = '$name'");
  
    if(isset($_POST['change_password'])){
        // Überprüfe auf Leere Felder
        if (empty($old_password) || empty($new_password) || empty($confirm_password)) {
                echo "fülle alle felder aus";
            }
        else {
            // Überprüfe ist Aktives Passwort gleich Angegebenes altes Passwort
              if ($active_password === $old_password){
                //Überprüfe ist Aktives Passwort nicht gleich Neues Passwort
                if ($active_password !== $new_password) {
                    //Überprüfe sind neues Passwort und Bestätigung gleich
                    if ($new_password === $confirm_password){
                        //Passwort ersetzen
                        $update;
                      
                    }
                  
                    else {
                        echo "Die Passwörter Stimmen nicht überein!";
                    }
                }
              
                else {
                    echo "Das Neue Passwort darf nicht dem alten Entsprechen!";
                }
            }
            else {
                echo "Das Alte Passwort ist fehlerhaft!";
            }
        }
    }
      

?>
    <nav class="nav-user">
        <div class="nav-center">
            <ul class="nav-user-ul">
                <li class="nav-user-li">
                    <a class="nav-button" href="index.php?page=user">Nutzer Profil</a>
                </li>
                <li class="nav-user-li">
                    <a class="nav-button" href="index.php?page=order">Bestellungen</a>
                </li>
                <li class="nav-user-li">
                    <a class="nav-button" href="index.php?page=bill">Rechnungen</a>
                </li>
                <li class="nav-user-li">
                    <a class="nav-button" href="index.php?page=settings">Einstellungen</a>
                </li>
            </ul>             
        </div>
    </nav>
        <div class="item-user-div">
            <form method="post">
                    <input name="old_password" placeholder="Altes Passwort" type="password">
                    <input name="new_password" placeholder="Neues Passwort" type="password">
                    <input name="confirm_password" placeholder="Passwort Widerholen" type="password">
                    <button class="button-send" method="post" name="change_password">Passwort Ändern</button>
                    <button class="button-send" method="post" name="logout">Logout</button>
               </form>
 
Zuletzt bearbeitet:

Spitzer

Mitglied
23 März 2020
73
0
6
21
Schön, hast du auch eine Frage zu diesem schlimmen PHP-Code?
Hay ja habe gerade bearbeitet, nimm mir den Code bitte nicht übel wie gesagt versuche ich es zu lernen, Danke.

PS: wenn du willst darfst du mir gerne einen tipp geben was dir als Profi nicht gefällt und was du gut findest würde mir sehr helfen!
 

m.scatello

Senior HTML'ler
15 Februar 2017
1.412
176
63
Solange ein Script nicht fertig und getestet wurde, sollten die ersten Zeilen immer so aussehen:

PHP:
<?php
    error_reporting(E_ALL);
    ini_set('display_errors', true);
 

Spitzer

Mitglied
23 März 2020
73
0
6
21
Solange ein Script nicht fertig und getestet wurde, sollten die ersten Zeilen immer so aussehen:

PHP:
<?php
    error_reporting(E_ALL);
    ini_set('display_errors', true);
ich hatte es so und mit deinem errer report auch nur die 3 notizen
Code:
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

btw hier kannst du es ansehen


um den gesuchten Bereich zu finden Kurtz einloggen dann auf User und Einstellungen : user TEST pw 1234
 

Spitzer

Mitglied
23 März 2020
73
0
6
21
Wirklich? Dann sage ich: fast alles
Hast du vielleicht noch einen spezifischeren tipp? also ist die Struktur kacke oder weil ich die php und html noch nicht getrennt habe? und so allgemein würdest du php und html immer trennen? wenn ja die php Funktionen in verschiedene Dateien? Ich versuche mir echt mühe zugeben auch mit dem Kommentieren und allem daher wäre es mir wichtig dazu zulernen
 

basti1012

Senior HTML'ler
26 November 2017
1.521
167
63
Minden
sebastian1012.bplaced.net
Da steht doch alles
Code:
Notice: Undefined index: old_password in /home/ucofenep/www/1-step.ch/pages/profile/settings.php on line 36

Notice: Undefined index: new_password in /home/ucofenep/www/1-step.ch/pages/profile/settings.php on line 37

Notice: Undefined index: confirm_password in /home/ucofenep/www/1-step.ch/pages/profile/settings.php on line 38
Dein $_POST['old_password'] existiert erst, nachdem du Passwort ändern Button drückst.
Bei den beiden anderen auch.
Ein isset könnte dir schon mal weiter helfen
 

Spitzer

Mitglied
23 März 2020
73
0
6
21
Da steht doch alles
Code:
Notice: Undefined index: old_password in /home/ucofenep/www/1-step.ch/pages/profile/settings.php on line 36

Notice: Undefined index: new_password in /home/ucofenep/www/1-step.ch/pages/profile/settings.php on line 37

Notice: Undefined index: confirm_password in /home/ucofenep/www/1-step.ch/pages/profile/settings.php on line 38

Ja aber die variablen werden ja gefüllt sobald etwas in die Input Felder eingefügt wird und der button betätigt.

kannste ausprobieren habe auch mal versucht fehlermeldungen zumachen wen etwas nicht überein stimmt
 

basti1012

Senior HTML'ler
26 November 2017
1.521
167
63
Minden
sebastian1012.bplaced.net
Du solltest das alles noch mal neu machen.
Zb.
PHP:
$abfrage = $db->query("SELECT * From user");
$search_user = $db->prepare("SELECT * FROM user WHERE id = ?");
Warum 2 mal SELECT ?
Daraus die 2 te Frage
PHP:
   while($ausgabe         = $abfrage->fetch_object()){
Warum eine Schleife?
Du willst doch nur dein Passwort ändern, oder?
Beim 2ten SELECT wird eine ID gebraucht und die sollte (darf) nur einmal vorkommen, dann brauch man keine Schleife.
Wenn du deine Password Bedingungen durchlaufen hast, kommt der Code
PHP:
                   if ($new_password === $confirm_password){
                        //Passwort ersetzen
                        $update;
                    }
Was soll das?
Da sollte irgendwas stehen, was das Password ändert.

Das geht meiner Meinung nach gar nicht
PHP:
    $active_password      = $ausgabe->password;
                //Überprüfe ist Aktives Passwort nicht gleich Neues Passwort
                if ($active_password !== $new_password) {
Wenn einer sein Passwort mit den gleichen Password ersetzen will dann soll er das doch machen.
Außerdem speichert man Passwörter nie im Klartext, dein Code sagt mir das du das machst.
 
Zuletzt bearbeitet:

Spitzer

Mitglied
23 März 2020
73
0
6
21
$abfrage = $db->query("SELECT * From user"); $search_user = $db->prepare("SELECT * FROM user WHERE id = ?");
ehrlich gesagt habe ich das so aus einem tutorial übernommen :/
while($ausgabe = $abfrage->fetch_object()){
haste recht ist komplett unnötig habe ich soeben geändert danke!
Was soll das?
Da sollte irgendwas stehen, was das Password ändert.

hatte in einem bericht gellesen das man dass so machen soll

erst die Funktion in eine variable speichern (aus dem forum kopiert und an die tabelle angepasst)

PHP:
$update = mysqli_query($db, "UPDATE user Set password = $new_password' WHERE id = '$name'");

und dann so aufrufen
if ($new_password === $confirm_password){ //Passwort ersetzen $update; }
 
Zuletzt bearbeitet:

m.scatello

Senior HTML'ler
15 Februar 2017
1.412
176
63
Für mich sieht das ganze Script so aus, als wenn zwei Scripte zusammen kopiert worden wären, und das ohne wirklich drüber nachzudenken, was da so passiert.

PHP:
require_once ('mysql-connection.php');

$db = new mysqli( $host_MYSQL , $user_MYSQL , $password_MYSQL , $database_MYSQL);
Ja was denn nun? Wird die Verbindung in mysql-connection.php oder in dem Script aufgebaut?
PHP:
echo 'Verbindung Fehlgeschlagen';
Diese Meldung sollte nicht mit echo, sondern mit die ausgeben werden, denn ein weiterer Ablauf des Scriptes ist sinnbefreit.
PHP:
$abfrage = $db->query("SELECT * From user");
Never ever "Select *"
PHP:
$search_user->bind_param('i',$_SESSION['user']);
Wo wird die Session überhaupt gestartet? Und wo wird sicher gestellt, dass es $_SESSION['user'] überhaupt gibt. Und wenn doch, steht da eine ID drin und kein User, also unglückliche Namensgebung.
PHP:
$old_password         = $_POST['old_password'];
$new_password         = $_POST['new_password'];
$confirm_password = $_POST['confirm_password'];
Was soll das in der Schleife? Und wieso werden da $_POST-Variablen sinnlos umgeschrieben? Und (das wurde ja schon erwähnt) steht in $_POST beim ersten Aufruf nichts drin.
PHP:
$update = mysqli_query($db, "UPDATE user Set password = $new_password' WHERE id = '$name'");
Wieso mysqli_query, wenn du ein paar Zeilen vorher mit $db arbeitest. $name wird auch ohne Sicherheiten verwendet und das Passwort in Klarschrift in die DB geschrieben. Das ist eine Katastrophe! Mal ganz davon abgesehen, dass keinerlei Fehlerprüfung gemacht wird, denn das Update wird so nicht funktionieren.

So, jetzt hast du erst mal genug zu tun.
 

Spitzer

Mitglied
23 März 2020
73
0
6
21
Wenn einer sein Passwort mit den gleichen Password ersetzen will dann soll er das doch machen.
Außerdem speichert man Passwörter nie im Klartext, dein Code sagt mir das du das machst.

hay Ja das Passwort wird noch im klartext gespeichert, ich weiss auch das ich dass mit hash ändern muss.

das steht aber noch weiter unten auf de todo liste weil ich erstmals das ändern hinbekommen möchte
 

tk1234

Mitglied
2 September 2020
64
17
8
Den wichtigsten Fehler den ich bereits im alten Thread genannt hatte, ist immer noch enthalten (vom Rest auch mindestens noch der dass die Formularelemente keine Beschriftung (-><label>, *kein* placeholder-Attribut) haben.
Dazu gekommen sind noch:
- fehlende Behandlung von Kontextwechseln (und damit einhergehendem Sicherheitsloch)
- Syntaxfehler im SQL
- überflüssige class-Attribute (alle class-Attribute innerhalb von <nav> sind überflüssig)
- Missachtung des EVA-Prinzips
- Verschachtelung von if-Blöcken (macht den Code unübersichtlich/schwer lesbar)
- button-Elemente haben kein method-Attribut
 

Spitzer

Mitglied
23 März 2020
73
0
6
21
require_once ('mysql-connection.php'); $db = new mysqli( $host_MYSQL , $user_MYSQL , $password_MYSQL , $database_MYSQL);

das habe ich bereits behoben hatte ein kleines Problem mit dem einbinden der Datei die verbindung wird nun komplett über die externe datei aufgebaut.

Fehler meldungen merke ich mir danke für den hinweis.

Never ever "Select *"
Was ist an select nicht gut?

Was soll das in der Schleife? Und wieso werden da $_POST-Variablen sinnlos umgeschrieben? Und (das wurde ja schon erwähnt) steht in $_POST beim ersten Aufruf nichts drin.

schleife ist bereits weg. ich dachte mir ist übersichtlicher Post in variablen zu speichern.

danke für die hilfe ich arbeite die liste mal ab.
 

Spitzer

Mitglied
23 März 2020
73
0
6
21
Ich denke es ist vielleicht nicht perfekt aber ich habe nun das Passwort gehast und den Kontextwechsel eingebaut so das es sauber funktioniert.



So funktionierts nun:


HTML:
<?php
error_reporting(E_ALL);
ini_set('display_errors', true);

//Verbindung zur DB
require_once __DIR__. '/../../mysql-connection.php';

$abfrage = $db->query("SELECT * From user");

    //Session select user
    $search_user = $db->prepare("SELECT * FROM user WHERE id = ?");
    $search_user->bind_param('i',$_SESSION['user']);
    $search_user->execute();
    $search_result = $search_user->get_result();

    if($search_result->num_rows == 1):
        $search_object = $search_result->fetch_object();
        //Logout funktion
        if(isset($_POST['logout'])):
            session_destroy();
            header('Location: ./index.php');
        endif;
    endif;
    
    //Passwort Ändern
    $ausgabe             = $abfrage->fetch_object();
    $name                = $search_object->user;
    $active_password    = $ausgabe->password;
    $old_password        = $_POST['old_password'];
    $new_password        = $_POST['new_password'];
    $confirm_password    = $_POST['confirm_password'];
    $old_password        = htmlspecialchars($old_password, ENT_QUOTES,'UTF-8');
    $new_password        = htmlspecialchars($new_password, ENT_QUOTES,'UTF-8');
    $confirm_password      = htmlspecialchars($confirm_password, ENT_QUOTES,'UTF-8');
    $old_password        = md5($old_password);
    
    
    if(isset($_POST['change_password'])){
        // Überprüfe auf Leere Felder
        if (empty($old_password) || empty($new_password) || empty($confirm_password)) {
                echo "fülle alle felder aus";
            }
        else {
            //Überprüfe sind neues Passwort und Bestätigung identisch
            if ($active_password==$old_password && $new_password === $confirm_password){
                //Versclüssle neues Passwort
                $new_password = md5($new_password);
                $update_query =    mysqli_query($db, "update user set password ='$new_password' WHERE user='$name'");
                //Passwort ersetzen
                $return_message = '<a class="button-send" href="index.php?page=home">Passwort erfolgreich geändert</a>';
            }    
            else {
                $return_message = '<a class="button-send" href="index.php?page=contact">Etwas ist Schiefgelaufen!</a>';
                
            }
        }
    }
?>
    <nav class="nav-user">
        <div class="nav-center">
            <ul class="nav-user-ul">
                <li class="nav-user-li">
                    <a class="nav-button" href="index.php?page=user">Nutzer Profil</a>
                </li>
                <li class="nav-user-li">
                    <a class="nav-button" href="index.php?page=order">Bestellungen</a>
                </li>
                <li class="nav-user-li">
                    <a class="nav-button" href="index.php?page=bill">Rechnungen</a>
                </li>
                <li class="nav-user-li">
                    <a class="nav-button" href="index.php?page=settings">Einstellungen</a>
                </li>
            </ul>                
        </div>
    </nav>
        <div class="item-user-div">
            <form method="post">
                    <input name="old_password" placeholder="Altes Passwort" type="password">
                    <input name="new_password" placeholder="Neues Passwort" type="password">
                    <input name="confirm_password" placeholder="Passwort Widerholen" type="password">
                    <button class="button-send" name="change_password">Passwort Ändern</button>
                    <button class="button-send" name="logout">Logout</button> 
                    <?php echo "<br><br>".$return_message; ?>
               </form>
 

tk1234

Mitglied
2 September 2020
64
17
8
Du hast das Prinzip des Kontextwechsels noch nicht verstanden: das htmlspecialchars() in dem Code ist falsch und der Kontextwechsel zu SQL wird überhaupt nicht behandelt. Zudem ist md5() nicht geeignet Passwörter zu hashen (nicht verschlüsseln!), verwende password_hash().
Weitere im Thread bereits genannte Fehler sind ebenfalls noch drin - setzen, 6.
 
  • Like
Reaktionen: m.scatello