PHP登录验证任何密码

时间:2014-03-01 18:42:15

标签: php authentication login

好的,所以我在index.php中有这个

 <form action="login.php" method="post">
<font >Username</font><br />
<input type="text" class="form-control" name="name" value="" style="width: 140px" />
<br />
<font >Password</font><br />
<input type="password" class="form-control" name="passwd" value="" style="width:140px"/>
<br /><br />
<input type="submit" value="Login" class="btn btn-primary"" style="width: 140px"/>         </form>

我遇到的问题是,当用户登录时,他们可以使用任何密码并继续使用usercp.php,所以它只检查用户名,我错过了哪个部分或者我做错了?对任何回复都表示赞赏。

其他信息:我的数据库已将密码保存在md5

然后这是我的login.php

*的 UPDAATE

我将代码更改为;

<?php
require("common.php");
$submitted_name = '';
if(!empty($_POST))
{
$query = "
    SELECT
        name,
        passwd
    FROM users
    WHERE
        name = :name
";

$query_params = array(
    ':name' => $_POST['name']
);
try
{
    $stmt = $db->prepare($query);
    $result = $stmt->execute($query_params);
}
catch(PDOException $ex)
{
    die("Failed to run query: " . $ex->getMessage());
}

$login_ok = false;

$row = $stmt->fetch();
if($row)
{
    $check_passwd = md5( $_POST['passwd']);

    if($check_passwd === md5($row['passwd']))
    {
        $login_ok = true;
    }
}    if($login_ok)
{
    unset($row['passwd']);            
    $_SESSION['user'] = $row;
    header("Location: usercp.php");
    die("Redirecting to: usercp.php");
}
else
{
    print("Login Failed.");
    $submitted_name = htmlentities($_POST['name'], ENT_QUOTES, 'UTF-8');
}
}
?>

通过更改

if($check_passwd = md5($row['passwd']))

到这个

if($check_passwd === md5($row['passwd']))

我无法使用正确或错误的密码登录,我也尝试使用x2 =

所有帮助都非常感谢,谢谢!

4 个答案:

答案 0 :(得分:1)

问题是一个简单的语法错误:

if($check_passwd = md5($row['passwd']))

应该是

if($check_passwd === md5($row['passwd']))

但是,正如我在上面的评论中提到的,md5不适合散列密码。

修改

这只是在黑暗中拍摄,但我相信这是你需要做的才能让它与md5一起工作:

if($row)
{
    $check_passwd = md5( $_POST['passwd']);
    for($round = 0; $round < 65536; $round++)
    {
        // I took out $row['passwd'] from the following line because it makes no sense
        $check_passwd = md5( $check_passwd); // <-- This is probably what you want
    }

    if($check_passwd === md5($row['passwd']))
    {
        $login_ok = true;
    }
}

如果您反而注意我的警告并使用password_hash(),这就是您可以做的事情(注意,如果你有PHP&lt; 5.5,那么前一个链接中的github兼容函数是向前兼容的) :

首先,将新字段添加到数据库store the bcrypt hash并调整程序中的所有逻辑以使用它而不是md5:

if($row) {
    $login_ok = password_verify($_POST['passwd'], $row['bcrypt_passwd'])
}

然后,只需向所有用户发送电子邮件,告知您已更新了脚本,并且要求所有人重置密码并提供密码重置链接的链接(您确实有一个,对吧?)。

要计算密码的哈希值,您需要做的就是:

$hash = password_hash($_POST['passwd']);

此哈希是您存储在数据库中的内容。

答案 1 :(得分:1)

你说你的数据库有哈希密码,但那你为什么要再次使用MD5?

    if($check_passwd === md5($row['passwd'])) //This is wrong
    {
       $login_ok = true;
    }

    if($check_passwd === $row['passwd']) //This should do the trick
    {
       $login_ok = true;
    }

答案 2 :(得分:0)

  

SELECT name,passwd,FROM users WHERE name =:name

不要在passwd param之后使用','。

答案 3 :(得分:0)

试试这个

if($row)
    {
        $check_passwd = md5( $_POST['passwd']);
        /*for($round = 0; $round < 65536; $round++)
        {
            $check_passwd = md5( $check_passwd . $row['passwd']);
        }*/

        if($check_passwd == $row['passwd'])
        {
            $login_ok = true;
        }
    }

我真的没有看到for循环的含义(如果你运行一次或10次或65536,则更改),它只会使页面加载速度变慢。此$check_passwd = md5( $_POST['passwd'] . $row['passwd']);以上的内容永远不会等于md5($row['passwd'])。请将您的密码保存为数据库表中的哈希值,因为它根本不是保存密码的标准程序。