这个粗略的PHP验证方法有什么问题?

时间:2013-02-28 03:18:26

标签: php verification

所以,这是我的代码:

$login_user_name = $_POST['login-user-name'];
//salt is declared earlier
$login_user_pword = super_encrypt($_POST['login-user-pword'], $login_salt);     

$login_veri_query = mysql_query("SELECT * FROM zebra_users WHERE username='".$login_user_name."'");

$login_veri_numrows = mysql_num_rows($login_veri_query);

if ($login_veri_numrows != 0) {
    while ($value = mysql_fetch_array($login_veri_query)) {
        if ($value['password'] == $login_user_pword) {
            $login_error .= '<p class="success">Logged in Successfully!</p><br/>';
            $main_error .= '<p class="success">Logged in Successfully!</p><br/>';
            $login_good = true;
            $login_error .= '<script type="text/javascript"> <!-- window.location = "main.php" //--> </script>';
        } else {
            $login_error .= '<p class="warning">Incorrect password, try again.</p><br>';
        }
    }
}
}

如果用户的用户名为'user',密码为'pword',并且这些凭据已输入到表单中,则“验证”方法会声明密码不正确。

这里有什么问题?

此外,我知道这不是一个很好的登录风格,但我使用它作为占位符,直到我使用cookie,我不

1 个答案:

答案 0 :(得分:1)

首先,它很容易被sql注入,因为你没有转义用户名。

其次,你应该将散列密码发送到数据库,它应该返回任何用户名和密码哈希匹配的用户。这样,有人无法通过输入错误的密码强制数据库发送密码哈希。

第三,如果没有从数据库返回任何行,会发生什么?密码失败的操作应与失败用户名的操作相同。

第四,您应该使用===来比较密码(尽管您根本不应该使用此方法)。您不希望空密码与FALSE或类似的东西匹配。此外,它只是节省资源。