【问题标题】:Trying to retrieve password from database试图从数据库中检索密码
【发布时间】:2015-01-28 04:45:42
【问题描述】:

我的登录脚本存在问题,它无法从我提供的 sql 语句中成功提取密码数据。

要求用户输入他们的电子邮件和密码,

<p><strong>Email: </strong><input type= "text" name= "email"></p>
<p><strong>Password: </strong><input type= "password" name= "password"></p>

通过 POST,我将他们从表单中输入的内容放入 sql 语句中。

$taremail = filter_input(INPUT_POST, 'email');
$tarpasswd = filter_input(INPUT_POST, 'password');

$sql = "SELECT email, password FROM members WHERE email = '".$taremail."'
        AND password = PASSWORD('".$tarpasswd."')";

最后,我检查数据库,看看他们输入的电子邮件和密码是否真的在数据库中。

$result = mysqli_query($con, $sql) or die(mysqli_error($con));

if(mysqli_num_rows($result) == 1){

    setcookie("auth", "1", time()+60*30, "/", "", 0); //create cookie for the logged in user    

    $display = "<h2>You have successfully logged in!</h2>
                <p>Click the link below to go to our main page</p>
                <a href=\"main.php\">Main Page</a></br>
                <a href=\"../login.html\">Log out</a>";
} else {
    $display = "<h2>This account is not registered!</br>
                Please make sure to register before trying to log in.</h2>
                <a href=\"../register.html\">Register here!</a>
                <a href=\"../login.html\">Login page</a>";
}

这要么返回给定的电子邮件和密码确实在数据库中,要么不在。够简单吧?

我的问题是它总是执行我的else{}语句,说我没有注册。

我应该注意,在我的注册页面中,他们提供的密码是通过PASSWORD() 方法输入的,所以它变成了数据库上的散列varchar...例如。 letmein = *D37C49F9CBEFBF8B6F4

【问题讨论】:

  • 先把== 1改成&gt; 0
  • 不,我不认为它是加密的,而是散列的,因此无法解密。
  • 您能否验证该电子邮件的记录是否存在?
  • 使用 phpmyadmin?我现在打开表格,里面有 3 个不同的值。当我注册用户时,它也会更新到数据库中。 @kdogisthebest
  • 在你的 PHP 代码 echo $sql 中确定。然后在 phpMyAdmin 中运行它,看看它说了什么。

标签: php mysql


【解决方案1】:

所以我在为此设置的东西上运行测试,我想我发现了问题。这很令人沮丧。

http://dev.mysql.com/doc/refman/5.0/en/password-hashing.html

来自 PASSWORD() 函数的文档:

“为了容纳更长的密码哈希,用户表中的密码列此时已更改为 41 字节,即其​​当前长度。”

我的用户列中的密码字段仅存储 25 个字节,因此我的假密码“asdfasdf”的 PASSWORD() 产生“*1B1A59A0792309FDE6F1A8681D2B58C4F2639156”,但由于缺少存储空间。

我相信你可以猜到比较这两者的结果。

这可能不是你的问题,但它可以在未来帮助其他一些贫穷、破碎的人。

【讨论】:

  • hmmm...所以我假设 varchar(20) 太小了,如果我要散列它?
  • 是的,这将是一个问题,幸运的是编辑最大 varchar 长度并不难。只需将其增加到 50 左右即可。唯一的问题是您当前存储的所有密码本质上都是垃圾密码,必须加以修复,因为它们会被截断,并且永远无法与 PASSWORD() 函数的输出正确比较。
  • 这是否解决了您的问题?
  • 绝对。我将密码列的结构从 varchar(20) -> (50) 更改。创建新用户,登录成功!
【解决方案2】:

试试这个:

如果是PASSWORD php 函数,则在查询中调用该函数。

$sql = "SELECT email, password FROM members WHERE email = '".$taremail."'
        AND password = PASSWORD('$tarpasswd')";

【讨论】:

  • 致命错误:调用未定义函数 PASSWORD() 是我尝试在查询中使用它时得到的结果
  • 签入你的注册页面代码..在哪里调用这个函数并将密码加密到hase??
  • mysqli_query($con,"INSERT INTO members (firstname, lastname, email, password) VALUES ('$fname', '$lname', '$email', PASSWORD('$passwd'))"); 在我的注册码中是这样称呼的。
  • ohk..PASSWORD 是我的 sql 函数,它将在查询中工作!!..检查编辑的答案..??这有帮助吗??
  • 不幸的是,没有。它仍然只返回密码......而不是散列版本。 SELECT email, password FROM members WHERE email = 'test@gmail.com' AND password = PASSWORD('letmein')这是我echo $sql时的输出
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-21
  • 2015-12-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多