Session 与登录机制

Session 概念

指一类用来在客户端和服务器之间保持状态的方案的存储结构

Session 特点

由于Session是以文本文件形式存储在服务器端,所以不怕客户端修改内容,可以直接存储在内存中,也可以存储在redis这种内存数据库中,当然存储到其他数据库中也是可以的。

Session是有生命周期的

Session实例时轻量级的,所谓的轻量级,指的是它的创建和删除不需要消耗太多的资源

Session对象内部有一个缓存

Session 用法

用于存储特定用户会话的属性以及配置信息,比如用户的身份信息等,这些信息在web页面跳转的时候信息将不会丢失。

通常用于以下操作:存储整个会话过程中保持用户状态的信息,比如登录信息或者用户浏览时产生的其他信息

存储只需要页面新加载过程中,或者一组功能页之间保持状态的对象

在web服务器上保持用户的状态信息,供在任何时间从任何设备上的页面进行访问

限制:用户登陆越多,session需要的内存越大

每个session对象的持续时间是用户访问时间加上不活动时间

为何需要Session

因为HTTP协议本身是无状态的,没有办法用户登陆之后能够在一段时间之内记住登录状态,那就需要另外一种工具来讲登录状态记录下来,并为这个记录生成一个id返回给客户端,客户端保存下来之后,接下来的每个请求都会带上这个id自动去认证这个登录态。

举个喝咖啡的例子:

1、该店的店员很厉害,能记住每位顾客的消费数量,只要顾客一走进咖啡店,店员就知道该怎么对待了。这种做法就是协议本身支持状态。

2、发给顾客一张卡片,上面记录着消费的数量,一般还有个有效期限。每次消费时,如果顾客出示这张卡片,则此次消费就会与以前或以后的消费相联系起来。这种做法就是在客户端保持状态。

3、发给顾客一张会员卡,除了卡号之外什么信息也不纪录,每次消费时,如果顾客出示该卡片,则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种做法就是在服务器端保持状态。

具体机制当程序需要为某个客户端的请求创建一个session(一般是登陆信息验证成功之后为这些信息创建一个session)的时候,服务器首先检查这个客户端的请求里是否已包含了一个 session标识 - 称为session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个 既不会重复,又不容易被找到规律以仿造的字符串 ,这个session id将被在本次响应中返回给客户端保存(一般通过返回头中的set-cookie头将这个sessionid设置到cookie中,下次的请求就会通过cookie自动将这个sessionid发送到后台)。

由于cookie可以被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一种技术叫做URL重写

两种形式:1

2

3

4

5

6

7// 作为url附加路径

'http://..../xxx;jsessionid=abcdefjijeoijoifjioe'

// 作为查询字符串

'http://..../xxx?jsessionid=abcdefjijeoijoifjioe'

复制代码

较老的技术,表单隐藏字段,此方法在防止csrf中有用

Session Fixation 漏洞

定义

会话固定攻击(session fixation attack)是利用应用系统在服务器的会话ID固定不变机制,借助他人用相同的会话ID获取认证和授权,然后利用该会话ID劫持他人的会话以成功冒充他人,造成会话固定攻击

攻击流程

1、攻击者Attacker能正常访问该应用网站;

2、应用网站服务器返回一个会话ID(attackSessionID)给他;

4、受害者Victim点击该链接,携带攻击者的会话ID和用户名密码正常登录了该网站,会话成功建立;这个时候如果再用attackerSessionID去访问服务器,服务器就会认为攻击者是受害者。

5、攻击者Attacker用该会话ID成功冒充并劫持了受害者Victim的会话。

防御方式

整个攻击过程的根本原因就是直接利用了链接发送过来的sessionID生成session,并直接将这个sessionID返回。

解决方式也很简单,类似登陆这种有敏感信息的接口需要重新生成一个新的sessionID

Express-session 防御 Session Fixation 举例

express-session是node服务器框架express的一个插件,具体如何使用可以参考一下express-session文档,如果想要了解原理,也可以去看一下源码,其实原理都很简单,只不过是被封装了起来,就是请求头部的cookie和set-cookie的生成,session的CRUD的封装。

值得注意的是它的store选项,也就是存储位置,如果不传值会默认存储到内存中,我们可以自己实现一个插件,只要这个插件实现了上面文档中提到的get,set,touch等接口就可以,置于你的这几个接口是把数据存储到redis,MongoDB还是其他什么地方都无所谓。

如果只是使用express-session来进行session的管理,是没有办法防御session fixation的,而且也没有必要对每一个请求都重新生成sessionID,我们只需要对某些敏感操作,如登陆进行重新生成sessionID的操作就好。如:1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31const fixation = (options) => {

options = options || {};

return function(req, res, next){

req.resetSessionID = function(){

return new Promise(function(resolve, reject){

let session = req.session;

req.session.regenerate(function(err){

if (err) {

reject(err);

} else {

for (let i in session) {

if (!req.session[i]) {

req.session[i] = session[i];

}

}

resolve(req.session);

}

});

});

};

if (options.everyRequest && req.headers['X-Requested-With'] !== 'XMLHttpRequest' && !req.xhr) {

req.resetSessionID().then(function(){

next();

}).catch(function(err){

next(err);

});

} else {

next();

}

};

};

