如何让你的会话更安全,浅析Session与Cookie

本文详细介绍了Cookie和Session的工作原理,重点讲解了如何在PHP中生成和防御XSS漏洞,包括使用httponly属性增强Cookie安全性,以及Session的存储和使用方式。文章还提供了实例代码和安全实践建议。
摘要由CSDN通过智能技术生成

在我们面试的时候,面试官问及 XSS 漏洞的时候,我们常常会说比如劫持
Cookie,问及防御方法的时候,又常常会说设置httponly,本篇文章将从代码层面简单的普及 Session 和 Cookie
的生成过程,及防御的方法,希望看到这篇文章后,下一次遇到面试官的时候,你能够自豪的跟他说我知道防御 XSS 漏洞,能够把流程讲清楚,把原理讲明白!

先从 Cookie 讲起

什么是 Cookie 呢?简单来说,当用户访问某个网站时,该网站的服务器会生成一个Cookie并发送到用户的浏览器, 浏览器将其存储在本地计算机上。
之后,每当用户再次访问该网站时,浏览器会将Cookie发送回服务器,服务器通过这些信息来识别用户,维持用户的登录状态,或者记录用户的浏览习惯、购物车。

在 PHP 中,我们常常使用setcookie函数生成用户的 cookie,其函数解释如下:

setcookie() 是 PHP 中的一个函数,用于设置 cookie 的各种属性,并向客户端发送 cookie。cookie
是一种机制,允许服务器向浏览器发送少量数据,并且浏览器会存储这些数据,下次访问同一网站时会发送回服务器。
函数的基本语法如下:

setcookie(name, value, expires, path, domain, secure, httponly);

参数说明:

  • name:cookie 的名称。
  • value:cookie 的值。
  • expires:cookie 过期的 Unix 时间戳。如果未设置或设置为 0,则 cookie 在浏览器会话结束时过期。
  • path:cookie 在哪个路径下有效。默认为当前脚本的目录以及所有子目录。
  • domain:cookie 在哪个域名下有效。注意,如果设置此参数,cookie 只会在指定的域下工作。
  • secure:如果设置为 true,cookie 只有在 HTTPS 连接下才会被发送。
  • httponly:如果设置为 true,cookie 将不会通过客户端脚本访问(如
    JavaScript),有助于减少跨站脚本攻击(XSS)。

使用实例如下:

setcookie("user", "JohnDoe", time() + 3600, "/", "example.com", true, true);

上面的代码会设置一个名为 user 的 cookie,值为 JohnDoe,有效期为 1 小时,在整个网站的路径下有效,仅适用于
example.com 域,并且需要通过安全的 HTTPS 连接传输,同时禁止通过客户端脚本访问。

为什么会有 Session

众所周知,Session相对于Cookie来说,由于其服务器端存储的特性,通常被认为更安全。其安全性体现在与,
Session数据存储在服务器上,这意味着它们不受浏览器设置的影响,并且不容易受到XSS攻击。
同时,Session可以在用户会话期间持续存在,而不需要每次页面加载时都重新发送Cookie。

在 PHP
中,我们常常使用session_start()函数来开始或继续一个现有的会话,用session_regenerate_id()防止会话劫持。

Session 与 Cookie 的区别如下:

|

Cookie

|

Session

—|—|—

存储位置

|

Cookie存储在用户的浏览器中,

|

Session数据存储在服务器上,这意味着它们不受浏览器设置的影响

安全性

|

如果Cookie没有设置为HttpOnly,那么JavaScript可以读取Cookie

|

Session通常通过一个会话ID来识别,这个ID在每次请求时都会发送到客户端。如果会话ID被窃取,攻击者可以使用它来访问用户的会话。

持久性

|

Cookie在每次HTTP请求和响应中都会被发送

|

Session可以在用户会话期间持续存在,而不需要每次页面加载时都重新发送Cookie。

跨域问题

|

由于同源策略(SOP),Cookie通常受到同源限制

|

Session不受SOP的限制,可以在不同域间使用。

01- 前端代码编写

创建文件/session/index.html,用以提交用户名及密码,发送数据给到后端验证,实验代码如下:

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>登录示例</title>
</head>
<body>
<form action="login.php" method="post">
    用户名:<input type="text" name="username" required>
    密码:<input type="password" name="password" required>
    <input type="submit" value="登录">
</form>
</body>
</html>

前端页面反馈如下,麻雀虽小,五脏俱全:

![](https://img-
blog.csdnimg.cn/img_convert/1bf2d5974adbd6ee70f56d6360f8041d.png)

