md5 verschlüsseltes passwort in Datenbank schreiben

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • md5 verschlüsseltes passwort in Datenbank schreiben

    Hey Leute,

    Ich versuche ein Passwort zusammen mit einem Benutzernamen per md5() zu verschlüsseln und dann in eine Datenbank zu schreiben. Ich bekomme aber immer folgende Fehlermeldung:

    Parse error: syntax error, unexpected T_STRING in .../htdocs/create_hashpw.php on line 10

    Hier mal mein Quellcode. Daten habe ich mal durch Platzhalter ersetzt.

    Quellcode

    1. <?php
    2. $link = mysql_connect('host','userid','password');
    3. $data = mysql_select_db('badcoder', $link);
    4. $hashpw = md5('websiteusername','websitepassword');
    5. if($link)
    6. {
    7. if($data)
    8. {
    9. $befehl = 'UPDATE user SET password=$_POST['hashpw'] WHERE id=1';
    10. mysql_query($befehl);
    11. if(mysql_query($befehl))
    12. {
    13. echo 'Erfolgreich erstellt!';
    14. }
    15. else
    16. {
    17. echo 'erstellen Fehlgeschlagen!';
    18. $ausgabe = mysql_error();
    19. echo $ausgabe;
    20. }
    21. }
    22. else
    23. {
    24. echo 'Failed to connect to database';
    25. }
    26. }
    27. else
    28. {
    29. echo 'Failed to connect to database host';
    30. }
    31. ?>
    Alles anzeigen


    Edit:

    Ich hab e grade den Fehler gefunden. Mann musste den MySQL Befehl wie folgt ändern:

    Quellcode

    1. $befehl = "UPDATE user SET password = '$hashpw' WHERE id = 1";


    Jetzt schreibt er mir aber folgendes in die Datenbank:

    ÉNŠ×™ù/ã?vRÅ£ªt

    Das sieht mir nicht nach einem md5 Hash aus. Ich komme damit auch nicht in den Admin Bereich meiner Website rein.
    Egal welche Zeichenketten ich als Username und Passwort eingebe, es kommt immer dieses Zeichen gewirr dabei raus.
    Wo liegt der Fehler?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Danielowski ()

  • Hi,

    hast du dir mal das Manual von MD5 angeschaut?
    string md5 ( string $str [, bool $raw_output = false ] )


    raw_output
    Wurde der optionale Parameter raw_output mit TRUE angegeben, wird der MD5-Wert im Raw Binary Format mit einer Länge von 16 Zeichen zurückgegeben.


    Quellcode

    1. $hashpw = md5('websiteusername','websitepassword');
  • Danielowski schrieb:

    Hey, wie soll ich das dann umschreiben. Wenn ich raw_output auf false stelle, kommt wieder eine Fehlermeldung, dass er das "[" nicht erwartet hat.

    Wie gibst du das denn ein? Die eckigen Klammern bedeuten, dass die Angabe optional ist und auf false brauchst du das auch nicht stellen, da false der Defaultwert ist.

    Quellcode

    1. $hashpw = md5('websitepassword');
    2. echo $hashpw; //fc7d8ba19d01c5311e90f3f7e1655ec2
  • vince schrieb:

    Danielowski schrieb:

    Hey, wie soll ich das dann umschreiben. Wenn ich raw_output auf false stelle, kommt wieder eine Fehlermeldung, dass er das "[" nicht erwartet hat.

    Wie gibst du das denn ein? Die eckigen Klammern bedeuten, dass die Angabe optional ist und auf false brauchst du das auch nicht stellen, da false der Defaultwert ist.

    Quellcode

    1. $hashpw = md5('websitepassword');
    2. echo $hashpw; //fc7d8ba19d01c5311e90f3f7e1655ec2


    mh ja so hab ich das auch probiert. Dann gibt er zwar den richtigen Code, aber in den Admin bereich komme ich immer noch nicht. Liegt wohl woanders dran.. Naja danke aber für deine Hilfe.
  • Danielowski schrieb:

    mh ja so hab ich das auch probiert. Dann gibt er zwar den richtigen Code, aber in den Admin bereich komme ich immer noch nicht. Liegt wohl woanders dran.. Naja danke aber für deine Hilfe.


    Wie sieht denn deine Abfrage für den Login aus?

    Quellcode

    1. SELECT ... FROM ... WHERE username = $username AND password = md5($password)
  • Uff, ich poste das dann mal alles.
    Also:

    Das hier ist die index.php des admin bereiches:

    Quellcode

    1. /* Konfigurationsdateien laden */
    2. include('../inc/base.inc.php'); /* Layout Konfigurations Datei */
    3. include('../inc/adminfunctions.inc.php'); /*Admin Funktionen */
    4. include('../inc/login.inc.php'); /* login funktion */
    5. /* Überprüfen ob Login erfolgt ist, ggf. Anmeldemöglichkeit bieten */
    6. if(is_logged_in())
    7. {
    8. /* übergebene Variablen auslesen */
    9. $cmd = $_GET['cmd'];
    10. $id = $_GET['id'];
    11. /* Template einlesen */
    12. $template = get_file_as_string($base['adm_template']);
    13. /* Inhalt laden */
    14. switch(strtolower($cmd))
    15. {
    16. /* Content Laden */
    17. }
    18. /* Platzhalter ersetzen */
    19. $template = str_replace($base['tag_start'].'title'.$base['tag_end'],$base['adm_title'],$template);
    20. $template = str_replace($base['tag_start'].'shortnav'.$base['tag_end'],$base['adm_shortnav'],$template);
    21. $template = str_replace($base['tag_start'].'navigation'.$base['tag_end'],$base['adm_navigation'],$template);
    22. $template = str_replace($base['tag_start'].'content'.$base['tag_end'],$base['adm_content'],$template);
    23. $template = str_replace('$PHP_SELF',$PHP_SELF,$template);
    24. /* Template ausgeben */
    25. echo stripslashes($template);
    26. }
    Alles anzeigen


    login.inc.php sieht folgendermaßen aus:

    Quellcode

    1. <?php
    2. /* Session initialisieren */
    3. session_start();
    4. /* Überprüft, ob ein Login erfolgt ist */
    5. function is_logged_in()
    6. {
    7. global $base;
    8. /* User angemeldet? */
    9. if($_SESSION['authenticated'] == true)
    10. {
    11. return true;
    12. }
    13. /* Login ausgeben */
    14. else
    15. {
    16. $content = '<h4>Login</h4>';
    17. $content .= '<form action="login.php" method="post">';
    18. $content .= '<table border="0" cellpadding="2" cellspacing="0">';
    19. $content .= '<tr>';
    20. $content .= '<td>Benutzername:</td><td><input type="text" name="username" size="32" maxlength="64"></td>';
    21. $content .= '</tr><tr>';
    22. $content .= '<td>Passwort:</td><td><input type="password" name="password" size="32"></td>';
    23. $content .= '</tr><tr>';
    24. $content .= '<td></td><td><input type="submit" value="Login"></td>';
    25. $content .= '</tr>';
    26. $content .= '</table>';
    27. $content .= '</form>';
    28. $template = get_file_as_string($base['adm_template']);
    29. $template = str_replace($base['tag_start'].'title'.$base['tag_end'],$base['adm_title'],$template);
    30. $template = str_replace($base['tag_start'].'shortnav'.$base['tag_end'],'&nbsp;',$template);
    31. $template = str_replace($base['tag_start'].'navigation'.$base['tag_end'],'&nbsp;',$template);
    32. $template = str_replace($base['tag_start'].'content'.$base['tag_end'],$content,$template);
    33. $template = str_replace('$PHP_SELF',$PHP_SELF,$template);
    34. echo stripslashes($template);
    35. return false;
    36. }
    37. }
    38. ?>
    Alles anzeigen


    Und hier dann noch die login.php:

    Quellcode

    1. <?php
    2. /* Session initialisieren */
    3. session_start();
    4. /* übergebene Variablen auslesen */
    5. $username = $_POST['username'] ? $_POST['username'] : false;
    6. $password = $_POST['password'] ? $_POST['password'] : false;
    7. if($username && $password)
    8. {
    9. /* verschlüsseltes Passwort erzeugen */
    10. $encrypted = md5($username,$password);
    11. include('../inc/database.inc.php');
    12. $connection = mysql_connect($db['host'],$db['uid'],$db['pwd']);
    13. if($connection)
    14. {
    15. if(mysql_select_db($db['db']))
    16. {
    17. $sql = "SELECT id FROM user WHERE (username = '$username') AND (password = '$encrypted') AND (active = 'true')";
    18. $result = mysql_query($sql);
    19. if($result && (@mysql_num_rows($result) > 0))
    20. {
    21. $row = mysql_fetch_row($result);
    22. $_SESSION['authenticated'] = true;
    23. $_SESSION['user_id'] = $row[0];
    24. $_SESSION['username'] = $username;
    25. }
    26. else
    27. {
    28. $_SESSION['authenticated'] = false;
    29. }
    30. }
    31. }
    32. }
    33. /* Umleitung */
    34. header('Location: index.php');
    35. ?>
    Alles anzeigen


    Ich finde einfach nicht den Fehler, dass ich nicht in den Admin Bereich komme. Selbst wenn ich den md5 Hash Vergleich mit der Datenbank so ändere wie beschrieben lässt er mich immer noch nicht rein.
    Vielleicht siehst du ja den Fehler. Ich such schon den ganzen Tag. Ich denke ich brauch ne Pause. Naja danke schon mal für die Hilfe. Die Datei am Anfang wollte ich nutzen um ein md5 hash Passwort in die Datenbank zu schreiben, so als Anfang für einen registrations script.

    MfG Danielowski
  • Also auf den ersten Blick sehe ich, dass du Vince's Rat anscheinend noch nicht ganz befolgt hast.

    Quellcode

    1. /* verschlüsseltes Passwort erzeugen */
    2. $encrypted = md5($username,$password);

    sollte eigentlich so aussehen:

    Quellcode

    1. /* verschlüsseltes Passwort erzeugen */
    2. $encrypted = md5($password);
    .
    Hier wird jetzt nur noch das Passwort gehasht. Dann sollte deine SQL Abfrage auch funktionieren.
    Grundsätzlich wird bei Benutzern normalerweise nur das Passwort gehasht, da der Benutzername kein Geheimnis ist und sollte auch nicht als geheim angenommen werden.
    Open Source --> Programmieren aus Leidenschaft :!:

    Ich stehe weder für privaten Support per PM noch über einen IM zur Verfügung. Danke.
  • Deadman44 schrieb:

    Also auf den ersten Blick sehe ich, dass du Vince's Rat anscheinend noch nicht ganz befolgt hast.

    Quellcode

    1. /* verschlüsseltes Passwort erzeugen */
    2. $encrypted = md5($username,$password);

    sollte eigentlich so aussehen:

    Quellcode

    1. /* verschlüsseltes Passwort erzeugen */
    2. $encrypted = md5($password);
    .
    Hier wird jetzt nur noch das Passwort gehasht. Dann sollte deine SQL Abfrage auch funktionieren.
    Grundsätzlich wird bei Benutzern normalerweise nur das Passwort gehasht, da der Benutzername kein Geheimnis ist und sollte auch nicht als geheim angenommen werden.



    Ja das hab ich schon gemerkt. In dem Buch, mit dem ich mir PHP beigebracht habe, wurde gesagt das es halt sicherer wäre das Passwort zusammen mit dem usernamen zu verschlüsseln, um entschlüsseln so gut wie unmöglich wäre. Ist halt schon etwas älter das Buch. Aber mein Haupt Problem ist jetzt, das wenn ich einen User in der Datenbank mit verschlüsseltem Passwort eingebe, dass er mich trotzdem nicht in dem Admin bereich lässt. Er geht bei der Index Php nicht in den content sondern wieder zur Anmeldung.
  • Danielowski schrieb:

    das es halt sicherer wäre das Passwort zusammen mit dem usernamen zu verschlüsseln, um entschlüsseln so gut wie unmöglich wäre

    aber dann kannst du doch nicht einfach einen weiteren Parameter an eine Funktion hängen :rolleyes: um das zu realisieren, musst du deinen String konkatenieren.

    Quellcode

    1. $encrypted = md5($username.$password);



    Danielowski schrieb:

    Aber mein Haupt Problem ist jetzt, das wenn ich einen User in der Datenbank mit verschlüsseltem Passwort eingebe, dass er mich trotzdem nicht in dem Admin bereich lässt. Er geht bei der Index Php nicht in den content sondern wieder zur Anmeldung.


    Dann schau dir doch mal dein SQL an. Da ich davon ausgehe, dass du keinen Debugger nutzt, dann so:

    Quellcode

    1. $sql = "SELECT id FROM user WHERE (username = '$username') AND (password = '$encrypted') AND (active = 'true')";
    2. echo $sql;
    3. exit();
  • Hallo,

    Es gibt kleine Unterschiede was phpmyadmin und den SQL per PHP angeht.
    Ich erkläre es mal ein wenig genauer

    Quellcode

    1. $hashpw = md5('websiteusername','websitepassword');


    Klappt nicht. 2 Werte werden IMMER mit einem Punkt verbunden, nicht mit einem Komma.
    Deswegen, speicher dein Benutzername und dein Passwort was du per POST übergibst jeweils in Variablen

    Anschliessend nutzt du folgendes

    Quellcode

    1. $hashpw = md5($username.$password);


    Damit kannst du nun Arbeiten. Du musst bei der Abfrage in deiner login.php auch damit arbeiten
  • Ich würde jetzt auf den schnellen Blick vermuten, dass du für deine weiteren Schritte nicht die richtigen Daten bekommst.

    PHP-Quellcode

    1. $sql = 'SELECT id,username,password FROM user WHERE (username = "'.$username.'") AND (password = "'.$password.'") AND (active = "true")';

    Deine Ausgabe der Fehlermeldung wird unterdrückt, wegen dem @-Zeichen.
    Ich würde die Abfrage so aufbauen:

    PHP-Quellcode

    1. <?php
    2. /* Session initialisieren */
    3. session_start();
    4. /* übergebene Variablen auslesen und prüfen */
    5. (!empty($_POST['username'])) ? $username = $_POST['username'] : $username = false;
    6. (!empty($_POST['password'])) ? $password = md5($_POST['password']) : $password = false;
    7. if($username != false && $password != false)
    8. {
    9. include('../inc/database.inc.php');
    10. $connection = mysql_connect($db['host'],$db['uid'],$db['pwd']);
    11. if($connection)
    12. {
    13. if(mysql_select_db($db['db']))
    14. {
    15. $sql = 'SELECT id,username,password,active FROM user WHERE '.
    16. '(username = "'.mysql_real_escape_string($username).'") AND '.
    17. '(password = "'.mysql_real_escape_string($password).'") AND (active = "true")';
    18. $result = mysql_query($sql);
    19. if(mysql_num_rows($result) > 0)
    20. {
    21. $row = mysql_fetch_assoc($result);
    22. $_SESSION['authenticated'] = true;
    23. $_SESSION['user_id'] = $row['id'];
    24. $_SESSION['username'] = $row['username'];
    25. }
    26. else
    27. {
    28. $_SESSION['authenticated'] = false;
    29. }
    30. }
    31. }
    32. }
    33. /* Umleitung */
    34. header('Location: index.php');
    35. ?>
    Alles anzeigen
    Beste Grüße,
    M4rc3L-XCN