news 2026/8/22 2:45:39

同源策略 ≠ 万能盾牌:为什么你的后端仍需防范“盲打“攻击?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
同源策略 ≠ 万能盾牌:为什么你的后端仍需防范“盲打“攻击?

一个常见的认知误区:很多开发者认为浏览器的同源策略(Same-Origin Policy)已经阻止了跨域攻击,因此忽略了后端对请求来源的校验。然而事实残酷——同源策略只管"读",不管"写"。恶意网站完全可以在你不知情的情况下,用你的身份执行转账、删号等高危操作。

一、同源策略的"盲区":它只管数据泄露,不管数据篡改

当我们谈到浏览器安全时,同源策略(SOP)总是被首先提及。它确实有效地防止了以下场景:

javascript

// 你在 a.com 登录了银行 // a.com 的 JS 试图读取 b.com 的数据 fetch('https://b.com/api/balance') .then(res => res.json()) .then(data => console.log(data)); // ❌ 被浏览器拦截:CORS policy blocked

但是,如果我们换个写法——不关心服务器返回什么,只让服务器执行操作:

javascript

// 恶意网站 evil.com 的代码 fetch('https://bank.com/transfer?to=hacker&amount=10000', { method: 'POST', // 甚至不需要处理响应... });

会发生什么?

  1. ✅ 请求确实发出去了(带上了你的 Cookie)
  2. ✅ 银行服务器已经执行了转账(钱没了)
  3. ✅ 响应也回到了浏览器(你可以在 DevTools 里看到 200 OK)
  4. JS 拿不到响应数据(同源策略只拦住了这一步)

这就是CSRF(跨站请求伪造)攻击的核心:恶意网站不需要知道你的余额,它只需要让你的浏览器去执行操作

二、CSRF 攻击实战模拟

想象这样一个场景:

上午 9:00:你在银行网站 bank.com 登录,浏览器保存了 Session Cookie。

上午 10:00:你没关浏览器,打开了钓鱼邮件里的链接 evil.com。

evil.com 的 HTML(极其简单,甚至不需要 JS):

html

<body> <h1>精美壁纸下载中...</h1> <!-- 图片自动加载,触发 GET 请求 --> <img src="https://bank.com/transfer?to=attacker&amount=50000" width="0" height="0" /> <!-- 或者自动提交的表单 --> <form id="csrf" action="https://bank.com/change-email" method="POST"> <input type="hidden" name="email" value="hacker@evil.com" /> </form> <script>document.getElementById('csrf').submit();</script> </body>

结果:你的银行卡转账 5 万元,或者绑定邮箱被改成了黑客的。整个过程不需要 JavaScript 读取任何返回数据,同源策略对此完全无能为力

三、后端校验:守护最后一道防线

既然浏览器"靠不住",服务端必须承担校验责任。目前业界主流的防御方案有三层:

1. CSRF Token(最经典可靠)

原理:在表单或请求头中嵌入一个随机生成的、只有服务器和当前页面知道的 Token。

html

<!-- 银行页面渲染时生成随机 Token --> <form action="/transfer" method="POST"> <input type="hidden" name="csrf_token" value="dW5pcXVlLWhhc2gtdmFsdWU=" /> <input name="amount" value="1000" /> <button>转账</button> </form>

java

// Spring Boot 示例 @PostMapping("/transfer") public String transfer(@RequestParam String amount, @RequestParam String csrf_token, HttpSession session) { // 校验 Token 是否与会存中存储的一致 if (!csrf_token.equals(session.getAttribute("csrf_token"))) { throw new SecurityException("疑似 CSRF 攻击!"); } // 执行转账... }

关键:恶意网站 evil.com无法读取bank.com 的页面内容(同源策略这时候起作用了!),因此拿不到 Token,请求自然被后端拒绝。

2. SameSite Cookie(现代浏览器的防线)

通过设置 Cookie 属性,让浏览器不在跨域请求中携带敏感 Cookie:

http

Set-Cookie: sessionId=abc123; SameSite=Strict; HttpOnly; Secure

  • SameSite=Strict:完全禁止第三方 Cookie(最安全,但可能影响从微信/邮件点击链接的体验)
  • SameSite=Lax:允许顶级导航(如 <a> 标签跳转)携带 Cookie,但阻止 POST/PUT 等危险操作(推荐折中方案)