02-后端 Session 生成

创建后端处理 php 代码login.php,用以在通过验证的用户名和密码后,创建 Session 会话 ID,实验代码如下:

<?php
// 模拟用户数据库
$users = array(
    'user1' => 'password1',
    'user2' => 'password2'
);

// 从表单中获取用户名和密码
$username =$_POST['username'];
$password =$_POST['password'];

// 验证用户名和密码
if (isset($users[$username]) && $users[$username] === $password) {
    // 生成安全的会话ID
    session_start();
    session_regenerate_id();
    $_SESSION['loggedin'] = true;
    $_SESSION['username'] =$username;

    // 设置 session ID 到 Cookie
    setcookie(session_name(), session_id(), time() + 3600, '/', '', true, true);

    echo '<pre style="color: green; font-size: 18px;">';
    echo '登录成功,您的会话信息如下:';
    echo '<br><code>' . htmlspecialchars($_COOKIE[session_name()]) . '</code>';
    echo '</pre>';
} else {
    echo '<pre style="color: red; font-size: 18px;">';
    echo '登录失败,用户名或密码错误。';
    echo '</pre>';
}
?>
03-Session 会话使用

在我们后端login.php生成完 Session 会话后,我们访问目标网站下的其他页面,比如info.php,需要通过 Session
去验证我们的身份,其后端代码如下:

<?php
// 检查会话是否已启动
if (!isset($_COOKIE[session_name()])) {
    // 如果会话未启动,重定向到登录页面
    header('Location: login.php');
    exit;
}

// 开始会话
session_start();

// 检查用户是否已登录
if (!isset($_SESSION['loggedin']) || !$_SESSION['loggedin']) {
    // 如果用户未登录,重定向到登录页面
    header('Location: login.php');
    exit;
}

// 显示用户信息
echo '<pre style="color: green; font-size: 18px;">';
echo '欢迎,' . htmlspecialchars($_SESSION['username']) . '!';
echo '</pre>';

?>
04-实验会话使用

首先我们通过表单数据,构造 POST 型请求,将用户名user1和密码password1以 POST 型提交,服务器端返回数据包如下:

![](https://img-
blog.csdnimg.cn/img_convert/5473a29ae1525b4f22cd66bc8f238a95.png)

此时当后端验证完成后,会发出set-cookie的命令,将sessionID进行设置后发送给前端浏览器。

如果我们发送多次请求,会发现每次进行登录的请求时,都会重新设置sessionID,此时我们有多个sessionID,都是指向用户user1

![](https://img-
blog.csdnimg.cn/img_convert/3b875f977eb09d6d96c9875ef1f1c249.png)

经过测试,这些sessionid都是指向用户user1,因此会发现这种重复性的登陆行为,并没有保障用户数据的安全性。

![](https://img-
blog.csdnimg.cn/img_convert/b29b1a59af73bacb817e9993f56c9be4.png)

旧的sessionid并未销毁,仍旧可被识别:

![](https://img-
blog.csdnimg.cn/img_convert/ad9508078ddc36c343cae4f419f373c4.png)

这是因为我们在设置的过程中,并没有使用的相应识别机制,在重复提交登录表单的时候进行旧的 ID
的销毁,但是由于sessionID的爆破难度较高,因此安全性并不会受到较大的影响。

如何设置 httponly 来保证 **sessionID** 的安全性:

在之前的后端代码中,有这样一行内容:

    // 设置 session ID 到 Cookie
    setcookie(session_name(), session_id(), time() + 3600, '/', '', true, true);

最后两个参数true,保证了首先数据包只有在https下才能传送,保障了cookie不会被恶意的监听到,比如在防御中间人攻击上起到了一定的保护作用,其次第二个true,设置了httponly这样即使网站出现了
XSS 漏洞,也能保障我们的cookie不被黑客窃取,两者结合保障了会话的安全性。

总结

在本篇文章中,我们首先从cookie讲起,理解了sessioncookie的不同,session为什么比cookie安全,以及如何去设置http- only及其设置的效果,希望对大家理解cookiesession有所帮助。

题外话

初入计算机行业的人或者大学计算机相关专业毕业生,很多因缺少实战经验,就业处处碰壁。下面我们来看两组数据:

2023届全国高校毕业生预计达到1158万人,就业形势严峻;

国家网络安全宣传周公布的数据显示,到2027年我国网络安全人员缺口将达327万。

一方面是每年应届毕业生就业形势严峻,一方面是网络安全人才百万缺口。

