【问题标题】:How do I check the password?如何检查密码?
【发布时间】:2016-03-14 19:17:10
【问题描述】:

最近在我的登录处理程序中发现了一个问题。问题是,即使输入的密码正确并且与数据库中的密码匹配,脚本仍然会将我发送到错误页面。

session_start();
include ("db.php");

 if (isset($_POST['login'])) {                                     
        $login = $_POST['login']; 
        $login = stripslashes($login);
        $login = htmlspecialchars($login);
        $login = trim($login);
        if ($login == '') {
            unset($login);
            } 
            } 

        if (isset($_POST['password'])) {
        $password=$_POST['password']; 
        $password = stripslashes($password);
        $password = htmlspecialchars($password);
        $password = trim($password);
        $password = hash("md5",$password); 
        if ($password =='') {
            unset($password);
            }
            }


if (empty($login) or empty($password)) 
    {
    exit (header('location:index.php'));
    }

$result = mysql_query("SELECT * FROM users_data WHERE login='$login'");

    $row = mysql_fetch_array($result);

    if (empty($row['password']))
    {
    exit (header('location:mistake.php'));
    }
    else {

    if ($row['password']==$password) {

    $_SESSION['login']=$row['login']; 
    $_SESSION['users_id']=$row['users_id'];
    header('location:first.php');

    }
    else {

        header('location:mistake.php');



    }
    }

HTML 表单:

<form action="login.php" method="post" class="login">



<label><span>Login:</span>
<input name="login" type="text" size="20" maxlength="100">
</label>




<label><span>Password:</span>
<input name="password" type="password" size="20" maxlength="100">
</label>



<p>
<input type="submit" name="submit" class ="submit" value="Login">
</p>

UPD:感谢您的回答,我终于找到了问题所在 - 我只是在数据库中指定的密码值长度不足。

【问题讨论】:

  • 密码是什么,您在数据库中为您正在尝试的用户存储了什么?
  • echo $row['password'] 和 echo $password 并在这里发帖
  • 也使用mysqli 代替mysql。不推荐使用 Mysql。
  • stop using mysql_* functionsThese extensions 已在 PHP 7 中删除。了解PDOMySQLiprepared 语句并考虑使用 PDO,it's really pretty easy
  • 这里有太多的条件语句可能会在某个地方搞砸。如果我是你,我不会再在这上面浪费时间,而是使用已经证明有效并且值得本世纪使用的东西。 stackoverflow.com/a/34158109

标签: php forms login passwords


【解决方案1】:

首先,你为什么要将密码存储在数据库中而不对其进行哈希处理(例如 md5)。

如果您这样做,则无需处理密码,您只需将存储的md5(password) 与用户发布的密码的 md5 哈希值进行比较即可。

另外,由于编码,您很可能被重定向到mistake.php 页面而不是success.php 页面。

如果您向我们提供您用于测试代码的密码(假设您正在测试它。;))会有所帮助。

干杯!

编辑:请查看@jayblancard 在下面的 cmets 中建议的更好的加密技术。

【讨论】:

  • 你真的不应该使用MD5 password hashes
  • 感谢@JayBlanchard,这是一篇有见地的阅读,但我建议使用 md5 纯粹是为了简单和更好地理解“提问者”。
  • 虽然这可能很简单,但在当今时代是错误的。我们应该鼓励良好的编码习惯和良好的安全管理。如果我们不这样做,我们就没有做好我们的工作。
  • @Aman 关于密码。现在它的值只是“测试”,在数据库中它存储为“098f6bcd4621d373cade4e832627b4”。
  • 通过 md5 here 传递 test 得到哈希值为“098f6bcd4621d373cade4e832627b4f6”,比您提供的值多 2 个字符。
【解决方案2】:

尝试使用 isset() 而不是 empty

if (isset($row['password']))

【讨论】:

  • 为什么 OP 应该“试试这个”? 好的答案将始终解释所做的事情以及这样做的原因,不仅适用于 OP,也适用于 SO 的未来访问者。
【解决方案3】:
  1. 我只是建议你尝试调试你的代码,错误 DOT php 在多个地方被调用,所以使用die("die message") 来查看哪个被触发了。

  2. 由于您没有对代码进行测试,因此可以调试有效和无效输入的输出并检查输出。

  3. 一旦您对输入和输出感到满意,请检查条件是否符合预期,就像之前使用 die 条件一样。

注意:你的代码很乱,看这个要靠basics

也看OO programming

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-08
    • 2013-05-18
    • 2018-05-19
    • 1970-01-01
    • 2018-03-19
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多