PHP - 比较哈希与数据库不起作用

时间:2012-02-14 22:00:17

标签: php database hash login passwords

注意:

  • 我还是相当新的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{

}
?>

我真的不太确定该怎么做。我确信我的代码可以更高效,但正如我在笔记中提到的,当我不对密码进行散列时,它确实有效。谢谢你的阅读。

4 个答案:

答案 0 :(得分:4)

如果您的密码包含任何'或其他可转义字符,则无效。

$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']);

答案 1 :(得分:1)

如果你没有散列密码就行了,听起来你的密码就像明文一样存储在数据库中 - 这就是我要检查的地方。

可能发生的另一件事是mysql_real_escape字符串应该在sha1的另一侧使用,因此它不会干扰确切的输入。

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

注意:虽然sha1目前没有任何已知的安全问题,所以 可以安全地直接放入数据库而不需要mysql转义,有人曾告诉我要始终确保一切顺利如果在sha1或md5等内容中发现安全漏洞,则应投射或转发到数据库中。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

转义的密码与输入的密码不同。该版本不包含任何特殊字符。

abc'sha1!=转义abc \'sha1