目录
跨站脚本(XSS)、跨站请求伪造(CSRF)、分布式拒绝服务(DDoS)攻击原理与防护指南
[1. 跨站脚本攻击(XSS, Cross-Site Scripting)](#1. 跨站脚本攻击(XSS, Cross-Site Scripting))
[1.2 攻击分类](#1.2 攻击分类)
[1.3 XSS可执行的恶意行为包括:](#1.3 XSS可执行的恶意行为包括:)
[2. 跨站请求伪造(CSRF, Cross-Site Request Forgery)](#2. 跨站请求伪造(CSRF, Cross-Site Request Forgery))
[2.1 核心原理](#2.1 核心原理)
[2.2 攻击成立的 3 个必要条件(面试必答)](#2.2 攻击成立的 3 个必要条件(面试必答))
[3. 分布式拒绝服务攻击(DDoS, Distributed Denial of Service)](#3. 分布式拒绝服务攻击(DDoS, Distributed Denial of Service))
[3.2 DDoS 攻击分类(面试高频)](#3.2 DDoS 攻击分类(面试高频))
[1. XSS 防护(前端 + 服务端双重防护)](#1. XSS 防护(前端 + 服务端双重防护))
[1.2 具体实现](#1.2 具体实现)
[2. CSRF 防护(服务端核心防护)](#2. CSRF 防护(服务端核心防护))
[2.2 具体实现](#2.2 具体实现)
[3. DDoS 防护(需运维 + 开发 + 云厂商配合)](#3. DDoS 防护(需运维 + 开发 + 云厂商配合))
[3.1 核心原则:分层防护、流量清洗、限流降级,无法完全杜绝,只能降低影响。](#3.1 核心原则:分层防护、流量清洗、限流降级,无法完全杜绝,只能降低影响。)
[3.2 具体实现](#3.2 具体实现)
[1. XSS 相关](#1. XSS 相关)
[2. CSRF 相关](#2. CSRF 相关)
[3. DDoS 相关](#3. DDoS 相关)
开始新篇章前,让我们先回顾一下之前学的知识:
易混淆:Cookie 是请求头中的一个字段,是存储载体,不是凭证本身。Token 和sessionId(UUID)才是身份凭证。Token既可以放在Authorization 请求头,也可以存在Cookie 里。
明确HTTP报文结构:
# 请求行:请求方法、请求路径+资源、HTTP协议版本
GET /api/user HTTP/1.1
# 请求头(附加信息)
Host: xxx.com #访问的域名
User-Agent: Chrome/120.0.0.0 # 客户端的类型
Accept: application/json # 接受JSON响应
➡️ Cookie: sessionId=UUID-123-456; token=eyJhb...; name=zhangsan #自动带的凭证
➡️ Authorization: Bearer eyJhb... # 手动带的凭证
# 请求体(GET请求通常为空,POST/PUT会有)
# (空)
跨站脚本(XSS)、跨站请求伪造(CSRF)、分布式拒绝服务(DDoS)攻击原理与防护指南
一、概念与攻击原理
1. 跨站脚本攻击(XSS, Cross-Site Scripting)
1.1 官方定义与本质:XSS是代码注入类攻击 ,攻击者将恶意JS代码注入到目标网站的可输出内容中,当普通用户访问该网站时,恶意代码会在用户浏览器中执行。其本质是网站对用户输入的内容未做有效过滤 / 转义,导致不可信代码被当作可信代码执行。
1.2 攻击分类
| 类型 | 触发场景 | 典型案例 | 危害程度 |
|---|---|---|---|
| 存储型 XSS | 恶意代码被永久存储在服务器(数据库 / 文件),所有访问该页面的用户都会触发 | 论坛发帖、评论区、用户资料填写时注入<script>偷Cookie()</script> |
高(影响所有访问者) |
| 反射型 XSS | 恶意代码通过URL参数传递,服务器仅 "反射" 回页面,仅触发该URL的用户受影响 | 钓鱼链接:https://xxx.com/search?key=<script>偷Cookie()</script> |
中(需诱导用户点击) |
| DOM 型 XSS | 恶意代码仅在客户端DOM层面执行,不经过服务器处理 | 前端通过location.hash获取参数并直接用innerHTML渲染 |
中(仅客户端执行) |
1.3 XSS可执行的恶意行为包括:
模拟用户操作(如点击按钮、提交表单);劫持用户会话(利用 Cookie 登录后操作账户);弹窗钓鱼(伪造登录框窃取账号密码);挖矿 / 下载恶意软件等。
小问题:什么是反射型 XSS?它和钓鱼有什么区别?
反射型 XSS 是攻击者构造包含恶意脚本的 URL,用户点击后,服务器将脚本 "反射" 回页面执行,属于代码注入攻击 ,发生在真实域名 下。钓鱼欺诈的目的是骗取账号密码,可以在假网站,也可以通过 XSS 在真网站上实现。XSS 是手段,钓鱼是目的。
2. 跨站请求伪造(CSRF, Cross-Site Request Forgery)
2.1 核心原理
攻击者诱导用户在已登录目标网站 的状态下,访问攻击者控制的第三方页面,该页面通过<form>/<img>/AJAX 等方式向目标网站发送请求。由于浏览器会自动携带目标网站的 Cookie,服务器若仅通过 Cookie 验证身份,会误以为是用户主动发起的请求,从而执行非用户意愿的操作。
2.2 攻击成立的 3 个必要条件(面试必答)
- 用户已登录目标网站,且Cookie 未过期;
- 目标网站的核心操作(如转账、改密码)仅通过Cookie验证身份;
- 攻击者能构造出完整的恶意请求(知道请求 URL、参数、方法)。
典型攻击场景:
银行转账:攻击者页面构造
<form action="https://bank.com/transfer" method="POST"><input name="to" value="攻击者账号"><input name="money" value="10000"></form><script>document.forms[0].submit()</script>;改密码:构造修改密码的 POST 请求,诱导用户点击。
小问题:为什么CSRF攻击能成功?浏览器做了什么 "坏事"?
CSRF 之所以能成功,是因为:浏览器对表单、img、iframe 等简单跨域请求不拦截;浏览器自动携带目标网站Cookie;服务端只验证 Cookie,不验证来源;同源策略不防护这类请求。
回顾:同源策略只拦一件事:前端 JS 从跨域接口拿数据 。它不拦 你发请求,只拦你读返回结果。
小问题:如果一个网站同时存在 XSS 漏洞,那它的 CSRF 防护还有用吗?为什么?
如果网站存在 XSS 漏洞,攻击者可以通过注入的脚本,在当前域名下直接读取 CSRF Token ,然后构造携带正确 Token 的请求。所以 XSS 一旦存在,CSRF 防护基本形同虚设。
详述:
CSRF 防护靠的是:1.页面里有一个 token;攻击者拿不到;所以请求伪造不了;
2.但一旦有 XSS :攻击者的 JS 在当前域名执行 ;可以直接:读取表单里的 csrf token、localStorage 里的 token和meta 里的 token,然后带着正确 token 发请求。
3. 分布式拒绝服务攻击(DDoS, Distributed Denial of Service)
3.1 核心原理:攻击者控制大量 "肉鸡"(被入侵的设备,如个人电脑、物联网设备),向目标服务器发送海量无效请求,耗尽服务器的网络带宽、CPU、内存等资源,导致合法用户无法访问服务。
3.2 DDoS 攻击分类(面试高频)
| 攻击类型 | 攻击方式 | 目标资源 |
|---|---|---|
| 流量型(层 3/4) | 发送海量 UDP/TCP 数据包(如 SYN Flood、ICMP Flood) | 服务器带宽、网络设备 |
| 资源耗尽型(层 7),应用层攻击 | 发送大量合法但复杂的 HTTP 请求(如 GET /api/heavy);针对特定应用漏洞发起请求(如 CC 攻击)。CC攻击指的是攻击者模拟大量用户访问网站页面,造成服务器瘫痪。 | 服务器 CPU、内存、数据库连接,应用服务进程 |
二、防护方案
1. XSS 防护(前端 + 服务端双重防护)
1.1 核心原则:所有用户输入的内容,在输出到页面时必须做转义处理(不信任任何用户输入)。
1.2 具体实现
| 防护手段 | 适用场景 | 实现方式 |
|---|---|---|
| 输入验证 | 所有用户输入(表单、URL 参数) | 服务端校验数据格式(如手机号、邮箱),拒绝包含<script>、onclick等危险字符的输入 |
| 输出转义 | 渲染用户输入到页面时 | 前端:避免使用innerHTML/outerHTML,优先用textContent;服务端:对输出内容做 HTML 转义(如<转<,>转>,"转") |
| URL 参数转义 | 处理 URL 参数时 | 前端用encodeURIComponent()(而非encodeURI)转义参数,如:const url = '/search?key=' + encodeURIComponent(userInput) |
| CSP(内容安全策略) | 全局防护 | 服务端返回Content-Security-Policy响应头,限制脚本加载源(如default-src 'self',仅允许加载同域资源),禁止内联脚本执行 |
| HttpOnly + Secure Cookie | 防止 Cookie 被盗 | 给 Cookie 设置HttpOnly(禁止 JS 读取)、Secure(仅 HTTPS 传输)、SameSite(限制跨域携带Cookie) |
2. CSRF 防护(服务端核心防护)
2.1 核心原则:让请求携带一个攻击者无法获取的 "随机凭证",仅验证 Cookie 不足以防御。
2.2 具体实现
| 防护手段 | 适用场景 | 实现方式 |
|---|---|---|
| CSRF Token | 所有状态变更请求(POST/PUT/DELETE) | 1. 服务端为每个用户会话生成唯一 Token,存储在 Session 或 Cookie(HttpOnly)中;2. 前端请求时,从页面隐藏域 / 本地存储中获取 Token,放在请求头(如X-CSRF-Token)或请求参数中;3. 服务端验证Token 与Session 中的 Token 是否一致; 注意:Token 不能仅放在Cookie 中(攻击者可利用 Cookie 自动携带) |
| SameSite Cookie | 通用防护 | 给 Cookie 设置SameSite=Lax/Strict:Strict:完全禁止跨域携带 Cookie;Lax:允许 GET 请求跨域携带(兼容正常业务) |
| 验证请求来源 | 辅助防护 | 服务端验证Origin/Referer请求头,仅允许**白名单域名(允许通行的域名)**的请求 |
| 验证码 / 密码验证 | 高风险操作 | 转账、改密码等操作,除Token 外,额外要求输入验证码或密码 |
3. DDoS 防护(需运维 + 开发 + 云厂商配合)
3.1 核心原则:分层防护、流量清洗、限流降级,无法完全杜绝,只能降低影响。
3.2 具体实现
| 防护层级 | 防护手段 | 实现方式 |
|---|---|---|
| 网络层(云厂商) | 流量清洗 / 高防 IP | 接入云厂商高防服务(如阿里云高防、腾讯云大禹),由高防节点过滤恶意流量,仅转发合法流量到源站 |
| 应用层(开发) | 接口限流 | 1. 单 IP / 用户限流 :如express-rate-limit限制单 IP 每分钟最多 100 次请求;2. 接口分级限流 :核心接口(如登录、下单)更严格;3. 熔断降级:流量超过阈值时,返回友好提示(如 "系统繁忙"),停止执行非核心逻辑 |
| 基础设施(运维) | 带宽扩容 / 负载均衡 | 1. 扩容服务器带宽,避免带宽被打满;2. 部署负载均衡(Nginx/LB),分散流量到多台服务器;3. 禁用不必要的端口 / 协议(如关闭未使用的UDP端口,限制ICMP包。ICMP:互联网控制报文协议) |
| 监控告警 | 实时监控 | 监控服务器CPU、内存、带宽、请求量,异常时自动告警并触发限流策略 |
ICMP和IP以及TCP/UDP的区分:
IP(网际协议):底层送信(寻址+路由转发)
TCP(传输控制协议)/UDP(用户数据报协议):传用户数据(网页、文件、视频)
ICMP:控制、诊断、报错,不经过端口.(网络世界的信使和报错员)
三、高频问题(侧重理解与落地)
1. XSS 相关
- 请说明存储型 XSS 和反射型 XSS 的区别,以及你在项目中是如何防护的?
- 为什么说仅用前端转义无法完全防御 XSS?服务端需要做什么?
- CSP 的作用是什么?请写出一个限制仅加载同域资源、禁止内联脚本的 CSP 响应头配置。
- HttpOnly Cookie 能防御所有 XSS 吗?为什么?
对于上述问题,建议大家先自行思考,将思路顺下来,再看完善版回答:
1. 存储型 XSS 和反射型 XSS 的区别,以及项目中的防护措施
区别:
存储型 XSS(持久型 XSS):恶意代码会被永久存储在服务端(如数据库、缓存、文件),所有访问该页面的用户都会触发攻击。比如攻击者在评论区发布含恶意脚本的内容,所有查看该评论的用户都会被攻击,攻击范围广、危害大。
反射型 XSS(非持久型 XSS):恶意代码存在于 URL 中,只有用户点击特制的钓鱼链接时,服务端将 URL 中的恶意代码 "反射" 回页面执行,仅针对点击链接的单个用户,攻击范围小、一次性。
项目防护措施(具体落地):
-
输入层:对所有用户输入(如评论、昵称、上传内容)做严格的输入验证,仅允许合法字符(如字母、数字),拒绝
<script>、onclick等危险标签 / 属性; -
输出层:对所有从服务端渲染到页面的内容做统一转义(如把
<转成<,>转成>),确保恶意代码以文本形式展示而非执行; -
安全策略:配置 CSP(内容安全策略)禁止内联脚本、禁止加载未知域的资源;
-
Cookie 防护:给敏感 Cookie(如登录态)设置 HttpOnly 和 Secure 属性,防止 JS 窃取;
-
统一过滤:使用成熟的过滤库(如 Java 的 ESAPI、Python 的 bleach),避免手写过滤规则遗漏漏洞。
2. 为什么仅用前端转义无法完全防御 XSS?服务端需要做什么?
前端转义的局限性:
-
**前端逻辑可被绕过:**攻击者可通过修改前端代码(如禁用转义函数)、劫持前端 JS 执行流程,直接跳过前端转义;
-
多端场景覆盖不全:若项目有多个端(如 H5、APP、小程序),前端转义规则难以统一,容易出现遗漏;
-
HTTP 直接请求:攻击者可绕过前端页面,直接通过 Postman 等工具发送含恶意代码的请求到服务端,前端转义完全失效。
服务端必须做的防护:
-
核心:输出转义(不可替代):服务端对所有要渲染到页面的内容做统一转义,这是防御 XSS 的核心(前端转义仅作为辅助);
-
输入验证 / 过滤:基于白名单验证输入(而非黑名单),拒绝危险字符 / 标签;
-
统一渲染层处理:在模板引擎(如 Thymeleaf、Vue SSR)中开启自动转义功能;
-
校验请求来源:结合 Referer/CORS 限制非法请求,减少恶意请求提交;
-
定期安全扫描:通过工具检测服务端输出的内容是否存在未转义的危险代码。
3. CSP 的作用是什么?写出限制仅加载同域资源、禁止内联脚本的 CSP 响应头配置
CSP 作用:
CSP(Content Security Policy,内容安全策略)是服务端通过响应头配置的安全机制,核心是限制页面可以加载的资源(脚本、样式、图片等)来源,以及是否允许执行内联脚本 /eval 等危险操作,从全局层面阻断 XSS 攻击(即使恶意代码注入,也会被 CSP 禁止执行)。
符合要求的 CSP 响应头配置:
javascript
Content-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self'; object-src 'none'; base-uri 'self';
default-src 'self':默认所有资源仅允许加载同域(self代表当前域名);
script-src 'self':脚本仅允许加载同域,禁止内联脚本(如<script>alert(1)</script>)和 eval;
style-src 'self':样式仅允许加载同域;
object-src 'none':禁止加载插件(如 flash),减少攻击面;
base-uri 'self':限制 base 标签的域名,防止篡改资源路径。
4. HttpOnly Cookie 能防御所有 XSS 吗?为什么?
不能。原因如下:
-
HttpOnly 的核心作用:仅禁止前端 JS 读取 Cookie(如
document.cookie),无法防御 XSS 导致的其他危害(如页面篡改、数据泄露)。 -
攻击者的绕过方式:
-
即使无法读取 Cookie,攻击者可通过 XSS 执行恶意脚本,直接利用当前用户的登录态发起请求(如模拟用户提交表单、转账、修改密码),无需读取 Cookie;
-
若攻击目标不是 Cookie(如窃取页面敏感数据、劫持用户操作),HttpOnly 完全无效;
-
核心点:
-
XSS 防御核心:服务端输出转义是基础,CSP 是兜底,HttpOnly 是 Cookie 专项防护,三者缺一不可;
-
前端转义的定位:仅作为辅助,服务端必须做统一的输入验证和输出转义;
-
HttpOnly 局限性:只防 Cookie 读取,不防 XSS 攻击本身,也不防利用登录态的操作型攻击。
2. CSRF 相关
- CSRF 攻击的核心条件是什么?为什么 GET 请求也可能触发 CSRF?
- CSRF Token 和 XSS Token 有什么区别?为什么 CSRF Token 不能只存在 Cookie 中?
- SameSite Cookie 的三个值(Strict/Lax/None)分别是什么含义?在项目中你会怎么选择?
- 请描述你项目中 CSRF 防护的完整流程(从 Token 生成到验证)。
1. CSRF 攻击的核心条件是什么?为什么 GET 请求也可能触发 CSRF?
CSRF 攻击的核心条件(3 个缺一不可):
-
用户已登录目标网站:目标网站通过 Cookie 等方式保存了用户的登录态 ,且登录态未过期;
-
请求可被伪造:目标网站的核心操作(如转账、改密码)仅通过 Cookie 验证身份,无需额外的用户交互(如输入验证码);
-
用户访问了恶意页面:用户在登录目标网站的前提下,点击 / 访问了攻击者构造的恶意页面,该页面会自动向目标网站发送请求。
GET 请求可能触发 CSRF 的原因:
HTTP 规范中,GET 请求本应仅用于 "获取数据",但很多网站违规将有状态变更的操作 (如删除数据、修改信息)通过 GET 请求实现(如
https://xxx.com/delete?id=123);攻击者可通过
<img src="https://xxx.com/delete?id=123">、<a href="xxx">等标签,让浏览器自动发送 GET 请求,且请求会默认携带目标网站的 Cookie;即使是合规的 GET 请求,若涉及敏感数据查询(如
https://xxx.com/getUserInfo),也可能被攻击者利用 CSRF 窃取信息。
- CSRF Token 和 XSS Token(一般指 JWT / 登录 Token)有什么区别?为什么 CSRF Token 不能只存在于 Cookie 中?
两者核心区别:
| 维度 | CSRF Token(一次性的) | XSS Token(登录态 Token,如 JWT) |
|---|---|---|
| 核心目的 | 验证请求是 "用户主动发起" | 验证用户 "已登录 / 有权限" |
| 传递方式 | 需手动携带(如请求参数、请求头) | 常存在 Cookie 或 Authorization 头 |
| 验证逻辑 | 服务端对比 "请求携带的 Token" 和 "用户会话中存储的 Token" | 服务端验证 Token 签名 / 有效期 |
| 防御目标 | 防 CSRF(跨站伪造请求) | 防未授权访问(如未登录操作) |
CSRF Token 不能只存在 Cookie 中的原因:
-
CSRF 攻击的核心就是 "浏览器自动携带 Cookie",若 Token 仅存在 Cookie 中,攻击者构造的恶意请求会自动带上该 Cookie,Token 完全失去验证作用;
-
必须让 Token 脱离 Cookie 传递(如放在请求体、请求头、页面隐藏域),才能确保请求是 "用户在目标网站主动操作发起",而非跨站伪造。
- SameSite Cookie 的三个值(Strict/Lax/None)分别是什么含义?在项目中你会怎么选择?
三个值的核心含义:
| 值 | 核心规则 | 适用场景 |
|---|---|---|
| Strict | 严格模式:任何跨域请求都不会携带该 Cookie(包括同站不同子域) | 高敏感操作(如转账、改密码) |
| Lax | 宽松模式:1. 禁止跨域 POST/PUT/DELETE 等修改类请求携带 Cookie;2. 允许跨域 GET 请求(如链接跳转、表单提交)携带 Cookie | 普通业务页面(如商品详情、文章跳转) |
| None | 无限制:允许所有跨域请求携带 Cookie;注意:必须同时设置 Secure 属性(仅 HTTPS 传输),否则配置无效 |
跨域业务(如第三方登录、多域名统一登录) |
项目中的选择策略:
-
核心原则:按 "业务敏感度" 分级配置,而非全量用 Strict/Lax;
-
具体选择:
-
登录态 Cookie、支付 / 改密码等敏感操作的 Cookie:设置
SameSite=Lax+Secure+HttpOnly;既避免跨域 POST 请求伪造(防御 CSRF),又兼容正常的跨域 GET 跳转(如你项目中的navigate("")页面跳转),无需重新登录; -
高敏感操作(如资金相关):临时切换为
SameSite=Strict,操作完成后恢复 Lax; -
跨域接口调用(如对接第三方):仅对该接口专用的 Cookie 设置
SameSite=None+Secure,并限制接口域名白名单。
-
-
描述项目中 CSRF 防护的完整流程(从 Token 生成到验证)
以我负责的......项目为例,完整流程如下:
步骤 1:Token 生成(用户首次访问 / 登录时)
服务端为当前用户会话(Session)生成唯一、随机、不可预测的 CSRF Token(如 32 位随机字符串);
存储:将 Token 存入服务端 Session(核心),同时将 Token 渲染到页面的隐藏域(如
<input type="hidden" name="csrfToken" value="xxx">)/内存中,不存入 Cookie/LocalStorage(避免 XSS 窃取);兜底:若为前后端分离项目,通过接口返回 Token,前端存储在内存中(而非 LocalStorage。因为:内存是临时的,LocalStorage是永久的),每次请求前从内存读取。
步骤 2:Token 传递(用户发起请求时)
前端在发起非 GET 请求(如提交表单、修改数据)时,从隐藏域 / 内存中读取 CSRF Token;
将 Token 携带在请求头 (如
X-CSRF-Token: xxx)或请求体中(优先请求头,避免 URL 泄露);GET 请求仅用于查询数据,不做任何状态变更,无需携带 Token。
步骤 3:服务端验证(核心)
先验来源 :验证请求头
Origin/Referer,仅放行白名单内的域名(如项目的主域名、可信子域名);再验Token:
从 Session 中取出该用户的 CSRF Token;
对比请求头 / 请求体中的 Token 与 Session 中的 Token 是否一致;
验证通过则处理请求,不通过则直接返回 403 错误;
兜底防护:
给登录态 Cookie 设置
SameSite=Lax+HttpOnly+Secure;对所有修改类请求(POST/PUT/DELETE)强制验证 Token,GET 请求仅做来源校验。
步骤 4:Token 失效 / 刷新
用户登出时,清空 Session 中的 CSRF Token;
Token 有效期与 Session 一致(如 2 小时),超时自动失效;
敏感操作(如支付)后,主动刷新 Token,避免重复使用。
关键点:
-
CSRF 防御核心:Token 需 "服务端存储 + 前端手动携带 + 服务端验证",且 Token 不能仅存在 Cookie 中;
-
SameSite 选择:按业务敏感度分级,Lax 是兼顾安全与体验的最优解,Strict 仅用于高敏感操作;
-
完整防护流程:来源校验(Origin/Referer)+ Token 验证 + SameSite Cookie 兜底,三者结合才能全面防御 CSRF。
3. DDoS 相关
- DDoS 和 DoS 的区别是什么?应用层 DDoS(如 CC 攻击)和流量型 DDoS 的防护方式有什么不同?
- 作为前端 / 全栈开发,你能做哪些事情来辅助防御 DDoS?
- 接口限流的实现思路是什么?如何避免限流策略影响合法用户?
1. 应用层 DDoS(CC 攻击)与流量型 DDoS 的防护区别
核心思路 :两者攻击层面不同,所以防御手段完全不在一个维度。CC 攻的是 "应用逻辑",流量型攻的是 "网络带宽"。
1)应用层 DDoS(CC 攻击)防御:攻击本质 :攻击者利用少量代理机或爬虫,模拟正常用户高频发送 HTTP 请求(如疯狂刷新接口、提交表单)。它消耗的是服务器的 CPU、内存、数据库连接 ,而不是带宽。防御核心 :认得出、挡得住、降得住。
- 接入层限流:在 Nginx / 网关层限制单 IP 或单用户的 QPS(每秒请求数)。例如,限制单个 IP 每分钟最多 100 次请求,超过则直接返回 429 错误。
- 人机验证 :在关键接口(登录、注册、秒杀)前增加验证码、滑块、短信验证。这是最有效的防御,因为自动化脚本很难通过验证。
- 行为分析:识别异常请求头(User-Agent)、Referer 或 Cookie。如果某个 IP 瞬间发起大量无状态请求,直接拉入黑名单。
- 降级与熔断:当检测到服务负载过高时,自动关闭非核心接口(如实时推荐、排行榜),返回静态缓存页面,优先保障核心业务(如登录、下单)可用。
2)流量型 DDoS(四层 / 网络层)防御:攻击本质: 攻击者利用僵尸网络,发送海量的 UDP/TCP 数据包(如 SYN Flood、UDP Flood)。它目的是打满服务器带宽 或耗尽网络连接资源,导致服务器无法响应正常请求。防御核心 :清流量、找源头、抗大流量。
- 黑洞路由(Blackhole):在运营商层面识别攻击流量,直接将攻击流量丢弃(黑洞),不转发给服务器。
- 高防 IP(Anti-DDoS)+流量清洗:将业务域名解析到高防 IP 上。在高防节点识别并清洗恶意数据包(如异常的 TCP 包、伪造的 IP 包),只将正常业务流量和合法流量回源到服务器上。
- 带宽扩容:购买更大的机房带宽,通过 "硬抗" 的方式承受大流量攻击。
2. 前端 / 全栈开发辅助防御 DDoS 的具体措施
前端三层防御体系:
第一层:前端行为控制(减少请求发出)
这是成本最低、效果最好的防御。
请求节流(Throttling)与防抖(Debouncing):针对搜索框、点赞、按钮点击等操作,限制单位时间内的请求次数。防止用户误点或恶意脚本疯狂发包。
静态资源 CDN 化:将图片、JS、CSS 等静态资源部署到 CDN。CDN 节点遍布全国,能承载巨大的访问流量,从而分流源站压力,保护后端接口。
资源懒加载 & 按需加载:图片懒加载、路由懒加载。避免一次性加载过多资源导致瞬间带宽打满,或者一次性请求大量数据耗尽服务器内存。
第二层:Node.js 中间层防护(全栈能力)
作为全栈开发,你可以在服务网关层做前置处理。
请求合并与缓存:将多个小请求合并为一个大请求(Batch Request),减少连接数。利用 Redis 缓存热点数据,避免重复请求穿透到数据库。
非法请求拦截:在 Node 层对请求体进行校验,过滤掉恶意的大 Body 或非法参数,防止恶意请求消耗服务器内存。
IP 限速:在 Node 层实现简单的速率限制(Rate Limit),对过快的 IP 临时拒绝服务。
第三层:前端安全策略(增强身份验证)
接入合法用户池:通过前端鉴权,确保只有登录用户或合法设备才能发起请求。对于未登录态的匿名请求,限制其请求频率,防止攻击者匿名刷量。
前端监控与报警:通过监控前端页面的加载状态、接口响应时间,当发现页面加载异常(如网堵、服务挂了)时,及时给出友好提示并停止重试请求,避免用户端不断重试加剧服务器压力。
3. 接口限流实现思路 + 如何避免影响合法用户
思路 :限流是把双刃剑。既要挡住攻击者,又要保护正常用户。需要从算法策略 和业务策略两方面入手。
1)接口限流的实现思路(技术层)
基于存储的限流(分布式 / 全局):
利用 Redis 缓存。使用
INCR命令计数,配合EXPIRE设置过期时间。常用算法:
计数器法:简单粗暴,如 1 分钟内超过 1000 次就拒绝。
滑动窗口:解决计数器法的 "临界问题"(比如 59 秒和 01 秒同时爆发),更平滑。
令牌桶 / 漏桶算法 :令牌桶 更适合前端 / 全栈场景。以固定速率往桶里放令牌,请求获取令牌才能通行。它允许一定程度的突发流量(桶内有缓存令牌),更符合合法用户的行为习惯。
分层限流(业务层):
IP 限流:限制单 IP 访问频率(防爬虫 / 肉鸡)。
用户级限流:根据 UserID 或 Token 限流(针对登录用户)。
接口级限流:不同接口不同阈值。核心接口(如支付)限流极严,非核心接口(如获取文章列表)可以宽松。
2) 如何避免限流策略影响合法用户?
这是重点,看你是否懂得权衡。
白名单机制(最重要):
设置服务白名单:内网接口、后台管理系统的 IP 或 Token 完全不限流,保证内部运维不受影响。
设置核心用户白名单:VIP 用户或重要客户不受限流影响。
分级限流策略(软硬兼施):
软限流 :当流量达到阈值 80% 时,不直接拒绝,而是延迟响应(Retry-After)或降低服务质量(降级),给用户提示 "系统繁忙,请稍后重试",而非报错。
硬限流:仅在流量过载时触发硬拒绝。
动态阈值与智能扩容:
不要写死代码。根据服务器 CPU 负载、内存使用率动态调整限流阈值。负载低时放宽,负载高时收紧。
对于多节点部署 的服务,使用分布式锁(如 Redis Lock) 或全局限流算法,防止单机限流导致的流量不均。
用户体验优化(Retry 机制):
- 前端在收到限流响应(HTTP 429)时,使用指数退避算法(Exponential Backoff)进行重试,而不是疯狂重试。即第一次等 1s,第二次等 2s,第四次等 4s,以此类推,减少无效请求。
区分攻击流量与正常流量:
- 正常用户是 "浏览器",会遵守跨域策略和 CSP;攻击流量往往是 "脚本",可能缺少 User-Agent 或 Referer。限流时优先限制异常行为的流量,对正常浏览器访问宽容度更高。
Redis热点数据+缓存三大问腿(穿透/击穿/雪崩)话术范本:
在项目中,我会把访问量高、读多写少、变化不频繁的热点数据 ,比如首页数据、热门商品、公共配置、排行榜等,缓存到 Redis 中,用来减轻数据库压力、提升接口响应速度、提高系统并发能力,保证高并发场景下系统稳定运行。
在缓存热点数据的同时,我也会处理缓存三大问题:缓存穿透、缓存击穿、缓存雪崩。
缓存穿透 是指查询不存在的数据,导致请求直接打到数据库。我会通过缓存空值 或者布隆过滤器来解决,避免无效请求穿透缓存。
缓存击穿 是指某个热点 Key 突然过期,大量并发请求直接压到数据库。我会使用互斥锁、逻辑过期、或者设置永不过期来保证同一时间只有一个请求去重建缓存。
缓存雪崩 是指大量 Key 同时过期,或者 Redis 节点宕机,导致数据库压力瞬间激增。我会通过给过期时间加随机值、搭建 Redis 集群、使用多级缓存、服务熔断降级来避免大面积故障。
整体方案就是:先读缓存,缓存不命中再查数据库并回种缓存,更新数据时先更新数据库再删除缓存,保证最终一致性,同时通过穿透、击穿、雪崩的防护策略,让 Redis 热点缓存既高效又稳定。
防御DDoS话术范本:
在防御 DDoS 方面,我认为不能只靠服务端扛。作为前端开发 ,我会通过防抖节流、懒加载、CDN 静态资源分担来减少请求量和带宽消耗;作为全栈开发 ,我会在 Node 层利用令牌桶算法做 IP 和接口限流,并结合白名单和动态阈值策略,既有效抵御 CC 攻击,又保证合法用户的体验不受影响。最终目标是在流量攻击到达核心业务之前,层层过滤掉。
四、攻击方法总结
- XSS的核心是输入输出转义 + CSP+HttpOnly Cookie,需前端和服务端双重防护,本质是拒绝执行不可信代码;
- CSRF的核心是Token 验证 + SameSite Cookie,本质是让请求携带攻击者无法获取的随机凭证;
- DDoS的核心是分层防护,开发侧重点做接口限流,运维侧依赖高防IP和流量清洗,无法完全杜绝只能降低影响。