【计算机网络之XSS、CSRF、DDoS原理及防御措施】

目录

跨站脚本(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 个必要条件(面试必答)
  1. 用户已登录目标网站,且Cookie 未过期;
  2. 目标网站的核心操作(如转账、改密码)仅通过Cookie验证身份;
  3. 攻击者能构造出完整的恶意请求(知道请求 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 转义(如<&lt;>&gt;"&quot;
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/StrictStrict:完全禁止跨域携带 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 相关

  1. 请说明存储型 XSS 和反射型 XSS 的区别,以及你在项目中是如何防护的?
  2. 为什么说仅用前端转义无法完全防御 XSS?服务端需要做什么?
  3. CSP 的作用是什么?请写出一个限制仅加载同域资源、禁止内联脚本的 CSP 响应头配置。
  4. HttpOnly Cookie 能防御所有 XSS 吗?为什么?

对于上述问题,建议大家先自行思考,将思路顺下来,再看完善版回答:


1. 存储型 XSS 和反射型 XSS 的区别,以及项目中的防护措施

区别:

存储型 XSS(持久型 XSS):恶意代码会被永久存储在服务端(如数据库、缓存、文件),所有访问该页面的用户都会触发攻击。比如攻击者在评论区发布含恶意脚本的内容,所有查看该评论的用户都会被攻击,攻击范围广、危害大。

反射型 XSS(非持久型 XSS):恶意代码存在于 URL 中,只有用户点击特制的钓鱼链接时,服务端将 URL 中的恶意代码 "反射" 回页面执行,仅针对点击链接的单个用户,攻击范围小、一次性。

项目防护措施(具体落地):

  1. 输入层:对所有用户输入(如评论、昵称、上传内容)做严格的输入验证,仅允许合法字符(如字母、数字),拒绝 <script>onclick 等危险标签 / 属性;

  2. 输出层:对所有从服务端渲染到页面的内容做统一转义(如把 < 转成 &lt;> 转成 &gt;),确保恶意代码以文本形式展示而非执行;

  3. 安全策略:配置 CSP(内容安全策略)禁止内联脚本、禁止加载未知域的资源;

  4. Cookie 防护:给敏感 Cookie(如登录态)设置 HttpOnly 和 Secure 属性,防止 JS 窃取;

  5. 统一过滤:使用成熟的过滤库(如 Java 的 ESAPI、Python 的 bleach),避免手写过滤规则遗漏漏洞。

2. 为什么仅用前端转义无法完全防御 XSS?服务端需要做什么?

前端转义的局限性:

  1. **前端逻辑可被绕过:**攻击者可通过修改前端代码(如禁用转义函数)、劫持前端 JS 执行流程,直接跳过前端转义;

  2. 多端场景覆盖不全:若项目有多个端(如 H5、APP、小程序),前端转义规则难以统一,容易出现遗漏;

  3. HTTP 直接请求:攻击者可绕过前端页面,直接通过 Postman 等工具发送含恶意代码的请求到服务端,前端转义完全失效。

服务端必须做的防护:

  1. 核心:输出转义(不可替代):服务端对所有要渲染到页面的内容做统一转义,这是防御 XSS 的核心(前端转义仅作为辅助);

  2. 输入验证 / 过滤:基于白名单验证输入(而非黑名单),拒绝危险字符 / 标签;

  3. 统一渲染层处理:在模板引擎(如 Thymeleaf、Vue SSR)中开启自动转义功能;

  4. 校验请求来源:结合 Referer/CORS 限制非法请求,减少恶意请求提交;

  5. 定期安全扫描:通过工具检测服务端输出的内容是否存在未转义的危险代码。

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 吗?为什么?

不能。原因如下:

  1. HttpOnly 的核心作用:仅禁止前端 JS 读取 Cookie(如 document.cookie),无法防御 XSS 导致的其他危害(如页面篡改、数据泄露)。

  2. 攻击者的绕过方式:

    • 即使无法读取 Cookie,攻击者可通过 XSS 执行恶意脚本,直接利用当前用户的登录态发起请求(如模拟用户提交表单、转账、修改密码),无需读取 Cookie;

    • 若攻击目标不是 Cookie(如窃取页面敏感数据、劫持用户操作),HttpOnly 完全无效;


核心点:

  1. XSS 防御核心:服务端输出转义是基础,CSP 是兜底,HttpOnly 是 Cookie 专项防护,三者缺一不可;

  2. 前端转义的定位:仅作为辅助,服务端必须做统一的输入验证和输出转义;

  3. HttpOnly 局限性:只防 Cookie 读取,不防 XSS 攻击本身,也不防利用登录态的操作型攻击。


2. CSRF 相关

  1. CSRF 攻击的核心条件是什么?为什么 GET 请求也可能触发 CSRF?
  2. CSRF Token 和 XSS Token 有什么区别?为什么 CSRF Token 不能只存在 Cookie 中?
  3. SameSite Cookie 的三个值(Strict/Lax/None)分别是什么含义?在项目中你会怎么选择?
  4. 请描述你项目中 CSRF 防护的完整流程(从 Token 生成到验证)。

1. CSRF 攻击的核心条件是什么?为什么 GET 请求也可能触发 CSRF?

CSRF 攻击的核心条件(3 个缺一不可):

  1. 用户已登录目标网站:目标网站通过 Cookie 等方式保存了用户的登录态 ,且登录态未过期;

  2. 请求可被伪造:目标网站的核心操作(如转账、改密码)仅通过 Cookie 验证身份,无需额外的用户交互(如输入验证码);

  3. 用户访问了恶意页面:用户在登录目标网站的前提下,点击 / 访问了攻击者构造的恶意页面,该页面会自动向目标网站发送请求。

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 窃取信息。

  1. 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 传递(如放在请求体、请求头、页面隐藏域),才能确保请求是 "用户在目标网站主动操作发起",而非跨站伪造。

  1. SameSite Cookie 的三个值(Strict/Lax/None)分别是什么含义?在项目中你会怎么选择?

三个值的核心含义:

核心规则 适用场景
Strict 严格模式:任何跨域请求都不会携带该 Cookie(包括同站不同子域) 高敏感操作(如转账、改密码)
Lax 宽松模式:1. 禁止跨域 POST/PUT/DELETE 等修改类请求携带 Cookie;2. 允许跨域 GET 请求(如链接跳转、表单提交)携带 Cookie 普通业务页面(如商品详情、文章跳转)
None 无限制:允许所有跨域请求携带 Cookie;注意:必须同时设置 Secure 属性(仅 HTTPS 传输),否则配置无效 跨域业务(如第三方登录、多域名统一登录)

项目中的选择策略:

  1. 核心原则:按 "业务敏感度" 分级配置,而非全量用 Strict/Lax;

  2. 具体选择

    • 登录态 Cookie、支付 / 改密码等敏感操作的 Cookie:设置 SameSite=Lax + Secure + HttpOnly;既避免跨域 POST 请求伪造(防御 CSRF),又兼容正常的跨域 GET 跳转(如你项目中的 navigate("") 页面跳转),无需重新登录;

    • 高敏感操作(如资金相关):临时切换为 SameSite=Strict,操作完成后恢复 Lax;

    • 跨域接口调用(如对接第三方):仅对该接口专用的 Cookie 设置 SameSite=None + Secure,并限制接口域名白名单。

  3. 描述项目中 CSRF 防护的完整流程(从 Token 生成到验证)

以我负责的......项目为例,完整流程如下:

步骤 1:Token 生成(用户首次访问 / 登录时)

  1. 服务端为当前用户会话(Session)生成唯一、随机、不可预测的 CSRF Token(如 32 位随机字符串);

  2. 存储:将 Token 存入服务端 Session(核心),同时将 Token 渲染到页面的隐藏域(如 <input type="hidden" name="csrfToken" value="xxx">)/内存中,不存入 Cookie/LocalStorage(避免 XSS 窃取);

  3. 兜底:若为前后端分离项目,通过接口返回 Token,前端存储在内存中(而非 LocalStorage。因为:内存是临时的,LocalStorage是永久的),每次请求前从内存读取。

步骤 2:Token 传递(用户发起请求时)

  1. 前端在发起非 GET 请求(如提交表单、修改数据)时,从隐藏域 / 内存中读取 CSRF Token;

  2. 将 Token 携带在请求头 (如 X-CSRF-Token: xxx)或请求体中(优先请求头,避免 URL 泄露);

  3. GET 请求仅用于查询数据,不做任何状态变更,无需携带 Token。

步骤 3:服务端验证(核心)

  1. 先验来源 :验证请求头 Origin/Referer,仅放行白名单内的域名(如项目的主域名、可信子域名);

  2. 再验Token

    • 从 Session 中取出该用户的 CSRF Token;

    • 对比请求头 / 请求体中的 Token 与 Session 中的 Token 是否一致;

    • 验证通过则处理请求,不通过则直接返回 403 错误;

  3. 兜底防护

    • 给登录态 Cookie 设置 SameSite=Lax + HttpOnly + Secure

    • 对所有修改类请求(POST/PUT/DELETE)强制验证 Token,GET 请求仅做来源校验。

步骤 4:Token 失效 / 刷新

  • 用户登出时,清空 Session 中的 CSRF Token;

  • Token 有效期与 Session 一致(如 2 小时),超时自动失效;

  • 敏感操作(如支付)后,主动刷新 Token,避免重复使用。


关键点:

  1. CSRF 防御核心:Token 需 "服务端存储 + 前端手动携带 + 服务端验证",且 Token 不能仅存在 Cookie 中;

  2. SameSite 选择:按业务敏感度分级,Lax 是兼顾安全与体验的最优解,Strict 仅用于高敏感操作;

  3. 完整防护流程:来源校验(Origin/Referer)+ Token 验证 + SameSite Cookie 兜底,三者结合才能全面防御 CSRF。


3. DDoS 相关

  1. DDoS 和 DoS 的区别是什么?应用层 DDoS(如 CC 攻击)和流量型 DDoS 的防护方式有什么不同?
  2. 作为前端 / 全栈开发,你能做哪些事情来辅助防御 DDoS?
  3. 接口限流的实现思路是什么?如何避免限流策略影响合法用户?

1. 应用层 DDoS(CC 攻击)与流量型 DDoS 的防护区别

核心思路 :两者攻击层面不同,所以防御手段完全不在一个维度。CC 攻的是 "应用逻辑",流量型攻的是 "网络带宽"。

1)应用层 DDoS(CC 攻击)防御:攻击本质 :攻击者利用少量代理机或爬虫,模拟正常用户高频发送 HTTP 请求(如疯狂刷新接口、提交表单)。它消耗的是服务器的 CPU、内存、数据库连接 ,而不是带宽。防御核心认得出、挡得住、降得住

  1. 接入层限流:在 Nginx / 网关层限制单 IP 或单用户的 QPS(每秒请求数)。例如,限制单个 IP 每分钟最多 100 次请求,超过则直接返回 429 错误。
  2. 人机验证 :在关键接口(登录、注册、秒杀)前增加验证码、滑块、短信验证。这是最有效的防御,因为自动化脚本很难通过验证。
  3. 行为分析:识别异常请求头(User-Agent)、Referer 或 Cookie。如果某个 IP 瞬间发起大量无状态请求,直接拉入黑名单。
  4. 降级与熔断:当检测到服务负载过高时,自动关闭非核心接口(如实时推荐、排行榜),返回静态缓存页面,优先保障核心业务(如登录、下单)可用。

2)流量型 DDoS(四层 / 网络层)防御:攻击本质: 攻击者利用僵尸网络,发送海量的 UDP/TCP 数据包(如 SYN Flood、UDP Flood)。它目的是打满服务器带宽 或耗尽网络连接资源,导致服务器无法响应正常请求。防御核心清流量、找源头、抗大流量

  1. 黑洞路由(Blackhole):在运营商层面识别攻击流量,直接将攻击流量丢弃(黑洞),不转发给服务器。
  2. 高防 IP(Anti-DDoS)+流量清洗:将业务域名解析到高防 IP 上。在高防节点识别并清洗恶意数据包(如异常的 TCP 包、伪造的 IP 包),只将正常业务流量和合法流量回源到服务器上。
  3. 带宽扩容:购买更大的机房带宽,通过 "硬抗" 的方式承受大流量攻击。

2. 前端 / 全栈开发辅助防御 DDoS 的具体措施

前端三层防御体系

第一层:前端行为控制(减少请求发出)

这是成本最低、效果最好的防御。

  • 请求节流(Throttling)与防抖(Debouncing):针对搜索框、点赞、按钮点击等操作,限制单位时间内的请求次数。防止用户误点或恶意脚本疯狂发包。

  • 静态资源 CDN 化:将图片、JS、CSS 等静态资源部署到 CDN。CDN 节点遍布全国,能承载巨大的访问流量,从而分流源站压力,保护后端接口。

  • 资源懒加载 & 按需加载:图片懒加载、路由懒加载。避免一次性加载过多资源导致瞬间带宽打满,或者一次性请求大量数据耗尽服务器内存。

第二层:Node.js 中间层防护(全栈能力)

作为全栈开发,你可以在服务网关层做前置处理。

  • 请求合并与缓存:将多个小请求合并为一个大请求(Batch Request),减少连接数。利用 Redis 缓存热点数据,避免重复请求穿透到数据库。

  • 非法请求拦截:在 Node 层对请求体进行校验,过滤掉恶意的大 Body 或非法参数,防止恶意请求消耗服务器内存。

  • IP 限速:在 Node 层实现简单的速率限制(Rate Limit),对过快的 IP 临时拒绝服务。

第三层:前端安全策略(增强身份验证)

  • 接入合法用户池:通过前端鉴权,确保只有登录用户或合法设备才能发起请求。对于未登录态的匿名请求,限制其请求频率,防止攻击者匿名刷量。

  • 前端监控与报警:通过监控前端页面的加载状态、接口响应时间,当发现页面加载异常(如网堵、服务挂了)时,及时给出友好提示并停止重试请求,避免用户端不断重试加剧服务器压力。


3. 接口限流实现思路 + 如何避免影响合法用户

思路 :限流是把双刃剑。既要挡住攻击者,又要保护正常用户。需要从算法策略业务策略两方面入手。

1)接口限流的实现思路(技术层)

  1. 基于存储的限流(分布式 / 全局)

    • 利用 Redis 缓存。使用 INCR 命令计数,配合 EXPIRE 设置过期时间。

    • 常用算法

      • 计数器法:简单粗暴,如 1 分钟内超过 1000 次就拒绝。

      • 滑动窗口:解决计数器法的 "临界问题"(比如 59 秒和 01 秒同时爆发),更平滑。

      • 令牌桶 / 漏桶算法令牌桶 更适合前端 / 全栈场景。以固定速率往桶里放令牌,请求获取令牌才能通行。它允许一定程度的突发流量(桶内有缓存令牌),更符合合法用户的行为习惯。

  2. 分层限流(业务层)

    • IP 限流:限制单 IP 访问频率(防爬虫 / 肉鸡)。

    • 用户级限流:根据 UserID 或 Token 限流(针对登录用户)。

    • 接口级限流:不同接口不同阈值。核心接口(如支付)限流极严,非核心接口(如获取文章列表)可以宽松。

