Problem mit $_GET und crypt



  • Hoi,

    ich bitte um eure Hilfe! Ich übergebe das Passwort und den Benutzernamen mit Crypt verschlüsselt an meine PHP Datei weiter.

    http://localhost/keller/create.php?user_pw=xyz&§)§)
    

    Nun will ich dieses mit meiner in der PHP-Datei als Variable gespeichertes Passwort vergleichen.

    $PassWD = "passwort";
    
    if(crypt($PassWD,$_GET["user_pw"]) == $_GET["user_pw"]) {
        ...
    }
    else {
        // Nur dies trifft zu
    }
    

    Allerdings ist es egal ob ich das Passwort richtig oder falsch eingebe, die Bedingung ist nicht wahr! Bitte um eure Hilfe 😕

    thx im Voraus



  • Dann benutzt du crypt() vermutlich falsch, oder deine Bedingung ist schlecht gestellt. Es ist aber eine verdammt schlechte Idee, Benutzernamen oder Passwörter per GET-Parameter zu übergeben, egal ob verschlüsselt oder nicht.



  • Abgesehen davon, dass man Passwörter nicht per GET übergeben sollte, Du benutzt crypt tatsächlich falsch.

    www.php.net schrieb:

    string crypt ( string str [, string salt] )

    crypt erwartet als ersten Parameter das Passwort, aber als zweiten Parameter nicht das Passwort, womit verglichen werden soll, sondern einen Salt-String, womit das Passwort verschlüsselt wird. Bei dem alten DES ist der Salt-String 2 Zeichen lang. Lies Dir mal den Link durch, ich denke da ist das ganz gut erklärt.

    Wichtig ist, dass Du das eingegebene Passwort mit dem gleichen Salt-String verschlüsselst, wie Du das Vergleichs-Passwort verschlüsselst, da ansonsten verschiedene (verschlüsselte) String von crypt zurückgeliefert werden.

    Dein Code müsste also ca. so aussehen:

    $salt = "AB"; // <-- Je nach Verschlüsselung evtl. auch mehr Zeichen
    $PassWD = "passwort";
    
    if (crypt($PassWD, $salt) == crypt($_GET["user_pw"], $salt)) {
        ...
    }
    else {
        // Nur dies trifft zu
    }
    

    Besser wäre noch, wenn Du das Passwort schon im Script speicherst, dass Du es dort dann auch nur verschlüsselt speicherst. Also einmal in der Console beispielsweise mit dem entsprechendem Salt verschlüsseln und dann nur die verschlüsselte Variante im Script speichern, dann müsste es natürlich so aussehen:

    $salt = "AB"; // <-- Je nach Verschlüsselung evtl. auch mehr Zeichen
    $cryptedPassWD = "ABoas98o2sl"; // <-- Jetzt nur verschlüsselt gespeichert
    
    if ($cryptedPassWD == crypt($_GET["user_pw"], $salt)) {
        ...
    }
    else {
        // Nur dies trifft zu
    }
    


  • Bisher hatt die Crypt funktion soweit einwandfrei funktioniert (mit meiner oben gezeigten Methode), also falsch benutze ich sie nicht. Ich hab das Gefühl irgendwie funktioniert die Kombination $_GET und Crypt nicht so richtig. Mit dem Vorgeschlagenen Code klappts auch nicht:

    if(crypt($PassWD, $salt) == crypt($_GET["user_pw"], $salt)) {
        ...
    }
    

    Habt Ihr vielleicht ne bessere Idee? 🙂



  • Ups, hab' beim Code nicht dran gedacht, dass Du das Passwort bereits verschlüsselt übergibst. Dann darfst Du es natürlich nicht nochmal verschlüsseln, um zu vergleichen. Demnach müsste der Code ungefähr so aussehen:

    $salt = "AB"; // <-- Je nach Verschlüsselung evtl. auch mehr Zeichen
    $PassWD = "passwort";
    
    if (crypt($PassWD, $salt) == $_GET["user_pw"]) {
        ...
    }
    else {
        // Nur dies trifft zu
    }
    

    Das verschlüsselte Passwort, welches Du übergibst muss dann natürlich mit dem Salt-String im Script übereinstimmen.

    Bzw., wenn Du z.B. mit DES-2-Zeichen arbeitest, dann kannst Du den Salt-String aus dem übergebenen Passwort extrahieren:

    $salt = substr($_GET["user_pw"], 0, 2);
    ...
    

    da die ersten beiden Zeichen den Salt-String darstellen bzw. bei DES mit 9-Zeichen Salt-String musst Du halt die ersten 9 Zeichen extrahieren usw.

    Folgender Code läuft bei mir einwandfrei:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="de">
    
    	<head>
    		<title>[ untitled ]</title>
    		<meta name="Content-Type" content="text/html; charset=iso-8859-1" />
    	</head>
    
    	<body>
    
    		<form method="get" action="<?=$_SERVER['PHP_SELF']?>">
    			<input type="text" name="password" /><br />
    			<input type="submit" name="submit" value="verify" />
    		</form>
    
    		<?
    		$salt = "AB";
    		$pw = "test";
    		echo('Password: ' . crypt($pw, $salt) . '<br />');
    		if (array_key_exists('submit', $_GET)) {
    
    			if (crypt($pw, $salt) == $_GET['password']) {
    				echo('Password verified');
    			}
    			else {
    				echo('Wrong password');
    			}
    
    		}
    
    		?>
    
    	</body>
    
    </html>
    


  • ich verstehs nicht, bei mir klappt das nicht!

    $salt = "awb";
    $PassWD = "test";
    
    <a href="<?php echo 'create.php?user_pw=' . crypt($_SESSION["PWD"], $salt); ?>">login</a>
    
    if(crypt($PassWD, $salt) == $_GET["user_pw"]) {
       ...
    }
    

    Die Bedingung ist immmer noch nicht wahr 😕

    Aber danke für die Mühe die du dir machst!! 🙂



  • hm, läuft mein Beispiel denn bei Dir?

    Dann würde ich nämlich erstmal versuchen das Passwort direkt anzugeben und nicht aus $_SESSION["PWD"] auszulesen. Halt erstmal statisch überprüfen, ob es grundsätzlich läuft. Danach dann Stück für Stück umbauen und schauen bei welcher Änderung es nicht mehr läuft. Evtl. steht aus irgendeinem Grund in $_SESSION["PWD"] nicht das drin, was Du denkst. 😃

    Ansonsten weiß ich leider auch nicht mehr weiter. 😞

    Wenn es nur ein kleiner Beispiel-Code ist, dann poste doch einfach mal alles, dann lasse ich es mal bei mir laufen. Evtl. ist es auch nur ein ganz kleiner Fehler, den man schnell übersieht.


Anmelden zum Antworten