Web 漏洞原理与防御
OWASP Top 10 中最高频的三种 Web 漏洞:原理、攻击示例与可落地的修复方案。
合规声明
本页面内容仅用于安全学习与合法授权测试(如 CTF、自建靶场、获得授权的渗透测试项目)。严禁用于未授权的系统入侵、数据窃取或任何违法活动。使用者须自行承担一切法律责任。
项目简介
Web 漏洞的本质是 “输入不可信”。理解 XSS、SQL 注入、CSRF 的触发条件与修复方式,是写安全代码的基本功。以下示例全部为教学简化版,请只在靶场环境中验证。
代码示例:XSS 原理与修复
html
<!-- 漏洞版:用户输入直接拼入 DOM -->
<div>你好,<span id="nick"></span></div>
<script>
var nick = location.hash.slice(1);
document.getElementById("nick").innerHTML = nick; // 直接注入 -> XSS
</script>
<!-- 修复版:只当作纯文本写入 -->
<div>你好,<span id="nick-fixed"></span></div>
<script>
var nick = decodeURIComponent(location.hash.slice(1));
document.getElementById("nick-fixed").textContent = nick; // 自动转义
</script>代码示例:SQL 注入原理与修复
py
# 漏洞版:字符串拼接 SQL(输入 1' OR '1'='1 可绕过登录)
def login_bad(user: str, pwd: str):
sql = f"SELECT * FROM users WHERE name='{user}' AND pwd='{pwd}'"
return db.execute(sql) # 危险!
# 修复版:参数化查询(永远不要拼接)
def login_good(user: str, pwd: str):
sql = "SELECT * FROM users WHERE name=? AND pwd=?"
return db.execute(sql, (user, pwd)) # 参数化,值不会被当作 SQL代码示例:CSRF 原理与防御
py
from flask import request, session, abort
CSRF_SECRET = "change-me"
def csrf_token() -> str:
return session.get("csrf_token") or ""
@app.before_request
def check_csrf():
if request.method == "POST":
token = request.form.get("_csrf")
if token != csrf_token():
abort(403) # 拒绝跨站伪造请求
# 模板中写入隐藏字段:<input type="hidden" name="_csrf" value="{{ csrf_token() }}">防御清单
- XSS:默认用
textContent/ 模板自动转义;富文本走白名单过滤。 - SQLi:一律参数化查询;ORM 禁止
raw拼接用户输入。 - CSRF:POST 校验 Token、Cookie 设
SameSite=Lax/Strict。 - 安全头:CSP、X-Frame-Options、X-Content-Type-Options 全开。
操作步骤
- 在 DVWA(靶场)中把安全级别调低,亲手复现三种注入,观察原理。
- 对照“修复版”代码改自己的项目,用 Burp Suite 复测。
- 接入免费扫描器(如 OWASP ZAP)做回归检查。
来源参考
GitHub 关键词:owasp-top10-examples、xss-sqli-csrf-demo、secure-flask-template(链接可替换为实际仓库地址)。