session的基本原理及安全性

简介: session的基本原理及安全性

转载自http://blog.csdn.net/yunnysunny/article/details/26935637

session的基本原理及安全性

1.session原理

提到session,大家肯定会联想到登录,登录成功后记录登录状态,同时标记当前登录用户是谁。功能大体上就是这个样子,但是今天要讲的不是功能,而是实现。通过探讨session的实现方式来发掘一些可能你之前不知道的有趣的事情。

为了记录session,在客户端和服务器端都要保存数据,客户端记录一个标记,服务器端不但存储了这个标记同时还存储了这个标记映射的数据。好吧,还是说点白话吧,在客户端记录的其实是一个sessionid,在服务器端记录的是一个key-value形式的数据结构,这里的key肯定是指sessionid了,value就代表session的详细内容。用户在做http请求的时候,总是会把sessionid传递给服务器,然后服务器根据这个sessionid来查询session的内容(也就是上面说到的value)。

现在我们重点关注一下sessionid,他是今天问题的关键所在。sessionid在客户端(http的客户端一般就是指浏览器了)是存储在cookie中,当然也有例外(书本上肯定会提到也有保存在url中的,我做程序员这么多年也没有见过这种方式,这难道就是现实和实际的差距吗,好残酷)。

我们通过一个例子来阐述一下这个sessionid在session处理时的作用。首先假定这么一个场景,我们有一个cms(content management system,内容管理系统),这个应用有一个后台,用户必须登录才能进入后台进行文章发表等操作。首先是登录流程,用户在浏览器输入用户名、密码,点击登录,浏览器会将用户名密码提交到服务器程序进行处理;服务器验证用户名、密码正确后,会返回登录成功信息,并且会修改服务器端的session内容,比如我们将用户ID写入session中,为了方便存储这些session的内容会被序列化成字符串或者二进制保存在文件或者数据库中,这时候大多数情况下服务器在对当前的http请求进行响应时,会返回一个新的sessionid要求浏览器写入本地cookie中,对应的返回的http响应头部信息应该会是是这个样子的:set-cookie:PHPSESSID=xxxxxxx,浏览器解析到这个头之后就会在当前生成一个cookie关联当前的域名。

图1.1 登录时序图
1.png

接着用户登录后台进行发表文章操作,登录用户填写文章的标题、内容,然后点击发送。这时候浏览器会生成一条到服务器的http请求,注意这个请求的头部会将存储sessionid的cookie内容发送过去,也就是说请求的http头部信息中应该会有这么一段数据:cookie:PHPSESSID=xxxxxxx;other_cookie_name=yyyyyy;服务器接收到这个http请求之后,解析到cookie存在,且cookie中存在PHPSESSID这个cookie名字,然后就将PHPSESSID的值(也就是sessionid的值)取出来,根据这个PHPSESSID查询服务器上有没有对应的session内容,如果有则将其对应的值取出来进行反序列序列化(也就是将其转成编程语言中的一个数据结果,比如在php中会得到一个$_SESSION数组,在j2ee中会得到类型为javax.servlet.http.HttpSession),方便在程序中进行读取,最终服务器认定session中储存的值存在,并且从反序列化得到的对象中读取到了用户ID属性,然后就往cms数据库的文章表中插入了一条数据,最终返回http响应,告诉浏览器操作成功了。
2.png

图1.2 发表文章时序图

2.入侵示例

关于cookie的一些属性,可以参考我的另一篇博文关于cookie的一些事,里面会提到一个httponly的属性,也就是是否禁止js读取cookie。不幸的是很多常见的服务器(比如apache和tomcat)在生成这个存储sessionid的cookie的时候,没有设置httponly这个属性,也就是说js是可以将这个sessionid读取出来的。

js读取到sessionid,这会有问题吗?如果没有问题,我就不在这里啰嗦了。你网站上的运行的js代码并不一定是你写的,比如说一般网站都有一个发表文章或者说发帖的功能,如果别有用心的人在发表的时候填写了html代码(这些html一般是超链接或者图片),但是你的后台又没有将其过滤掉,发表出来的文章,被其他人点击了其中恶意链接时,就出事了。这也就是我们常说的XSS。

<?php
session_start();
$result = array();
if (!isset($_SESSION['uid']) || !$_SESSION['uid']) {
    $result['code'] = 2;
    $result['msg'] = '尚未登录';
} else {
    $uid = $_SESSION['uid'];
    require_once('../globaldb.php');
    if (!isset($_POST['title']) || !$_POST['title']) {
        $result['code'] = 4;
        $result['msg'] = '标题为空';
        goto end;
    }
    if (!isset($_POST['content']) || !$_POST['content']) {
        $result['code'] = 4;
        $result['msg'] = '内容为空';
        goto end;
    }

    if ($db->getStatus()) {
        $title = $_POST['title'];
        $content = $_POST['content'];
        $sql = 'insert into article(title,content,uid,create_time) values("'.$title.'","'.$content.'",'.$uid.',now())';
        $rv = $db->dbExecute($sql);
        if ($rv > 0) {
            $result['code'] = 0;
        } else {
            $result['code'] = 3;
            $result['msg'] = '插入失败';
        }
    } else {
        $result['code'] = 1;
        $result['msg'] = '数据库操作失败';
    }
}
end:
echo (json_encode($result));

