浏览器平台安全边界¶
浏览器 API 的便利建立在明确边界上:来源隔离、权限授予、网络策略和安全上下文。 理解这些边界能避免把“浏览器允许调用”误认为“数据可信或操作已获授权”。
同源策略¶
来源由协议、主机和端口组成。三者任一不同,通常就是不同来源。 同源策略限制脚本读取其他来源的 DOM、存储和响应内容,但允许的跨源加载类型各不相同。
它不是完整隔离沙箱:页面主动引入的第三方脚本通常在页面来源权限下执行, 能够访问该页面可访问的 DOM 和 Web Storage。减少第三方脚本并审查供应链十分重要。
CORS¶
CORS 由目标服务器通过响应头声明哪些来源的浏览器脚本可以读取响应。
它不是认证、授权或防火墙,也不应使用反射任意 Origin 的宽松配置。
凭据跨源请求需要精确允许来源、Access-Control-Allow-Credentials: true,
并同时考虑 Cookie、CSRF 和缓存的 Vary: Origin。预检成功不代表业务操作有权限。
Cookie 与客户端存储¶
认证 Cookie 应使用 HttpOnly、Secure 和符合业务的 SameSite。
HttpOnly 降低令牌被脚本直接读取的风险,但 XSS 仍可能借用户会话发请求。
localStorage、sessionStorage 和 IndexedDB 可被同源脚本读取,不适合保存长期秘密。
浏览器存储可被用户修改或清除,因此服务器不能相信其中的角色、价格或权限声明。
XSS 与 DOM 边界¶
来自 URL、网络、消息、存储和数据库的内容都应视为不可信数据。
显示纯文本使用 textContent;不要把未经严格清理的字符串交给 innerHTML、
insertAdjacentHTML 或代码执行接口。
CSP 和 Trusted Types 可提供纵深防御,但不能替代上下文输出编码、安全 DOM API 和依赖治理。 详细原则见 HTML 字符实体、HTML URL和HTML 字符实体参考。
安全上下文与权限¶
Service Worker、部分加密和设备能力要求 HTTPS 安全上下文。 权限请求应由清楚的用户操作触发,解释用途,并能在拒绝或撤销后继续提供合理体验。
浏览器授予摄像头、位置等权限,不代表服务器可以访问任意账户资源。 设备权限和应用授权是两套独立判断,都需要最小权限和生命周期管理。
实时连接¶
SSE 和 WebSocket 的长连接必须认证用户、验证资源归属、限制连接数并及时关闭。
WebSocket 服务端应校验允许的 Origin;SSE 跨源响应应使用精确 CORS 配置。
重连时重新检查会话和订阅权限,不信任客户端提供的游标、事件 ID 或频道名称。 退出登录后关闭连接并清理私有缓存,防止共享设备上的账户数据串流。
iframe 与跨窗口通信¶
嵌入不可信内容时使用最小化的 sandbox 权限,并通过 CSP frame-ancestors 控制谁能嵌入页面。
使用 postMessage() 时发送方指定精确 targetOrigin,接收方检查 event.origin、
event.source 和消息结构,不要使用 * 交换敏感数据。
客户端不是信任根¶
前端校验用于体验和减少无效请求,所有权限、对象归属、金额和状态转换必须在服务端验证。 混淆、禁用按钮、隐藏字段和客户端加密都不能阻止用户构造请求或修改运行时数据。
最小检查表¶
- 是否明确列出数据来源、信任级别和进入的解析上下文?
- 是否将认证、授权、CORS、CSRF 和输入验证分别处理?
- 是否减少令牌、个人数据和第三方脚本的暴露范围?
- 是否为存储、缓存、Worker 和长连接设计清理生命周期?
- 是否在服务端重新验证所有安全关键结论?