JavaScript中Session怎么防止会话固定攻击带来的安全风险

浅伟吖_8158

浅伟吖_8158

2026-07-20

882人浏览

原创

javascript 不应直接管理 session id,而应由浏览器自动处理 httponly cookie;禁止手动操作 cookie、url 传参或 localstorage 存储 session id,登录页可触发空请求促服务端校验,安全依赖后端配置与前端合规配合。

javascript中session怎么防止会话固定攻击带来的安全风险

JavaScript 本身不直接管理服务器端 Session(那是后端的事),但它在前端参与会话生命周期管理,稍有不慎反而会加剧会话固定(Session Fixation)风险。真正起防御作用的是后端逻辑 + 前端配合策略。关键不是“JS 怎么做 Session”,而是“JS 怎么不破坏后端已有的防御”。

以下是实际可行、贴近开发场景的要点:

登录成功后不手动操作 Cookie 或 Session ID

很多前端开发者误以为“拿到登录返回的 session ID 后存到 localStorage 再发给后续请求”是合理做法——这恰恰是高危行为。

  • ✅ 正确方式:让浏览器自动管理 Cookie(由后端 Set-Cookie 设置),JS 不读、不写、不传 sessionId。
  • ❌ 危险操作:
    • document.cookie = "JSESSIONID=xxx"(主动设 Cookie,可能覆盖安全属性)
    • localStorage.setItem('sessionId', res.data.sessionId)(暴露 ID,绕过 HttpOnly 保护)
    • 在 API 请求头里手动加 Cookie: JSESSIONID=xxx(破坏浏览器自动携带逻辑,易被 XSS 利用)

避免通过 URL 传递 Session ID

前端若生成跳转链接或重定向地址,务必检查是否意外拼入了 jsessionid 或类似参数。

  • 比如不要这样写:
    window.location.href = `/login?jsessionid=${oldId}`;
  • 框架如 Vue Router / React Router 默认不带 session 参数,但需警惕服务端重定向返回的 Location 头含 URL 重写(如 ;jsessionid=ABC123)。
  • 解决方法:后端关闭 URL 重写(如 Tomcat 的 disableURLRewriting="true"),前端无需处理,但可加简单校验:
    if (window.location.search.includes('jsessionid') || 
        window.location.pathname.includes(';jsessionid')) {
      console.warn('Detected jsessionid in URL — potential fixation risk');
    }

登录页加载时主动清理可疑上下文

如果用户从钓鱼链接进入登录页(且该链接已附带攻击者预设的 Session ID),前端虽不能销毁服务端 Session,但可触发一次“无状态刷新”,降低风险窗口:

JavaStoryDevelop
JavaStoryDevelop

你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在

下载
  • 在 /login 页面 mounted 或 useEffect 中发起一次空请求(如 fetch('/health', { credentials: 'include' })),不带业务数据,仅促使服务端确认会话状态;
  • 更稳妥的做法交由后端:用户访问登录页时,服务端主动调用 session.invalidate()(或等价逻辑),再新建匿名会话——前端只需确保不缓存登录页或禁用离线存储。

配合后端完成安全 Cookie 属性校验

JS 无法读取 HttpOnly Cookie,但可通过 document.cookie 判断是否缺失关键安全标识(辅助排查配置错误):

// 检查 Cookie 是否设置了 Secure 和 HttpOnly(仅能判断 Secure,HttpOnly 不可见)
const hasSecureCookie = document.cookie.split(';').some(c => c.trim().startsWith('sessionId=') && location.protocol === 'https:');
if (!hasSecureCookie && location.protocol === 'https:') {
  console.error('Session cookie missing Secure flag — check backend Set-Cookie header');
}

⚠️ 注意:这只是诊断手段,不能替代后端配置。

不要自行实现 Token 绑定或 Referer 校验

有些文档建议前端在请求头加自定义 token 或校验 Referer 来防固定攻击——这既不可靠(Referer 可伪造/丢失),又增加维护成本。

  • ✅ 真正有效的绑定逻辑(如 User-Agent/IP 校验)必须由后端完成;
  • ✅ 前端唯一该做的是:确保所有 API 请求都启用 credentials: 'include',让浏览器自动携带合法 Cookie,不干预会话标识流转。

不复杂但容易忽略

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

5046

5

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

2023.07.04

1249

3

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

2023.07.04

4984

6

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

2023.09.01

980

4

JavaScript转义字符
JavaScript转义字符

JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

1896

5

js生成随机数的方法
js生成随机数的方法

js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

2023.09.04

3565

4

如何启用JavaScript
如何启用JavaScript

JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

2023.09.12

4613

6

Js中Symbol类详解
Js中Symbol类详解

javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

2023.09.20

3040

5

java访问控制修饰符介绍
java访问控制修饰符介绍

java访问控制修饰符有四种,分别是public、protected、private、默认访问修饰符。详细介绍:1、public,public是最宽松的访问控制修饰符,被修饰的类、方法和变量可以被任何其他类访问,当一个类、方法或变量被声明为public时,它们可以在任何地方被访问,无论是同一个包中的类还是不同包中的类;2、protected修饰符等等。

2023.09.20

968

7

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.3万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.7万人学习