gpt4 book ai didi

php - 在 PHP 中使用 "Remember me"功能的正确方法

转载 作者:IT王子 更新时间:2023-10-28 23:54:42 25 4
gpt4 key购买 nike

致力于登录系统并尝试实现记住我的功能。

最近,我做了关于这个主题的研究,阅读了一堆文章、帖子、故事、小说、童话故事(之所以这样称呼,因为其中一些甚至不包含一行代码,只是一堆单词)关于,cookie漏洞如固定、劫持……等

并决定实现以下目标

  1. 设置登录尝试之间的时间延迟(以防止暴力攻击)并限制尝试次数
  2. 几乎在每次操作时都重新生成 session ID

但是我真的对我的主要问题感到困惑:对于“记住我”功能,哪种方式是正确的?使用 cookies/ session /数据库?

请用代码解释一下你的想法。(没有代码我看不懂)

详细

目前,我的代码看起来像这样

在登录期间,我使用以下函数来设置 cookie 和 session

protected function validateUser($userid, $ckey=0, $rememmber=0) {
session_start();
session_regenerate_id(true); //this is a security measure
$_SESSION['user_id'] = $userid;
$_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']);
if (isset($remember) && $rememmber == 'on') {
setcookie("user_id", $_SESSION['user_id'], time() + 60 * 60 * 24 * COOKIE_TIME_OUT, "/");
setcookie("user_key", sha1($ckey), time() + 60 * 60 * 24 * COOKIE_TIME_OUT, "/");
}
return true;
}

然后在安全用户页面上,检查 user_id 使用 user_id 从数据库中获取有关用户的所有重要数据

public function protect() {
session_start();

/* Secure against Session Hijacking by checking user agent */
if (isset($_SESSION['HTTP_USER_AGENT'])) {
if ($_SESSION['HTTP_USER_AGENT'] != md5($_SERVER['HTTP_USER_AGENT'])) {
$this->signout();
exit;
}
}

// before we allow sessions, we need to check authentication key - ckey and ctime stored in database

/* If session not set, check for cookies set by Remember me */
if (!isset($_SESSION['user_id'])) {
if (isset($_COOKIE['user_id']) && isset($_COOKIE['user_key'])) {
/* we double check cookie expiry time against stored in database */

$cookie_user_id = $_COOKIE['user_id'];
$stmt = $this->db->prepare("select `ckey`,`ctime` from `users` where `id` =?") or die($this->db->error);
$stmt->bind_param("i", $cookie_user_id) or die(htmlspecialchars($stmt->error));
$stmt->execute() or die(htmlspecialchars($stmt->error));
$stmt->bind_result($ckey, $ctime) or die($stmt->error);
$stmt->close() or die(htmlspecialchars($stmt->error));
// coookie expiry
if ((time() - $ctime) > 60 * 60 * 24 * COOKIE_TIME_OUT) {
$this->signout();
}
/* Security check with untrusted cookies - dont trust value stored in cookie.
/* We also do authentication check of the `ckey` stored in cookie matches that stored in database during login */

if (!empty($ckey) && is_numeric($_COOKIE['user_id']) && $_COOKIE['key'] == sha1($ckey)) {
session_regenerate_id(); //against session fixation attacks.

$_SESSION['user_id'] = $_COOKIE['user_id'];
$_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']);
} else {
$this->signout();
}
} else {
if ($page != 'main') {
header('Location:' . wsurl);
exit();
}
}
}

最佳答案

To set time delay between login attempts (to prevent bruteforce attacks) and to limit attempts count

那么您是通过帐户提供 DOS 方法吗?

To regenerate session id on nearly every operation

嗯,不。这实际上很可能会打败该物体。当当前 ID 过期或用户通过身份验证时,您应该始终生成一个新 ID - 否则不要管它。

But I really confused about my main problem: which way is proper, for "remember me" feature? to use cookies/session/database?

由于您需要在客户端保留 token ,这意味着 cookie(除非您喜欢使用本地存储编写非常复杂的东西)。由于您不想通过 cookie 公开数据/使伪造变得简单,这意味着它应该是一个随机值。为了协调存储的随机值,这意味着在服务器端存储数据 - 可能在数据库中,因为必须可以根据用户 ID 或随机值来引用数据。

虽然您可以只使用一个不过期(或非常长的) session ,但我会远离这个 - 数据会滚雪球 - 偶尔更新 session 数据是个好主意。

您还需要满足用户希望您在 2 台不同计算机上记住她的场景。如果您只为每个帐户持有一个“记住我” token ,那么您要么必须在两个客户端上使用相同的值,要么在创建新 token 时删除旧 token (即只能在一台机器上记住用户).

please explain your idea on code. I can't understand clearly without code

没有。我得到报酬来编写代码;如果您想让我为您编写代码,那么您需要付钱给我。而且代码会比上面的描述占用更多的篇幅和时间。

关于php - 在 PHP 中使用 "Remember me"功能的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8907357/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com