2011-01-12 18 views
1

In Ordnung, ich versuche, eine Login-Seite zu machen. Es scheint, dass alle Seiten ziemlich gut funktionierten - bis ich Salze hinzufügte. Ich verstehe sie nicht wirklich, aber etwas so Grundlegendes wie ich sollte nicht zu schwer sein, um herauszufinden. Hier ist „loginusr.php“:Brauchen Sie Hilfe, Login-Seite mit Salzen

<html> 
<body> 
<?php 

//form action = index.php 

session_start(); 

include("mainmenu.php"); 

$usrname = mysql_real_escape_string($_POST['usrname']);  
$pass  = $_POST['password']; 
$salt  = $pass; 
$password = sha1($salt.$pass); 

$con = mysql_connect("localhost", "root", "[email protected]"); 
if(!$con) 
{ 
    die("Unable to establish connection with host. We apologize for any inconvienience."); 
} 

mysql_select_db("users", $con) or die("Can't connect to database."); 

$select = "SELECT * FROM data WHERE usrname='$usrname' and password='$password'"; 
$query = mysql_query($select); 
$verify = mysql_num_rows($query); 

if($verify==1) 
{ 
    $_SESSION["valid_user"] = $usrname; 
    header("location:index.php"); 
}  
else 
{ 
    echo "Wrong username or password. Please check that CAPS LOCK is off."; 
    echo "<br/>"; 
    echo "<a href=\"index.php\">Back to login</a>"; 
} 

mysql_close($con);  
?> 
</body> 
</html> 

verwendete ich den Befehl echo $password; mir zu zeigen, wenn das Passwort in der Datenbank mit dem Skript angepasst. Sie taten. Was mache ich falsch?

+0

Oh, ich sehe, du erinnerst dich daran, mysql_real_escape_string zu verwenden. :) –

+0

Ken - Sie müssen auch mysql_real_escape_string auf das Passwort verwenden. :-) –

+0

ja. Die Leute ritten mich ständig an, als ich anfing. –

Antwort

1

Es scheint, als hätten Sie Salze falsch verstanden, da Sie $salt als Passwort festlegen.

Ein Salz sollte eine völlig zufällige Zeichenfolge sein, die zusammen mit dem Kennwort-Hash in einem Benutzerdatensatz gespeichert wird. Ein neues eindeutiges Salz sollte für jeden Benutzer erzeugt werden. Sie müssen also Ihrer Datenbank eine neue Spalte namens "password_salt" oder ähnliches hinzufügen.

Anstatt zu versuchen, das Kennwort in der SELECT Abfrage zu verwenden und sehen Sie, wenn Sie alle Datensätze erhalten, müssen Sie eigentlich nur SELECT mit dem Benutzernamen/user_id, um das Passwort-Hash und Salz zu erhalten, so dass Sie dann diejenigen verwenden können um festzustellen, ob der Benutzer das richtige Passwort eingegeben hat.

Wenn Sie neue Benutzer anmelden Sie die Felder mit Werten wie folgt hinzufügen sollte,

<?php 
// This is registeruser.php 

$salt = substr(sha1(uniqid(rand(), true)), 0, 20); 
$pass = $_POST['password']; 
$pass_to_store = hash("sha256", $salt.$pass); 

// Then issue a DB query to store the $salt and $pass_to_store in the user record. 
// Do not store $pass, you don't need it. 
// e.g. INSERT INTO users ('username', 'password_salt', 'password_hash') VALUES (:username, :salt, :pass_to_store); 
?> 

Dann das Passwort zu überprüfen, ist das gleiche, wenn Sie sich anmelden, können Sie etwas tun,

<?php 
// This is loginuser.php 

$user = // result from SQL query to retrieve user record 
// e.g. SELECT password_hash, password_salt FROM users WHERE username='from_user' 

$salt_from_db = $user['password_salt']; 
$pass_from_db = $user['password_hash']; 
if ($pass_from_db == hash("sha256", $salt_from_db.$_POST['password']) 
{ 
    // Password matches! 
} 
?> 

Vergessen Sie nicht, Benutzereingaben und alles, was Sie in Ihre Datenbank eingeben, zu bereinigen. Vielleicht möchten Sie prüfen, ob Sie vorbereitete Anweisungen verwenden, anstatt sich ständig daran zu erinnern, mysql_real_escape_string zu verwenden.

+0

krank versuchen Sie es auf Ihre Art und Weise. Sitz fest. –

+0

Achten Sie darauf, mein Update zu sehen, ich habe die Überprüfung in der letzten Bit des Codes falsch herum, doh! Offensichtlich hatte ich heute nicht genug Koffein. –

+0

oh ... ich bekomme es, das macht das Salz einzigartig für jeden Datensatz, so dass es sicherer! –

0

Sieht aus, als würden Sie mit dem gleichen Passwort salzen? Normalerweise ist ein Salt ein zufälliger Schlüssel, der für Ihre Site spezifisch ist und der Passworteingabe vorangestellt wird, was so aussieht, als würden Sie gut damit umgehen. Stellen Sie nur sicher, dass Sie dasselbe Salz verwenden, um zu überprüfen, ob Sie es verwenden, wenn das Passwort erstellt wird.

, auch Sitzungen richtig nutzen müssen Sie session_start haben, bevor irgendetwas Ausgabe an der Seite lautet:

<?php 

session_start(); 

?> 
<html> 
<body> 
... 
0

Ein Salz ist ein Zufallswert einen Angreifer nur aufzublicken die Quelle eines Hash zu verhindern Tabelle basierend auf gemeinsamen Passwörtern generiert. (Die Verwendung des Benutzernamens als Salz ist offensichtlich keine gute Idee, da es nur sehr wenig Entropie hinzufügt).

Sie müssen also das Salz in der Datenbank speichern und aus der Datenbank lesen, um den gesalzenen Passwort-Hash zum Vergleich mit dem gespeicherten Wert zu berechnen.

Sie haben den Benutzernamen ein paar Mal falsch geschrieben, ist er auch in der Datenbank falsch geschrieben?

+0

Ja, es ist so geschrieben in der Datenbank. –

+0

aber wenn das Passwort mit dem Passwort in der db übereinstimmt, sollte die Rückgabe nicht als 1 verifiziert werden? –