2) 如何避免限流策略影响合法用户?

这是重点,看你是否懂得权衡

  1. 白名单机制(最重要)

    • 设置服务白名单:内网接口、后台管理系统的 IP 或 Token 完全不限流,保证内部运维不受影响。

    • 设置核心用户白名单:VIP 用户或重要客户不受限流影响。

  2. 分级限流策略(软硬兼施)

    • 软限流 :当流量达到阈值 80% 时,不直接拒绝,而是延迟响应(Retry-After)或降低服务质量(降级),给用户提示 "系统繁忙,请稍后重试",而非报错。

    • 硬限流:仅在流量过载时触发硬拒绝。

  3. 动态阈值与智能扩容

    • 不要写死代码。根据服务器 CPU 负载、内存使用率动态调整限流阈值。负载低时放宽,负载高时收紧。

    • 对于多节点部署 的服务,使用分布式锁(如 Redis Lock)全局限流算法,防止单机限流导致的流量不均。

  4. 用户体验优化(Retry 机制)

    • 前端在收到限流响应(HTTP 429)时,使用指数退避算法(Exponential Backoff)进行重试,而不是疯狂重试。即第一次等 1s,第二次等 2s,第四次等 4s,以此类推,减少无效请求。
  5. 区分攻击流量与正常流量

    • 正常用户是 "浏览器",会遵守跨域策略和 CSP;攻击流量往往是 "脚本",可能缺少 User-Agent 或 Referer。限流时优先限制异常行为的流量,对正常浏览器访问宽容度更高。

