Web应用安全 · kp-011
Web 攻击面与 HTTP 安全基础
一句话定义
Web 攻击面是攻击者可触碰的全部入口——URL 参数、表单、请求头、Cookie、文件上传、第三方脚本、API——而理解它们的前提是掌握 HTTP 的请求/响应结构与浏览器安全基石:同源策略(Same-Origin Policy)。
为什么重要
Web 是现实中暴露面最大、攻击者最易触达的系统形态。后续各课(注入、XSS、CSRF、越权)都是攻击面上某一入口的具体失效;本课给出统一的地图:请求如何流动、哪些字段是"不可信输入"、浏览器默认信任什么不信任什么。没有这张地图,防御措施会退化成零散的技巧堆砌。
前置知识
建议先有基本 HTTP 使用经验(能看懂请求行、状态码);无其他硬性前置。
核心概念
- HTTP 结构:请求 = 方法 + 路径 + 头部 + 体;响应 = 状态码 + 头部 + 体。状态码语义中与安全相关的有 401/403(认证/授权,见 kp-002)、301/302(重定向可被滥用做钓鱼跳板)。
- 不可信输入清单:查询参数、请求体、路径段、所有请求头(含 X-Forwarded-For 这类可伪造头)、Cookie、文件名与 MIME 声明。原则:来自浏览器之外的一切都不可信。
- Cookie 安全属性:HttpOnly(禁止 JS 读取,缓解 XSS 窃取)、Secure(仅 HTTPS 传输)、SameSite(限制跨站携带,CSRF 防线之一)、Domain/Path(作用域最小化)。
- 同源策略(SOP):浏览器默认禁止脚本跨源读取彼此数据,是 Web 安全的地基;CORS 是服务端显式放宽 SOP 的机制,配置过宽(如反射任意 Origin)等于拆地基。
- 攻击面扩展项:文件上传(内容与类型双重风险)、Webhook/SSRF 出口、前端依赖脚本(供应链,见 kp-024)、管理后台。
公式、模型或图示
[浏览器] ──请求──▶ [CDN/WAF] ──▶ [Web 应用] ──▶ [数据库]
▲ │ │
│ 不可信输入:参数/头/Cookie/上传 │
└── 响应(含 Set-Cookie 安全属性) ◀──┘──▶ [缓存/对象存储]
攻击面 = 所有"外部数据进入信任边界"的接口原理与机制
Web 安全的核心规律是"数据流穿越信任边界时,语境解释会改变":同一个字符串在 URL 里是参数、进 SQL 是代码、进 HTML 是标签(这正是 kp-012/kp-013 的共同根因)。浏览器侧的安全模型是"默认隔离、按需放行"——SOP 隔离不同站点,Cookie 随同源请求自动携带(这一"自动性"正是 CSRF 的根源)。服务端侧的安全模型则相反:"默认信任、显式拒绝",因此防御的重心是把服务端也改造成默认拒绝:所有入口做类型/范围校验,所有出口做语境化编码,所有状态变更做权限与来源校验。
实例或案例
打开浏览器开发者工具的网络面板审查一次登录:观察请求头中的 Cookie 与 Content-Type、响应中的 Set-Cookie 是否带 HttpOnly/Secure/SameSite——这三行属性就能读出该站对 kp-015/kp-014 的防御水位。这是零成本的"健康自查"。
直观类比
把 Web 应用想象成一栋对公众开放的大楼:每个接口都是一扇门,攻击面就是门的清单。同源策略像"不同公司员工牌互不通用"的默认规则,CORS 则是前台显式登记的例外名单——名单写错(*)就等于不设防。
常见误区
- "上了 HTTPS 网站就安全":TLS 只保护传输层(kp-018),注入与 XSS 照常工作。
- "前端做了校验所以安全":前端校验是体验优化,攻击者可绕过浏览器直接发请求;校验必须在服务端复验。
- 把 X-Forwarded-For 当可信来源:该头可被任意伪造,访问控制不得依赖它。
与其他知识点的关系
- kp-004(威胁建模 STRIDE):用 DFD 把本课的攻击面系统性枚举出来。
- kp-012 ~ kp-016:本课地图上的具体漏洞课。
自测题
- 列出至少五类服务端应视为不可信的输入。要点:参数、体、路径、请求头、Cookie、上传文件名/内容。
- HttpOnly、Secure、SameSite 各防什么?要点:JS 读取(XSS 窃取)、明文传输、跨站携带(CSRF)。
- 为什么 CORS 配置成"反射任意 Origin"是严重错误?要点:等于向任何站点开放跨源读取,SOP 的保护被服务端亲手拆除。
延伸阅读
《The Tangled Web》(Michal Zalewski):浏览器安全模型的权威梳理。