6月9日,麦可思研究2023年版就业蓝皮书(包括《2023年中国本科生就业报告》《2023年中国高职生就业报告》)正式发布。

2022届大学毕业生月收入较高的前10个专业

本科计算机类、高职自动化类专业月收入较高。2022届本科计算机类、高职自动化类专业月收入分别为6863元、5339元。其中,本科计算机类专业起薪与2021届基本持平,高职自动化类月收入增长明显,2022届反超铁道运输类专业(5295元)排在第一位。

具体看专业,2022届本科月收入较高的专业是信息安全(7579元)。对比2018届,电子科学与技术、自动化等与人工智能相关的本科专业表现不俗,较五年前起薪涨幅均达到了19%。数据科学与大数据技术虽是近年新增专业但表现亮眼,已跻身2022届本科毕业生毕业半年后月收入较高专业前三。五年前唯一进入本科高薪榜前10的人文社科类专业——法语已退出前10之列。

“没有网络安全就没有国家安全”。当前,网络安全已被提升到国家战略的高度,成为影响国家安全、社会稳定至关重要的因素之一。

网络安全行业特点

1、就业薪资非常高,涨薪快 2022年猎聘网发布网络安全行业就业薪资行业最高人均33.77万!

img

2、人才缺口大,就业机会多

2019年9月18日《中华人民共和国中央人民政府》官方网站发表:我国网络空间安全人才 需求140万人,而全国各大学校每年培养的人员不到1.5W人。猎聘网《2021年上半年网络安全报告》预测2027年网安人才需求300W,现在从事网络安全行业的从业人员只有10W人。
img

行业发展空间大,岗位非常多

网络安全行业产业以来,随即新增加了几十个网络安全行业岗位︰网络安全专家、网络安全分析师、安全咨询师、网络安全工程师、安全架构师、安全运维工程师、渗透工程师、信息安全管理员、数据安全工程师、网络安全运营工程师、网络安全应急响应工程师、数据鉴定师、网络安全产品经理、网络安全服务工程师、网络安全培训师、网络安全审计员、威胁情报分析工程师、灾难恢复专业人员、实战攻防专业人员…

职业增值潜力大

网络安全专业具有很强的技术特性,尤其是掌握工作中的核心网络架构、安全技术,在职业发展上具有不可替代的竞争优势。

随着个人能力的不断提升,所从事工作的职业价值也会随着自身经验的丰富以及项目运作的成熟,升值空间一路看涨,这也是为什么受大家欢迎的主要原因。

从某种程度来讲,在网络安全领域,跟医生职业一样,越老越吃香,因为技术愈加成熟,自然工作会受到重视,升职加薪则是水到渠成之事。

黑客&网络安全如何学习

今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。

1.学习路线图

行业发展空间大,岗位非常多

网络安全行业产业以来,随即新增加了几十个网络安全行业岗位︰网络安全专家、网络安全分析师、安全咨询师、网络安全工程师、安全架构师、安全运维工程师、渗透工程师、信息安全管理员、数据安全工程师、网络安全运营工程师、网络安全应急响应工程师、数据鉴定师、网络安全产品经理、网络安全服务工程师、网络安全培训师、网络安全审计员、威胁情报分析工程师、灾难恢复专业人员、实战攻防专业人员…

职业增值潜力大

网络安全专业具有很强的技术特性,尤其是掌握工作中的核心网络架构、安全技术,在职业发展上具有不可替代的竞争优势。

随着个人能力的不断提升,所从事工作的职业价值也会随着自身经验的丰富以及项目运作的成熟,升值空间一路看涨,这也是为什么受大家欢迎的主要原因。

从某种程度来讲,在网络安全领域,跟医生职业一样,越老越吃香,因为技术愈加成熟,自然工作会受到重视,升职加薪则是水到渠成之事。

黑客&网络安全如何学习

今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。

1.学习路线图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去就业和接私活完全没有问题。

2.视频教程

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

内容涵盖了网络安全法学习、网络安全运营等保测评、渗透测试基础、漏洞详解、计算机基础知识等,都是网络安全入门必知必会的学习内容。

3.技术文档和电子书

技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,由于内容的敏感性,我就不一一展示了。

4.工具包、面试题和源码

“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。

还有我视频里讲的案例源码和对应的工具包,需要的话也可以拿走。

这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。

参考解析:深信服官网、奇安信官网、Freebuf、csdn等

内容特点:条理清晰,含图像化表示更加易懂。

内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…

img

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值