php否则使用方法,在PHP中使用“记住我”功能的正确方法

这篇博客探讨了如何在登录系统中安全地实现'记住我'功能,包括设置登录尝试间隔以防止暴力攻击,以及在每次操作时重新生成会话ID。作者通过对比cookies、会话和数据库的不同使用方式,详细阐述了其代码实现,重点在于检查和验证cookie中的用户身份,并确保会话的安全性,以抵御会话劫持和固定cookie漏洞。
摘要由CSDN通过智能技术生成

在登录系统上工作并试图实现记住我的功能.

最近,我对这个问题进行了研究,阅读了一些文章,帖子,故事,小说,童话故事(称为他们,因为他们中的一些不包含甚至1行代码,只包含一些单词),cookie漏洞如固定,劫持等

并决定实现以下目标

设置登录尝试之间的时间延迟(以防止暴力攻击)并限制尝试次数

>在几乎每个操作中重新生成会话ID

但是我真的很困惑我的主要问题:哪种方式是适当的,“记住我”功能?使用cookies /会话/数据库?

请你解释一下代码的想法(没有代码就明白了)

详细

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

在登录期间,我使用以下功能设置Cookie和会话

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,以从db获取有关用户的所有重要数据

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();

}

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值