我有一个 mysql/php 哈希 (sha1) 登录问题



我有一个关于使用数据库中哈希密码登录的问题。我当前的脚本只是告诉我"密码错误"消息,即使它是正确的。

$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();
?>

最新更新