好吧,我正在尝试创建一个登录页面。似乎所有的页面都很好用 - 直到我加入盐。我并不是真的了解它们,但做一些像我一样基本的事情应该不难理解。这是“loginusr.php”:
<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", "g00dfor@boy");
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>
我使用命令echo $password;
向我显示数据库中的密码是否与脚本匹配。他们做到了。我做错了什么?
答案 0 :(得分:1)
您似乎误解了盐,因为您将$salt
设置为密码。
salt应该是一个完全随机的字符串,它与密码哈希一起存储在用户记录中。应为每个用户生成一个新的独特盐。因此,您需要向数据库添加一个名为“password_salt”或类似名称的新列。
不是试图在SELECT
查询中使用密码并查看是否有任何记录,而是实际上需要使用username / user_id SELECT
来获取密码哈希和盐这样您就可以使用它们来确定用户是否输入了正确的密码。
当您注册新用户时,您应该添加具有此类值的字段
<?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);
?>
然后在登录时检查密码是否相同,你可以这样做,
<?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!
}
?>
不要忘记清理用户输入和您放入数据库的任何内容。您可能希望查看使用预准备语句,而不必记住始终使用mysql_real_escape_string
。
答案 1 :(得分:0)
看起来你用相同的密码腌制?通常情况下,盐将是一个随机密钥,特定于您的网站,您可以将其添加到密码输入中,看起来您做得很好。只需确保使用相同的盐来检查密码创建时的使用情况。
此外,要正确使用会话,您需要在将任何内容输出到页面之前使用session_start:
<?php
session_start();
?>
<html>
<body>
...
答案 2 :(得分:0)
salt是一个随机值,用于防止攻击者仅查找基于公共密码生成的表中的哈希源。 (使用用户名作为盐显然不是一个好主意,因为它只增加了很少的熵)。
因此,您需要将salt存储在数据库中并从数据库中读取它,以便计算盐渍密码哈希值,以便与存储值进行比较。
你拼错了几次用户名,是不是也拼错了数据库?