【问题标题】:PHP - Comparing hash with database is not workingPHP - 将哈希与数据库进行比较不起作用
【发布时间】:2012-03-06 06:55:44
【问题描述】:

注意事项:

  • 我还是个 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 如何在您的数据库中设置?
  • 在数据发送到数据库之前,您不应该使用mysql_real_escape_string。具体来说,sha1(mysql_real_escape_string($_POST['password'])); 应该是 mysql_real_escape_string(sha1($_POST['password']));。我们也看不到 存储的 密码是如何散列的,所以我们无法真正帮助您。尝试选择记录并var_dump输入您的密码。将此与发布到服务器的值进行比较。这些是您应该学习遵循的基本调试步骤。
  • 你试过$password = sha1($_POST['password']); 吗?这里不需要 mysql_real_escape_string。
  • 当您首先创建哈希(插入数据库)时,您是否还通过mysql_real_escape_string 运行文本?如果不是,并且您的密码包含特殊字符,它可能会被mysql_real_escape_string 破坏。两次都需要以同样的方式进行。
  • 比较哈希的方式与最初插入数据库的方式完全相同。

标签: php database hash login passwords


【解决方案1】:

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

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

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

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

由于 SHA1 仅包含 [a-f0-9],您也可以跳过转义

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

【讨论】:

  • 我同意这是最好的答案。我注意到他在逃跑后正在胡言乱语。
  • 我忘记提及了,但我已经尝试过了,它并没有解决我的问题。不过还是谢谢。
【解决方案2】:

如果它在您不对密码进行哈希处理时有效,那么听起来您的密码以明文形式存储在数据库中 - 这就是我要检查的地方。

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

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

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

【讨论】:

  • 我认为这可能是问题所在,但我不知道如何改变它。
  • 我相信他们的意思是当他们不在两个地方散列密码时它就可以工作。 (表示db中的明文和明文查找)
  • 对不起,我错过了您复制了一个 sha1 并将其放入数据库中。我会在通过 sha1 之后尝试echo $password;,然后获取结果并将其插入数据库中,看看它是否有效。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    转义密码与输入密码的哈希值不同。 has 不会包含任何特殊字符。

    abc' sha1 != 转义 abc\' sha1

    【讨论】:

      猜你喜欢
      • 2013-12-21
      • 2012-08-14
      • 2012-10-25
      • 2019-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-05
      相关资源
      最近更新 更多