0

我一直在寻找有关使用 PHP 安全登录的信息。我发现了一些有趣的内容,尽管我对最安全和最简单的方法仍然不完全肯定。

我创建了一个简单的系统,但我不确定它在哪里足够安全。我会保持简短,以免让您感到窒息:

我在数据库中的用户表包含一个名为“ loginToken ”的列。当用户登录时,会创建一个值(基于该用户的 id、一个随机数,最后是 sha1 哈希),该值被插入到数据库用户表的 loginToken 中。

除此之外,还创建了一个具有相同值的 $_CCOKIE。所以这些值对于每个用户来说都是完全不同的,并且每次用户登录时都会交替出现。

现在要检查用户是否已登录,我使用以下代码:

$user_id = -1; //By default, the user is logged out

if (isset($_SESSION["user"]) && isset($_COOKIE["ut"])) { //Check session and user token exists
    //Get variables
    $uid = $_SESSION["user"]; //Get user ID
    $ut = $_COOKIE["ut"]; //Get user token

    //Compare the user id with the user token in the database
    $sql = mysql_query("
        SELECT COUNT(*)
        FROM `users`
        WHERE `id` = '$uid' AND `login_token` = '$ut'
    ");

    //Get result
    $sql = mysql_result($sql, 0);

    //Found!
    if ($sql == 1) {
        $user_id = $uid; //User logged in!
    }
}

这可以理解吗?如果是这样,那是一种足够安全的方法吗?

谢谢!

4

1 回答 1

0

您的方法不安全。用户可以设置恶意 cookie,该 cookie 可以在您的数据库上执行 SQL 注入。

使用会话变量。

if ($_SESSION['logged_in'] === true) { ...

这是经常使用的方法。

通常,您希望用户通过 HTTPS 安全形式输入用户名和密码。当您收到请求时,将用户名和您存储在数据库中的密码的散列版本与表单提供的散列版本进行比较。如果哈希匹配,则设置 $_SESSION['logged_in'] = true。

稍后在您的代码中,检查该会话变量以确保用户已登录。

于 2013-06-03T17:08:20.737 回答