WEB应用安全与防护 - 实操案例 2:CSRF(跨站请求伪造)—— 伪造用户操作

本期新开课程《WEB应用安全与防护》,为了帮同学们理解并实践 JavaScript 应用中的核心安全问题,我整理了3 个高频且易上手的实操案例,涵盖前端最常见的安全漏洞,每个案例包含「问题场景」「漏洞分析」「修复方案」和「验证方法」,新手也能快速掌握。

案例 2:CSRF(跨站请求伪造)------ 伪造用户操作

场景描述

假设你开发了一个「修改密码」的功能,仅通过 Cookie 验证用户身份,前端发送请求的代码如下:

javascript

运行

复制代码
// 有CSRF漏洞的代码
const changePwdBtn = document.getElementById('change-pwd-btn');

changePwdBtn.addEventListener('click', () => {
  const newPwd = document.getElementById('new-pwd').value;
  // 直接发送POST请求,仅依赖Cookie验证
  fetch('/api/change-password', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ newPassword: newPwd })
  });
});

攻击者可构造恶意页面,诱导用户点击后,以用户身份发送「修改密码」请求(因为浏览器会自动携带 Cookie)。

漏洞分析

CSRF 的核心是请求未验证「请求发起者是否为合法用户」,仅依赖 Cookie 验证身份,攻击者可伪造请求。

修复方案(核心:添加 CSRF Token 验证)

步骤 1:前端获取 CSRF Token(通常从后端返回的页面 / 接口获取)

javascript

运行

复制代码
// 安全的代码:添加CSRF Token验证
const changePwdBtn = document.getElementById('change-pwd-btn');
// 从页面meta标签获取后端生成的CSRF Token(后端渲染页面时写入)
const csrfToken = document.querySelector('meta[name="csrf-token"]').content;

changePwdBtn.addEventListener('click', () => {
  const newPwd = document.getElementById('new-pwd').value;
  fetch('/api/change-password', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-CSRF-Token': csrfToken // 携带CSRF Token
    },
    body: JSON.stringify({ newPassword: newPwd })
  });
});
步骤 2:后端验证(关键)

后端需要:

  1. 为每个用户会话生成唯一的 CSRF Token;
  2. 接收请求时,验证请求头中的X-CSRF-Token是否与用户会话中的 Token 一致;
  3. 不一致则拒绝请求。

验证方法

  1. 手动修改请求头中的X-CSRF-Token为无效值,发送修改密码请求;
  2. 后端返回 403 Forbidden,说明 CSRF 防护生效。
相关推荐
Irene19911 小时前
ElementPlus 与成熟后台框架对比:vue-element-plus-admin、vue-pure-admin等
前端·ui·框架·vue3
尘中客5 小时前
放弃 Echarts?前端直接渲染后端高精度 SVG 矢量图流的踩坑记录
前端·javascript·echarts·前端开发·svg矢量图·echarts避坑
小鹿软件办公5 小时前
2026 年第 4 个零日漏洞!Google 发布 Chrome 紧急补丁
安全·web安全·google chrome
FreeBuf_5 小时前
Chrome 0Day漏洞遭野外利用
前端·chrome
小彭努力中6 小时前
199.Vue3 + OpenLayers 实现:点击 / 拖动地图播放音频
前端·vue.js·音视频·openlayers·animate
2501_916007476 小时前
网站爬虫原理,基于浏览器点击行为还原可接口请求
前端·javascript·爬虫·ios·小程序·uni-app·iphone
前端大波6 小时前
Sentry 每日错误巡检自动化:设计思路与上手实战
前端·自动化·sentry
workflower7 小时前
用硬件换时间”与“用算法降成本”之间的博弈
人工智能·算法·安全·集成测试·无人机·ai编程
ZC跨境爬虫7 小时前
使用Claude Code开发校园交友平台前端UI全记录(含架构、坑点、登录逻辑及算法)
前端·ui·架构
慧一居士7 小时前
Vue项目中,何时使用布局、子组件嵌套、插槽 对应的使用场景,和完整的使用示例
前端·vue.js