我有一个关于使用数据库中哈希密码登录的问题。我当前的脚本只是告诉我"密码错误"消息,即使它是正确的。
$s = $mysqli->query("SELECT * FROM `users` WHERE email`='".$_POST['email']."'") or die();
$i = $s->fetch_assoc();
if($_POST['password'] == sha1($i['password'])) {
echo "works";
} else {
echo "bad password";
}
你做错了。我希望数据库密码已经散列,但用户输入纯文本密码,因此您需要对用户输入的内容进行哈希处理,看看它是否与您在数据库上的哈希值匹配
$s = $mysqli->query("SELECT * FROM `users` WHERE `email`='{$_POST['email']}'") or die();
$i = $s->fetch_assoc();
if(sha1($_POST['password']) == $i['password']) {
echo "works";
} else {
echo "bad password";
}
然而
请不要滚动自己的密码哈希。PHP 提供
password_hash()
password_verify()
请使用它们,我可能有一天想使用您的网站 这里有一些关于密码的好主意 如果您使用的是 5.5 之前的 PHP 版本,则此处提供了兼容包
也
您的脚本面临 SQL 注入攻击的风险 看看小鲍比桌子发生了什么 如果你正在逃避输入,那就不安全了! 使用预准备语句和参数化语句
下面是如何使用 mysql 安全地验证 sha 的示例。
<?php
// Basic php MYSQL authentication with crypted password
$username = $_POST['username'];
$password = $_POST['password'];
$salt = "CrazyassLongSALTThatMakesYourUsersPasswordVeryLong123!!312567__asdSdas";
$password = hash('sha256', $salt.$password);
//echo $password;
// Mysql connection
$mysqli = new mysqli("localhost","mysqluser","mysqlpassword","mysqldatabase");
$stmt = $mysqli->prepare('SELECT userid FROM Users WHERE password = ? AND username = ?');
// (ss -> string, string) Always bind parameters and use prepared statement to improve security
$stmt->bind_param("ss", $password, $username);
$stmt->execute();
$stmt->bind_result($userid );
if (!empty($stmt->fetch())) {
// if fetch is not empty we have results and password hash was correct
echo "User was found";
} else
echo "User was not found";
$mysqli->close();
?>