Php登录问题(用户无法登录,用户可以使用其他密码访问自己的帐户)

Posted

技术标签:

【中文标题】Php登录问题(用户无法登录,用户可以使用其他密码访问自己的帐户)【英文标题】:Php Login Issue (Users cannot login and users can use others passwords to access their own accounts) 【发布时间】:2010-12-20 21:47:23 【问题描述】:

好的,这是我的问题,有些用户无法登录他们的帐户。他们正确输入了密码和用户名,但它似乎不起作用。

其次,我注意到一些用户可以使用自己的密码而不是原始帐户的密码登录他们想要的任何帐户。

使用 mysqlphp5。

/*Login script*/

if (isset($_POST['Submit'])) 

    $loginUserName = ($_POST['loginUserName']);
    $loginUserName = stripslashes($loginUserName);
    $loginUserName = strip_tags($loginUserName);
    $loginPassWord = ($_POST['loginPassWord']);
    $loginPassWord = stripslashes($loginPassWord);
    $loginPassWord = strip_tags($loginPassWord);
    $loginPassWord = md5($loginPassWord);

    $loginSubmitQuery = "SELECT username,password FROM users WHERE username = '". mysql_real_escape_string($loginUserName ."' and password = '". mysql_real_escape_string($loginPassWord) ."'"; 
    $loginResultQuery = mysql_query($loginSubmitQuery) or die ("Could not find loginUserName and/or loginPassWord");
    $loginResultQuery2 = mysql_fetch_array($loginResultQuery);

     if ($loginResultQuery2) 
        $sql = "SELECT * FROM users WHERE username='".$loginUserName."'";   
        $result = mysql_query($sql)or die('_'.mysql_error());
        while ($row = mysql_fetch_assoc($result)) 
            $_SESSION['player']['id']               = $row['id'];
            $_SESSION['player']['username']         = $row['username'];
            $_SESSION['player']['gamestatus']       = $row['gamestatus'];
            $_SESSION['player']['healthpoints']     = $row['healthpoints'];
            $_SESSION['player']['maxhealthpoints']  = $row['maxhealthpoints'];
            $_SESSION['player']['manapoints']       = $row['manapoints'];
            $_SESSION['player']['maxmanapoints']    = $row['maxmanapoints'];
            $_SESSION['player']['level']            = $row['characterlevel'];
            $_SESSION['player']['strength']         = $row['strength'];
            $_SESSION['player']['defence']          = $row['defence'];
            $_SESSION['player']['monsterid']        = $row['monsterid'];
            $_SESSION['player']['decivers']         = $row['decivers'];
            $_SESSION['player']['experience']       = $row['experience'];
            $_SESSION['player']['nextlevel']        = $row['nextlevel'];
            $_SESSION['player']['inbattle']         = $row['inbattle'];
            $_SESSION['player']['monsterlevel']     = $row['monsterlevel'];
            $_SESSION['player']['monsterid']        = $row['monsterid'];

        

        echo '<div id="loginaccess"><a href="home.php">[Success Click Here to Login]</a></div>';

     else 

        echo '<div id="loginaccess">Invalid username or password.</div>';

    

                ?>
            <form id="login" action="" method="POST">
                    <div id="uname" class="formfloat"><p><label for="loginUserName">Username:</label>
                    <input type="text" id="loginUserName" name="loginUserName" value="" class="formfield" tabindex="1" size="15" maxlength="20" /></div></p>
                    <div id="pword" class="formfloat"><p><label for="loginPassWord">Password: </label>
                    <input type="password" id="loginPassWord" name="loginPassWord" value="" class="formfield" tabindex="2" size="15" maxlength="20" /></div></p>
                    <div class="formbreak"></div><br />
                    <input id="loginsubmit" type="submit" value="Login" name="Submit" tabindex="3" >
            </form>
            </div>
        </div>
        <div id="sidebarRight"><!-- sidebarRight div start -->
        </div>

【问题讨论】:

除了答案之外,$loginSubmitQuery 中不需要SELECT password,在WHERE 子句中就足够了。 SELECT username,password... 不会伤害任何东西,除了性能(一点点);但是从数据库中获取两个值并丢弃一个而不使用它有点浪费。 感谢您的回复我现在明白了。 【参考方案1】:

验证密码时,您的 SQL 查询似乎缺少一个子句。如果给定的用户名存在于数据库中,WHERE username = '$loginUserName' AND '$loginPassWord' 将评估为 true,并且 $loginPassWord 的值评估为 true(因为您没有将其与任何东西进行比较)。

此外,您应该在数据库查询中使用之前从用户那里获得的输入转义,使用类似mysql_real_escape_string 的东西,以防止SQL Injection 攻击。

综上所述,我会将您的查询替换为:

$loginSubmitQuery = "SELECT username, password
  FROM users
  WHERE username = '" . mysql_real_escape_string($loginUserName) . "'
    AND password = '" . mysql_real_escape_string($loginPassWord) . "'"; 

【讨论】:

我曾经被告知不要使用 mysql_real_escape_string() 由于一些安全漏洞。不太清楚为什么。但谢谢。同样当我使用 stripslashes() 和 strip_tags() 时,它真的能帮到我吗? 是的,您应该使用mysql_real_escape_string()strip_tags() 只是删除了 html 和 PHP 标记,因此不会做任何事情来防止注入。而stripslashes() 的作用与您可能认为的相反,因为它将\' 变成'【参考方案2】:

另外值得注意的是,您不应将用户的密码(明文)存储在数据库中。 它非常不安全,并且会以不良方式暴露您的用户。

引用编码恐怖文章You're Probably Storing Passwords Incorrectly:

用户收集用户名和密码 就像他们做口袋妖怪一样。这是一个遗憾 事态,但为了更好或 更糟糕的是,事情就是这样。我们作为 软件开发人员,值得信赖 存储所有这些用户名和 某种数据库中的密码。 我们存储用户密码的那一刻, 我们承担了责任 保护他们的密码。让我们 说一个黑客以某种方式获得了一个列表 我们所有的用户名和密码。 要么是某人的内部工作 谁有权访问数据库,或 数据库意外暴露于 公共网络。没关系。它 刚刚发生。

(...)

你可能认为这是相对的 如果某人的论坛不重要 密码以纯文本形式公开。 毕竟,攻击者要做什么 使用蹩脚的论坛凭据?邮政 代表用户发怒消息? 但大多数用户倾向于重复使用相同的 密码,可能是因为他们不能 记住两打独特的 他们被强制使用的用户名和密码 拥有。所以如果你获得他们的论坛 密码,你可能也有 密码更多 危险:他们的网上银行和 贝宝。

这两篇文章涵盖了一些问题,我建议您阅读一下。

Never store passwords in a database!

Enough With The Rainbow Tables: What You Need To Know About Secure Password Schemes

对于身份验证相关建议的良好汇编,您还可以查看这个 *** 问题:

The Definitive Guide To Website Authentication (beta)


根据 OP 的评论进行编辑:

是的,我很笨,只是在发布后才看到,但评论仍然有效。

您正在使用 MD5 哈希,但如果您查看链接的文章,您会发现仅 MD5 是不够的,如果他们有您的数据库,您可以轻松地取回您的“大部分”密码。 为了快速测试,只需将 MD5 散列输入 google,您就会看到,除非您的密码真的很邪恶,否则您会找回它。

要获得更好的方法,您需要 md5hash 和每个密码的盐,但我建议您阅读链接的文章 Enough With The Rainbow Tables: What You Need To Know About Secure Password Schemes,而不是在这里解释。

它有一种简单易行的正确方法。 :)

如果我试图用自己的话来解释,我肯定会做错事! :)

【讨论】:

我正在使用 md5 加密。【参考方案3】:

你的意思是:

SELECT username,password FROM users WHERE username = '$loginUserName' and password = '$loginPassWord'

代替:

SELECT username,password FROM users WHERE username = '$loginUserName' and '$loginPassWord'

【讨论】:

令我惊讶的是它奏效了。我想我完全看错了。

以上是关于Php登录问题(用户无法登录,用户可以使用其他密码访问自己的帐户)的主要内容,如果未能解决你的问题,请参考以下文章

用户指定的用户名和密码无法登陆到该 FTP服务器。

Perfect Money api 错误(无法使用用户 ID 和密码登录)

php实现第三方登录

PHP获取windows登录的用户名及密码

忘记登录 - PHP 问题

kali用户名密码正确无法登录 你知道吗?