Redis热点数据+缓存三大问腿(穿透/击穿/雪崩)话术范本:

在项目中,我会把访问量高、读多写少、变化不频繁的热点数据 ,比如首页数据、热门商品、公共配置、排行榜等,缓存到 Redis 中,用来减轻数据库压力、提升接口响应速度、提高系统并发能力,保证高并发场景下系统稳定运行。

在缓存热点数据的同时,我也会处理缓存三大问题:缓存穿透、缓存击穿、缓存雪崩

缓存穿透 是指查询不存在的数据,导致请求直接打到数据库。我会通过缓存空值 或者布隆过滤器来解决,避免无效请求穿透缓存。

缓存击穿 是指某个热点 Key 突然过期,大量并发请求直接压到数据库。我会使用互斥锁、逻辑过期、或者设置永不过期来保证同一时间只有一个请求去重建缓存。

缓存雪崩 是指大量 Key 同时过期,或者 Redis 节点宕机,导致数据库压力瞬间激增。我会通过给过期时间加随机值、搭建 Redis 集群、使用多级缓存、服务熔断降级来避免大面积故障。

整体方案就是:先读缓存,缓存不命中再查数据库并回种缓存,更新数据时先更新数据库再删除缓存,保证最终一致性,同时通过穿透、击穿、雪崩的防护策略,让 Redis 热点缓存既高效又稳定。


