前端XSS与XSRF攻击与防范

本文深入解析了XSS和CSRF两种常见的网络安全攻击方式,详细阐述了这两种攻击的原理、实施过程及防范措施。文章指出,XSS攻击主要通过注入恶意脚本来窃取用户信息,而CSRF则利用已登录用户的身份进行非法操作。文中还提供了多种防御策略,如转义字符、设置http-only cookie、使用same-site属性、验证码和token机制。


XSS攻击:只要输入的JS在页面中以不符合开发者的预期进行运行都属于XSS攻击。例如:文本框输入、URL输入等
XSS攻击防范:
1.通过转义来解决,使得<script>的"<"或">"转义为其它符号,显示时再由其它符号变回原状。
2.XSS攻击很大程度上是为了获取cookie以盗取登录状态,可以在服务端设置cookie参数http-only使得客户端无法读取cookie

CSRF攻击:跨域站点伪造
概念:↓

1.GET攻击

用户Alice登录访问某有CSRF漏洞的银行网站 http://www.examplebank.com。
Alice被某些信息诱导访问危险网站B。
危险网站B上有一个<img>标签<img src="http://www.examplebank.com/from=Alice&amount=100&to=Bob">
这个img标签的src不指向图片,而是一个http请求,这个请求让银行服务器从Alice转100到Bob账户上,由于Alice已经登录,浏览器发请求时候会带上cookie骗取服务器信任得到响应。
这样Alice的钱就被悄悄转走了。

2.POST攻击

危险网站伪造一个隐藏的表单,在onload事件中,触发表单的提交事件。 
为防止form表单跳转,请参考 https://www.jianshu.com/p/75c782eddd80

为了对CSRF进行防范,首先需要知道攻击场景的特点:
1.B网站向A网站请求
2.带A网站Cookies,但是B拿不到cookie,也看不到cookie内容
3.不访问A网站前端
4.referer为B网站

1.禁止第三方网站带Cookies
same-site属性:Strict,Lax 关于same-site的文档:https://www.ruanyifeng.com/blog/2019/09/cookie-samesite.html
后端设置:header('Set-Cookie: test=12345; SameSite=Lax')
缺点:兼容性,使用之前可以上caniuse查询支持

2.验证码(针对攻击场景第三条)
B不访问A网站前端,所以在A前端页面加入随机验证码来识别请求是不是用户主动发起的。B网站无法伪造一个完整请求。
node中ccap模块可以生成验证码:npm install ccap
优点:简单粗暴,低成本,可靠。
缺点:用户不友好。每次都要填,验证码输入错误要重填。

3.检查网页来源(针对攻击场景第四条)
referer是HTTP请求头,包含请求来源地址。【正确单词是referrer,但是规范中就是错的】
服务器验证referer并禁止来自第三方网站的请求。
后端参数由req.headers.referer拿到。
需要注意的是,file本地协议访问和http协议访问有点不一样,不会发送referer。
不考虑边界情况的基础防范:
if(/^https?:\/\/localhost/.test(referer)){
    throw new Error('非法请求'); 返回403提示等错误处理
}

缺点:Referer值会记录访问来源,有些用户认为侵犯自己隐私权,有些用户可能会开启浏览器防止跟踪功能,不提供Referer,导致正常用户请求被拒绝。 

4.可读取cookie
提交表单数据时,前端需要再次输入用户密码,后端通过后返回一个可读cookie,此时前端提交表单,并但上此cookie的值

5.token
登录成功后,后端返回一个token。下次前端提交表单时,必须带上这个token


 

JSON Web Token (JWT) 本身并不直接提供对 **CSRF(Cross-Site Request Forgery,跨站请求伪造)** 的防护机制。因此在使用 JWT 进行身份验证时,尤其是将 `refresh token` 存储在 Cookie 中的情况下,需要采取额外的措施来防范 CSRF 攻击。 --- ## ✅ 防范 CSRF 的核心策略 ### 1. 使用 `SameSite=Strict/Lax` Cookie 属性 这是最有效的前端级防御方式之一。 ```http Set-Cookie: refreshToken=abc123; HttpOnly; Secure; SameSite=Strict ``` - `SameSite=Strict`:仅允许同源请求携带 cookie。 - `SameSite=Lax`:允许部分安全的跨站请求(如 GET 形式的导航),但阻止 POST 请求等敏感操作。 ✅ 建议使用 `SameSite=Strict` 或 `Lax` 来防止第三方网站发起的请求携带你的 cookie。 --- ### 2. 使用 `HttpOnly` + `Secure` Cookie 属性 - `HttpOnly`: 禁止 JavaScript 读取 Cookie,防止 XSS 注入窃取 token。 - `Secure`: 只能在 HTTPS 下传输 Cookie。 ```javascript res.cookie('refreshToken', refreshToken, { httpOnly: true, secure: true, // 仅通过 HTTPS 传输 sameSite: 'strict', maxAge: 7 * 24 * 60 * 60 * 1000 }); ``` --- ### 3. 使用 Anti-CSRF Token(双重提交 Cookie 模式) 即使你使用了 JWT,也可以引入一个额外的 anti-CSRF token: #### 实现流程: 1. 登录成功后,服务端生成一个随机字符串作为 `csrfToken`。 2. 将该 token 同时写入 Cookie 和响应体中。 3. 前端在每次请求头中带上这个 `csrfToken`。 4. 后端校验请求头中的 token 是否 Cookie 中的一致。 #### 示例代码: ##### Node.js 后端设置 CSRF Token: ```javascript const csrf = require('csurf'); const cookieParser = require('cookie-parser'); app.use(cookieParser()); app.use(csrf({ cookie: true })); app.get('/csrf-token', (req, res) => { res.json({ csrfToken: req.csrfToken() }); }); ``` ##### 前端请求示例: ```javascript fetch('/csrf-token') .then(res => res.json()) .then(data => { fetch('/protected-api', { method: 'POST', headers: { 'Content-Type': 'application/json', 'XSRF-Token': data.csrfToken }, credentials: 'include' }); }); ``` > 注意:`XSRF-Token` 是 Angular 默认使用的 header 名称,也可自定义为 `X-CSRF-Token`。 --- ### 4. 使用 JWT 在 Header 中传递(避免 Cookie) 如果你完全不使用 Cookie 来存储 token(比如只用 `localStorage`),那么就不会受到 CSRF 攻击影响,因为浏览器不会自动附加这些 token。此时只需要注意防范 XSS 即可。 --- ### 5. 设置 CORS 白名单 确保你的后端设置了严格的 CORS 策略,防止未知来源的请求访问接口。 ```javascript const cors = require('cors'); app.use(cors({ origin: 'https://your-frontend.com', credentials: true })); ``` --- ## ✅ 总结:JWT 如何防范 CSRF? | 方法 | 描述 | 安全性 | |------|------|--------| | `SameSite` Cookie | 防止跨站请求自动携带 Cookie | 高 | | `HttpOnly` + `Secure` Cookie | 防止 XSS、仅 HTTPS 传输 | 高 | | Anti-CSRF Token(双重提交) | 显式比对 token | 高 | | 不使用 Cookie,使用 Header 存储 JWT | 避免 CSRF,需防 XSS | 高 | | 设置 CORS 白名单 | 控制请求来源 | 中 | --- ##
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值