代码2.1 添加文章的后台代码

这里给出了一段不靠谱代码,之所以这么说是由于对于提交的内容没有做过滤,比如说content表单域的内容。现在假设有这么两个网站,一个你自己的CMS网站,域名mycms.whyun.com,一个黑客用的网站,域名session.myhack.com。你可以通过配置hosts来模拟这两个网站,说到这里可还是推荐一下我之前做过的addhost工具,可以自动生成hosts和vhost配置。代码2.1正是mycms网站的代码。

登录mycms后在后台添加一篇文章,文章内容为:

相关文章
|
人工智能 缓存 vr&ar
big.LITTLE&DynamIQ
big.LITTLE&DynamIQ
268 0
|
2月前
|
Web App开发 数据挖掘 网络安全
Playwright MCP 实现小红书全自动发布的全流程指南
本文为小红书运营者带来一份实用指南:通过Playwright MCP技术,只需一次手动登录即可实现图文自动发布。教程从环境配置到完整脚本编写,手把手教你搭建稳定高效的无人值守发布系统,彻底解决登录验证难题。
|
前端开发 安全 UED
【项目实战】从终端到浏览器:实现 ANSI 字体在前端页面的彩色展示
在学习和工作中,我们经常需要使用日志来记录程序的运行状态和调试信息。而为了更好地区分不同的日志等级,我们可以使用不同的颜色来呈现,使其更加醒目和易于阅读。 在下图运行结果中,我们使用了 colorlog 库来实现彩色日志输出。通过定义不同日志等级对应的颜色,我们可以在控制台中以彩色的方式显示日志信息。例如,DEBUG 级别的日志使用白色,INFO 级别的日志使用绿色,WARNING 级别的日志使用黄色,ERROR 级别的日志使用红色,CRITICAL 级别的日志使用蓝色。
|
9月前
|
算法 搜索推荐 安全
不属于五种算法是否无需备案?一文读懂算法备案的真相
在数字化时代,算法成为互联网服务的核心技术。为应对算法歧视、大数据杀熟等问题,我国出台了算法备案制度,规范算法使用,保护用户权益。五种常见算法(生成合成、个性化推送、排序精选、检索过滤、调度决策)需备案,但其他类型算法在特定情况下也需备案,如涉及舆论属性或社会动员能力。未备案将面临法律责任,企业应严格遵守规定,确保合规运营。算法备案不仅是法律要求,更是企业对社会责任的体现。
|
存储 缓存 安全
企业出海合规:如何区分数据控制者与数据处理者
数据控制者是确定个人数据处理目的和方式的实体,负有最大责任,需保护数据主体的隐私。数据处理者是按照控制者指示处理个人数据的实体,负责数据安全和协助控制者履行职责。两者需通过明确的合同规定责任。数据控制者的职责包括确定目的、获得同意、确保安全、提供透明度、促进权利行使、进行DPIA和建立协议。数据处理者负责按指示处理数据、确保安全和保密、协助控制者、处理数据泄露通知、数据删除和遵守法律。
1044 0
|
SQL 人工智能 自然语言处理
2024年6月118篇代码大模型论文最全整理
基座模型与训练数据、代码微调、测试基准、代码Agent、低资源语言处理、AI代码安全与分析、人机交互、软件工程下游任务应用主题代码大模型论文分享,干货满满~
1394 2
|
存储 安全 Java
提升编程效率的利器: 解析Google Guava库之集合篇Table二维映射(四)
提升编程效率的利器: 解析Google Guava库之集合篇Table二维映射(四)
|
Android开发 开发者
flutter 开发环境配置和生命周期学习
flutter 开发环境配置和生命周期学习
|
机器学习/深度学习 人工智能 算法
AI技术引领视频去水印新时代
随着数字媒体的飞速发展,视频已成为我们获取信息、娱乐休闲的主要方式。然而,视频中的水印往往影响了观看体验,甚至阻碍了内容的传播。幸运的是,在人工智能(AI)技术的引领下,我们迎来了视频去水印的新时代。
|
安全 网络协议 网络安全
详解IP安全:IPSec协议簇 | AH协议 | ESP协议 | IKE协议
详解IP安全:IPSec协议簇 | AH协议 | ESP协议 | IKE协议
2369 3