防御DDoS话术范本:

在防御 DDoS 方面,我认为不能只靠服务端扛。作为前端开发 ,我会通过防抖节流、懒加载、CDN 静态资源分担来减少请求量和带宽消耗;作为全栈开发 ,我会在 Node 层利用令牌桶算法做 IP 和接口限流,并结合白名单和动态阈值策略,既有效抵御 CC 攻击,又保证合法用户的体验不受影响。最终目标是在流量攻击到达核心业务之前,层层过滤掉。


四、攻击方法总结

  1. XSS的核心是输入输出转义 + CSP+HttpOnly Cookie,需前端和服务端双重防护,本质是拒绝执行不可信代码;
  2. CSRF的核心是Token 验证 + SameSite Cookie,本质是让请求携带攻击者无法获取的随机凭证;
  3. DDoS的核心是分层防护,开发侧重点做接口限流,运维侧依赖高防IP和流量清洗,无法完全杜绝只能降低影响。
相关推荐
jgyzl2 小时前
2026.3.13 Redis的网络模型
网络·redis·php
Johnstons2 小时前
AnaTraf 网络流量分析免费版:给运维多一双“眼睛”
运维·服务器·网络
wuhen_n2 小时前
Vue Router 进阶:路由懒加载、导航守卫与元信息的高效运用
前端·javascript·vue.js
SoaringHeart2 小时前
Flutter进阶|源码修改:给 DecorationImage 源码添加偏移量
前端·flutter
wuhen_n2 小时前
虚拟列表完全指南:从原理到实战,轻松渲染10万条数据
前端·javascript·vue.js
兆子龙2 小时前
React Hooks 避坑指南:那些让你 debug 到凌晨的陷阱
前端·javascript
兆子龙3 小时前
你不会使用 CSS 函数 clamp()?那你太 low 了😀
前端·javascript
兆子龙3 小时前
前端性能优化终极清单:从 3 秒到 0.5 秒的实战经验
前端·javascript
兆子龙3 小时前
babel-loader:让你的 JS 代码兼容所有浏览器
前端