上述代码通过express-session自带regenerate方法重新生成一个id,并将原有的session内容设置给新生成的session。

我们只需要在需要重置id的请求中调用该方法即可。

参考文章:

php session fixation,Session Fixation 原理与防御相关推荐

  1. Session的底层实现原理

    Session实现原理 客户对向服务器端发送请求后,Session 创建在服务器端,返回Sessionid给客户端浏览器保存在本地, 当下次发送请求的时候,在请求头中传递sessionId获取对应的从 ...

  2. Session与Cookie底层原理

    2019独角兽企业重金招聘Python工程师标准>>> 学习目录 1.会话入门 2.cookie 3.session 4.自定义缓存 5.自定义Token 6.表单重复提交(Http ...

  3. java中session的用法与原理

    https://www.cnblogs.com/xdp-gacl/p/3855702.html session简介 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注 ...

  4. Session的作用及原理

    文章目录 1. 定义 2. 和Cookie比较 3. 图解 4. 源码解析(Java) 5. 总结 1. 定义 Session在计算机中,尤其是网络应用中,被称为"会话控制". S ...

  5. 服务器安全:浏览器同源策略与跨域请求、XSS攻击原理及防御策略、如何防御CSRF攻击

    主要包括 浏览器同源策略与跨域请求 XSS攻击原理及防御策略 如何使用SpringSecurity防御CSRF攻击 CC/DDOS攻击与流量攻击 什么是SSL TLS HTTPS? 一.浏览器的同源策 ...

  6. CSRF攻击原理以及防御方法

    CSRF攻击原理以及防御方法 CSRF概念:CSRF跨站点请求伪造(Cross-Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,你可以这样来理解: 攻击者盗用了你的身份 ...

  7. csrt攻击的原理和防御

    csrt攻击的原理和防御 阿里巴巴Java开发手册 安全规约 [强制]表单,ajax提交必须执行CSRF安全过滤. 说明:CSRF(Cross-site request forgery)跨站请求伪造是 ...

  8. PHP session有效期session.gc_maxlifetime

    PHP中的session有效期默认是1440秒(24分钟),也就是说,客户端超过24分钟没有刷新,当前session就会失效.很明显,这是不能满足需要的. 一个已知管用的方法是,使用session_s ...

  9. cookielifetime php_PHP session有效期session.gc_maxlifetime的设置方法

    PHP(外文名: Hypertext Preprocessor,中文名:"超文本预处理器")是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,入门门槛较低,易于学 ...

  10. hibernate 管理 Session(单独使用session,非spring)

    hibernate 管理 Session(单独使用session,非spring) Hibernate 自身提供了三种管理 Session 对象的方法 Session 对象的生命周期与本地线程绑定 S ...

最新文章

  1. Maven教程(3)--Maven导入工程常见问题(编码、MavenArchiver、Lifecycle Mapping、maven install 没有反应)...
  2. 动态链接库编写与使用(VC6)
  3. 【中级软考】专利权的保护期限可以延长吗?商标使用权呢?
  4. java中的case1怎么说_Java 中的 CAS 简述及原理解析
  5. 素数筛选-hdu2710
  6. JAVA消息服务JMS规范及原理详解
  7. ADB原理,Wi-Fi连接,常用命令及拓展
  8. C++ 力扣剑指Offer16-数值的整数次方
  9. Sql Server 2008将数据库导出sql脚本并导出数据
  10. fastnest怎么一键排版_什么公众号排版编辑器可以换字体?公众号字体在哪里选择修改?...
  11. 微信小程序UI------实现携程首页顶部的界面(弹性布局)
  12. [Angular2 Animation] Control Undefined Angular 2 States with void State
  13. 防止孩子使用计算机的软件,如何防止熊孩纸在电脑里乱装软件
  14. 乐高mindstormsev3_乐高MINDSTORMSEV3软件程序模块开发
  15. 卫星导航信号结构变化的过去,现在和未来
  16. PS2021中使用Nik插件崩溃闪退|Nik Collection不兼容cc2021闪退的解决方法
  17. Gradually Vanishing Bridge for Adversarial Domain Adaptation
  18. 华为mate30是不是鸿蒙系统,这个意味着是不是鸿蒙系统?
  19. Rabbitmq 定时任务
  20. 网络慢?看看路由器设置对不对

热门文章

  1. android x86 remix,Remix系统X86版
  2. GRB控制型非隔离dc-dc低压升压高压电源模块24V转100V120V150V200V250V350V500V1000V
  3. Exchange Server 2013 VS 2016
  4. python关系图谱_文本分析之制作网络关系图 Python
  5. 斯坦福公布3D街景数据集:2500万张图像,8个城市模型 | 下载
  6. android开发笔记之reflect使用
  7. Java多线程篇--threadlocal和线程池
  8. 16、可靠数据传输(rdt)的原理
  9. kali的ip转发失败怎么解决?
  10. 三种近场通信的特点,以及未来近场通信技术的应用场景的分析和预测