3. Origin/Referer 校验(请求来源验证)

检查 HTTP Header 中的来源信息:

java

@PostMapping("/sensitive") public ResponseEntity<?> sensitiveOperation(@RequestHeader("Origin") String origin) { if (!"https://bank.com".equals(origin)) { return ResponseEntity.status(403).body("非法来源"); } // 继续处理... }

注意:Referer 可以被抹除(HTTPS 跳 HTTP 时不带),所以优先校验 Origin 头,同时不能作为唯一防线

四、总结:两道门的安全哲学

理解同源策略和 CSRF 防护的关系,可以用一个比喻:

同源策略阅览室的保安:防止外人偷看你的文件(保护数据隐私)。CSRF 防护金库的指纹锁:确保操作者真的是你本人(保护操作安全)。

两者缺一不可

  • 没有同源策略,坏人能直接读取你的敏感信息(余额、 Token)。
  • 没有 CSRF 防护,坏人能盲打执行高危操作(转账、改密),即使你收不到回执。

给开发者的建议

  1. 高风险操作(资金、隐私修改)必须实施 CSRF Token 验证,不能仅靠前端校验。
  2. 逐步淘汰纯 Cookie 鉴权,采用 Authorization: Bearer Token 方案(Token 不自动携带,需 JS 显式写入 Header,天然防 CSRF)。
  3. 开启 SameSite=Lax,作为兜底防护。

同源策略解决了"谁能看到"的问题,但"谁能操作"必须由你的后端来回答。别让浏览器的"好意"成为安全架构的盲点。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/8 2:49:43

《Ionic Tab(选项卡)详解与使用指南》

《Ionic Tab(选项卡)详解与使用指南》 引言 在移动应用开发中,选项卡(Tab)是一种常见的界面元素,它可以帮助用户快速切换不同的内容或功能。Ionic框架作为一款流行的前端框架,提供了丰富的组件和工具,其中包括了功能强大的Tab组件。本文将详细解析Ionic Tab的使用方法…

作者头像 李华
网站建设 2026/8/21 14:12:51

用Python批量处理Excel和CSV文件

SQLAlchemy是Python中最流行的ORM&#xff08;对象关系映射&#xff09;框架之一&#xff0c;它提供了高效且灵活的数据库操作方式。本文将介绍如何使用SQLAlchemy ORM进行数据库操作。目录安装SQLAlchemy核心概念连接数据库定义数据模型创建数据库表基本CRUD操作查询数据关系操…

作者头像 李华
网站建设 2026/8/21 14:12:52

C++代码依赖分析

1、非修改序列算法 这些算法不会改变它们所操作的容器中的元素。 1.1 find 和 find_if find(begin, end, value)&#xff1a;查找第一个等于 value 的元素&#xff0c;返回迭代器&#xff08;未找到返回 end&#xff09;。find_if(begin, end, predicate)&#xff1a;查找第…

作者头像 李华
网站建设 2026/8/21 3:05:47

行为型模式:状态模式——嵌入式状态管理的优雅解决方案

嵌入式C开发中&#xff0c;不少人会用“全局状态变量冗长switch-case”管理设备状态&#xff0c;所有逻辑堆砌一处。后续新增低功耗、固件升级等状态时&#xff0c;需修改核心代码&#xff0c;牵一发而动全身&#xff1b;且状态切换依赖全局变量&#xff0c;调试追踪困难&#…

作者头像 李华
网站建设 2026/8/21 4:19:27

【委托监控】【成交监控】

【委托监控】【成交监控】这是一个炒股软件里的短线精灵设置界面&#xff0c;它的作用是帮你实时监控盘口的异常交易行为&#xff0c;让你能快速捕捉主力资金的动向。我给你分模块解释一下&#xff1a;&#x1f539; 顶部&#xff1a;短线精灵置顶这个开关打开后&#xff0c;“…

作者头像 李华
网站建设 2026/8/21 14:12:58

C++中的桥接模式

1、非修改序列算法这些算法不会改变它们所操作的容器中的元素。1.1 find 和 find_iffind(begin, end, value)&#xff1a;查找第一个等于 value 的元素&#xff0c;返回迭代器&#xff08;未找到返回 end&#xff09;。find_if(begin, end, predicate)&#xff1a;查找第一个满…

作者头像 李华