在学具体漏洞之前,先建立一个贯穿所有 Web 安全问题的核心观念:永远不要信任用户的输入。
一、Web 漏洞的本质
一个 Web 应用的基本模型是:
用户输入 → 服务端处理 → 输出/存储 → 展示给其他用户
漏洞产生于这条链路上的「混淆」——用户输入被当成了代码或指令执行:
- 输入被当成 SQL 语句执行 → SQL 注入
- 输入被当成 HTML/JS 渲染 → XSS
- 输入被当成文件路径/命令 → 任意文件读取 / 命令注入
记住这个模型,后面学每一种漏洞都是在给这个模型填空。
二、三大经典漏洞速览
1. SQL 注入
用户输入直接拼接进 SQL 查询:
# 危险示例:输入被拼接进 SQL
query = "SELECT * FROM users WHERE name = '" + username + "'"
攻击者输入 ' OR '1'='1 即可绕过条件。防御的核心是参数化查询(预编译):
# 正确做法:参数与语句分离
cursor.execute("SELECT * FROM users WHERE name = ?", (username,))
2. XSS(跨站脚本)
用户输入未经转义就渲染到页面,攻击者插入 <script> 标签窃取 Cookie、劫持操作。防御要点:
- 输出编码:HTML 上下文转义特殊字符
- Cookie 加上
HttpOnly,让脚本读不到会话凭证 - 配置 CSP(内容安全策略)
3. 越权访问
用户 A 通过修改参数(如 ?id=1001 改成 ?id=1002)访问了用户 B 的数据。这是逻辑漏洞,和编码无关,只能靠服务端严格校验「当前用户是否有权访问这个资源」。
三、防御的统一思路
无论哪种漏洞,防御都可以归纳为四层:
- 输入验证:校验格式、长度、类型(但不能只靠它)
- 安全 API:参数化查询、模板引擎自动转义、ORM
- 最小权限:数据库账号、文件系统权限都要最小化
- 纵深防御:WAF、日志审计、安全响应头
四、下一步
本章后续文章会逐个深入每种漏洞:原理剖析 → 靶场复现 → 代码级防御。建议先在本地搭好 DVWA 靶场,跟着每篇教程动手实践。
安全不是背清单,而是理解「数据与代码的边界在哪里」。