2026/4/14 2:04:12
网站建设
项目流程
房地产手机网站模板,wordpress editor.md,免费下载模板的网站,做渔具最大的外贸网站一个常见的认知误区#xff1a;很多开发者认为浏览器的同源策略#xff08;Same-Origin Policy#xff09;已经阻止了跨域攻击#xff0c;因此忽略了后端对请求来源的校验。然而事实残酷——同源策略只管读#xff0c;不管写。恶意网站完全可以在…一个常见的认知误区很多开发者认为浏览器的同源策略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?tohackeramount10000, { method: POST, // 甚至不需要处理响应... });会发生什么✅ 请求确实发出去了带上了你的 Cookie✅ 银行服务器已经执行了转账钱没了✅ 响应也回到了浏览器你可以在 DevTools 里看到 200 OK❌JS 拿不到响应数据同源策略只拦住了这一步这就是CSRF跨站请求伪造攻击的核心恶意网站不需要知道你的余额它只需要让你的浏览器去执行操作。二、CSRF 攻击实战模拟想象这样一个场景上午 9:00你在银行网站 bank.com 登录浏览器保存了 Session Cookie。上午 10:00你没关浏览器打开了钓鱼邮件里的链接 evil.com。evil.com 的 HTML极其简单甚至不需要 JShtmlbody h1精美壁纸下载中.../h1 !-- 图片自动加载触发 GET 请求 -- img srchttps://bank.com/transfer?toattackeramount50000 width0 height0 / !-- 或者自动提交的表单 -- form idcsrf actionhttps://bank.com/change-email methodPOST input typehidden nameemail valuehackerevil.com / /form scriptdocument.getElementById(csrf).submit();/script /body结果你的银行卡转账 5 万元或者绑定邮箱被改成了黑客的。整个过程不需要 JavaScript 读取任何返回数据同源策略对此完全无能为力。三、后端校验守护最后一道防线既然浏览器靠不住服务端必须承担校验责任。目前业界主流的防御方案有三层1. CSRF Token最经典可靠原理在表单或请求头中嵌入一个随机生成的、只有服务器和当前页面知道的 Token。html!-- 银行页面渲染时生成随机 Token -- form action/transfer methodPOST input typehidden namecsrf_token valuedW5pcXVlLWhhc2gtdmFsdWU / input nameamount value1000 / button转账/button /formjava// 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 属性让浏览器不在跨域请求中携带敏感 CookiehttpSet-Cookie: sessionIdabc123; SameSiteStrict; HttpOnly; SecureSameSiteStrict完全禁止第三方 Cookie最安全但可能影响从微信/邮件点击链接的体验SameSiteLax允许顶级导航如 a 标签跳转携带 Cookie但阻止 POST/PUT 等危险操作推荐折中方案3. Origin/Referer 校验请求来源验证检查 HTTP Header 中的来源信息javaPostMapping(/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 防护坏人能盲打执行高危操作转账、改密即使你收不到回执。给开发者的建议高风险操作资金、隐私修改必须实施 CSRF Token 验证不能仅靠前端校验。逐步淘汰纯 Cookie 鉴权采用 Authorization: Bearer Token 方案Token 不自动携带需 JS 显式写入 Header天然防 CSRF。开启 SameSiteLax作为兜底防护。同源策略解决了谁能看到的问题但谁能操作必须由你的后端来回答。别让浏览器的好意成为安全架构的盲点。