gpt4 book ai didi

php - 需要帮助用盐制作登录页面

转载 作者:行者123 更新时间:2023-11-29 00:58:56 26 4
gpt4 key购买 nike

好的,我正在尝试创建一个登录页面。似乎所有的页面都工作得很好——直到我加了盐。我不太了解它们,但是像我这样做一些基本的事情应该不难理解。这是“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; 来显示数据库中的密码是否与脚本匹配。他们做到了。我做错了什么?

最佳答案

看来您误解了盐,因为您将 $salt 设置为密码。

盐应该是一个完全随机的字符串,与密码哈希一起存储在用户记录中。应该为每个用户生成一个新的唯一盐。因此,您需要向数据库中添加一个名为“password_salt”或类似名称的新列。

与其尝试在 SELECT 查询中使用密码并查看是否获得任何记录,您实际上只需要使用用户名/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

关于php - 需要帮助用盐制作登录页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4674734/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com