PHP-将哈希和数据库进行比较不起作用


PHP - Comparing hash with database is not working

备注:

  • 我还是php的新手
  • 如果我不修改密码,这个登录表单似乎可以很好地工作
  • 我试过md5、sha256,现在我把它留在了sha1。这些都不起作用
  • 我首先使用echo sha1("password");来查找密码的哈希值,然后复制该哈希值并使用phpMyAdmin手动粘贴。我不确定这是不是问题所在

无论如何,这里是代码:

<?php
session_start();
require("config.php");
if(isset($_POST['submit'])) {
    $username = mysql_real_escape_string($_POST['username']);
    $password = sha1(mysql_real_escape_string($_POST['password']));
    $loginsql = "SELECT * FROM login WHERE username = '" . $username .
    "' AND password = '" . $password . "'";
    $loginresult = mysql_query($loginsql);
    $loginnumrows = mysql_num_rows($loginresult);
    if($loginnumrows == 1) {
        $loginrow = mysql_fetch_assoc($loginresult);
        session_register("USERNAME");
        session_register("USERID");
        $_SESSION['USERNAME'] = $loginrow['username'];
        $_SESSION['USERID'] = $loginrow['id'];
        header("Location: " . $config_basedir . "controlpanel.php");
    }
    else{
        echo "<p>Incorrect Login, please try again!</p>";
    }
}
else{
}
?>

我真的不太确定该怎么办。我确信我的代码可能更高效,但正如我在笔记中提到的,当我不散列密码时,它确实有效。感谢您的阅读。

如果您的密码包含任何'或其他可转义字符,则此操作将不起作用。

$password = sha1(mysql_real_escape_string($_POST['password']));

你应该先散列,然后转义:

$password = mysql_real_escape_string(sha1($_POST['password']));

由于SHA1只包含[a-f0-9],您也可以跳过escpaing

$password = sha1($_POST['password']);

如果它在你不散列密码时有效,听起来你的密码是以明文形式存储在数据库中的——我会在那里检查。

可能发生的另一件事是,应该在sha1的另一端使用mysql_real_eescape字符串,这样它就不会干扰确切的输入。

所以应该是:mysql_real_escape_string(sha1($_POST['password']));这可能会改变一些事情。

注意:虽然sha1目前没有任何已知的安全问题,所以它应该在没有mysql转义的情况下直接放入数据库是安全的,但有人曾经告诉我,要始终确保进入数据库的所有内容都应该进行强制转换或转义,以防在sha1或md5等中发现安全漏洞。

您在数据库中的密码似乎没有哈希,您需要更改密码和注册表单,以便所有密码都使用相同的哈希方法。

您可以使用MySQLs SHA1()函数更改数据库中的所有密码。

转义的密码与输入的密码不是同一个散列。has将不包含任何特殊字符。

abc'sha1!=转义abc'''sha1