Login funktioniert lokal, aber nicht online

  • PHP

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von siycah.

    Login funktioniert lokal, aber nicht online

    PHP-Quellcode

    1. <?php
    2. // Database connection settings
    3. $host = "localhost";
    4. $username = "root";
    5. $password = "";
    6. $dbname = "meinedatenbank";
    7. // Create connection
    8. $conn = mysqli_connect($host, $username, $password, $dbname);
    9. // Check connection
    10. if (!$conn) {
    11. die("Connection failed: " . mysqli_connect_error());
    12. }
    13. // Check if form submitted
    14. if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    15. // Collect form data
    16. $username = $_POST['username'];
    17. $password = $_POST['password'];
    18. $user_id = $_POST['user_id'];
    19. // Prepare SQL statement with placeholders
    20. $stmt = mysqli_prepare($conn, "SELECT user_id, password FROM users WHERE username = ?");
    21. // Bind parameters to statement
    22. mysqli_stmt_bind_param($stmt, "s", $username);
    23. // Execute statement
    24. mysqli_stmt_execute($stmt);
    25. // Get result
    26. mysqli_stmt_bind_result($stmt, $user_id, $hashed_password);
    27. // Check if user exists and password is correct
    28. if (mysqli_stmt_fetch($stmt) && password_verify($password, $hashed_password)) {
    29. // Redirect to main page and store user_id in session
    30. session_start();
    31. $_SESSION['user_id'] = $user_id;
    32. header("Location: main.php");
    33. exit();
    34. }
    35. } else {
    36. echo "Invalid username or password";
    37. // Close statement
    38. mysqli_stmt_close($stmt);
    39. // Close database connection
    40. mysqli_close($conn);
    41. }
    42. ?>


    servus, der code funktioniert lokal aber nicht online.

    Wenn ich online einen login versuche, erscheint die gezeigte seite einfach weiß. Lade ich sie nochmal neu, erscheint die Fehlermeldung aus Zeile 46.

    Zuvor erfolgt eine Registrierung mit gehashten passwort, die auch funktioniert aber das login funktioniert eben nicht.

    hat jemand eine Idee :S

    Visual_Prog schrieb:

    hat jemand eine Idee


    Wie ist Error-Reporting eingestellt?
    Beim entwickeln lohnt es sich alle Fehler anzeigen zu lassen, falls die config das erlaubt. Schreib mal in Zeile 2 das rein und probier nochmal:

    PHP-Quellcode

    1. error_reporting(E_ALL);

    Nachdem alles fertig ist, würde ich dann das machen:

    PHP-Quellcode

    1. error_reporting(0);
    //Fehler können Angreifern eine Hilfe sein, daher im produktiven Modus keine anzeigen.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    Dein script wirkt ein auch wenig komisch. Wieso eine UserId via POST? Wenn Passwort und Username reinkommen reicht das doch um in der DB zu schauen ob der User existiert und ob das Passwort-Hash identisch ist. Schickst du denn via POST die userId?

    Du holst auch ein UserId aus der DB, verwendest sie aber nicht.

    Ich habe meine Queries für Logins etwa so:(aber mit PDO PreparedStatments)
    Pseudocode

    Quellcode

    1. username = post->username
    2. password = post->password
    3. hashedpassword = hashfunktion(password)
    4. SELECT id FROM tablexyz WHERE username = username AND password = hashedpasswort


    Wenn dann 1 Datensatz kommt, gibt es den user und das password stimmt.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „DTF“ ()

    Habe es geändert, sodass es jetzt so aussieht, aber gleiches ergebnis :/ lokal gehts aber nicht online leider nicht :/

    PHP-Quellcode

    1. <?php
    2. // Database connection settings
    3. $host = "localhost";
    4. $dbname = "meinedatenbank";
    5. $db_user = "root";
    6. $db_password = "";
    7. if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    8. // Collect form data
    9. $username = $_POST['username'];
    10. $password = $_POST['password'];
    11. // Connect to database
    12. $conn = mysqli_connect($host, $db_user, $db_password, $dbname);
    13. // Check connection
    14. if (!$conn) {
    15. die("Connection failed: " . mysqli_connect_error());
    16. }
    17. // Prepare SQL statement with placeholders to prevent SQL injection
    18. $stmt = mysqli_prepare($conn, "SELECT password FROM users WHERE username = ?");
    19. // Bind parameters to statement
    20. mysqli_stmt_bind_param($stmt, "s", $username);
    21. // Execute statement
    22. mysqli_stmt_execute($stmt);
    23. // Get result
    24. mysqli_stmt_bind_result($stmt, $hashed_password);
    25. // Check if user exists and password is correct
    26. if (mysqli_stmt_fetch($stmt) && password_verify($password, $hashed_password)) {
    27. // Login successful, start session with username
    28. session_start();
    29. $_SESSION['username'] = $username;
    30. header("Location: main.php");
    31. exit();
    32. } else {
    33. // Login failed, display error message
    34. $error_message = "Invalid username or password";
    35. }
    36. // Close statement and database connection
    37. mysqli_stmt_close($stmt);
    38. mysqli_close($conn);
    39. }
    40. ?>


    EDIT: ich vermute dass ich bei der Weiterleitung einen Fehler habe, weil diese datei alleine für sich steht und dann auf die eigentliche session weiterleitet, werde da weiter rumtesten

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Visual_Prog“ ()

    Führe mal diesen Code aus und vergleiche die ausgegeben beiden Hashes: Sind sie gleich oder unterschiedlich?


    Code entfernt,m, war auf dem falschen Dampfer
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „DTF“ ()

    Sorry ich war auf dem falschen Dampfer. Hatte evrgessen das bei password_hash zufällige Werte einfließen.

    Welchen Hashalgo hast du zum hashen des Passwort in der DB genommen?
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „DTF“ ()

    Ich vermute die beiden Server setzen unterschiedliche Algorythmen ein, hast du die Registrierung auf dem Online-Server noch mal gemacht oder dort die DB importiert? Wenn du die DB importiert hast, Registriere dich auf dem Online Server neu. Ist das dein Server oder ein Webspace?

    Sollte es nach der erneuten Registrierung gehen, sind unterschiedliche Algos im Einsatz. Du kannst aber selbst hashen(algo festlegen) um diesen Problem aus dem Weg zu gehen. So werden aber keine zufälligen Werte hinzugefügt, wie bei password_hash. Dann funktioniert password_verify aber nicht, du musst dann den Input(post password) selbst hashen und mit dem Hash aus der DB vergleichen.

    PHP-Quellcode

    1. <?php
    2. $password = "123";
    3. foreach (hash_algos() as $value)
    4. {
    5. $hashed = hash($value, $password);
    6. echo $value.":<br>".$hashed."<br><br>";
    7. }

    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „DTF“ ()

    also ich habe einen webspace.
    ich habe da probeweise mehrere nutzer registriert und die registrierung scheint auch in ordnung zu sein. Die nutzer und das gehashte passwort werden in der datenbank angezeigt. Habe entsprechend das login mit verschiedenen usern versucht, aber vergebens.
    ich habe die DB nicht importiert, habe die online neu erstellt und die tabelle 'users' manuell erstellt, wo sich usernames und password befinden.

    ich habe noch nie was selbst gehasht ist das kompliziert ? ^^
    @DTF hey DTF, danke nochmal für deinen Hinweis mit dem Passwort.

    ich habe keinen eigenen Passwort gehasht, es lag an was anderes, was schlichtes....

    in der datenbank waren für das gehashte passwort nur 40 chars eingestellt.
    das hat aber nicht gereicht, da das gehashte passwort anscheinend 60 chars braucht.

    habe es einfach umgestellt und jetzt klappt es :)

    da sieht man wie wichtig die einstellungen in der datenbank sind xD

    also danke nochmal für den hinweis und frohe Ostern!

    Visual_Prog schrieb:

    das hat aber nicht gereicht, da das gehashte passwort anscheinend 60 chars braucht.


    Ich habe für sowas eine Faustregel: wenn du nicht 100% weißt, wie groß die Daten sind, riskiere ein bisschen mehr Speicherplatz.
    Für Passwörter nehme ich grundsätzlich 4096B, völlig egal welche Umgebung ich nutze.

    Nutze ich C++, schreibe ich die Hashfunktion sowieso selber und verwende einen sichereren Standard. Bei PHP hängt es vom Distro ab und von der PHP-Version, welcher Algo verwendet wird.
    Bei C# ist es ein ähnliches Prinzip wie bei C++
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems

    Selbstständiger Softwareentwickler & IT-Techniker.