在MySQL数据库中存储无法访问的用户

时间:2015-09-02 04:21:06

标签: php mysql authentication

我有一个网站,某些区域/功能仅供经过身份验证的用户使用。有些用户在网站出现之前就存在了,目前有活跃的订阅。因此,他们的信息(必然)存在于数据库中,但这些帐户不应该被任何人访问 - 甚至是他们所属的用户 - 直到他们验证他们的信息,通过带有散列参数的电子邮件接收链接,并设置他们的密码。

所以:我想将这些用户存储在Users表中,但我不希望他们能够立即登录该网站。

目前,我的数据库设置如下:

Table: Users

    email   |     password     |      salt
------------+------------------+----------------
    User1   |                  |                 // password and salt are
    User2   |                  |                 // empty strings, not NULL
    User3   | md5(pass + salt) | rand(10-digits)
    User4   | md5(pass + salt) | rand(10-digits)


Table: Non-Registered Users

    email   |     identify1    |    identify2
------------+------------------+----------------
    User1   |     secret1a     |    secret1b
    User2   |     secret2a     |    secret2b

和我的accessControl.php一样,为了简洁起见,还有一些伪代码:

<?php

session_start();
if(isset($_POST['email']) && isset($_POST['password']) {
    $sql1 = "SELECT salt FROM Users WHERE email = :email";
    .... // prepare and execute
    if (!empty($result1)) {
        $hash = sha2($password.$result1['salt'],256);
        $sql2 = "SELECT * FROM Users WHERE password = :hash AND email = :email";
        .... // prepare and execute
        if(!empty($result2)) {
            $_SESSION['email'] = $_POST['email'];
            $_SESSION['password'] = $_POST['password'];
        }
    }
} elseif(isset($_SESSION['email'] && isset($_SESSION['password'])) {
    // do pretty much the same check as above
} else {
    // force login
}

?>

所以,我的问题是:未注册的用户是否可以在不先设置密码的情况下登录?将空白字段与任何的SHA256匹配是不可能的,对吧?我担心我会忽略一些显而易见的事情。

请,谢谢! :3

1 个答案:

答案 0 :(得分:1)

SHA256将始终具有256位,因此它永远不会匹配空字符串。话虽这么说,你的伪代码并没有完全描述你如何验证用户输入,所以你仍然可能容易受到SQL注入攻击。