浏览器、网络与安全 · KNOWLEDGE CHAPTER
K15

身份、注入与嵌入安全

安全设计从“谁让什么数据越过了哪条边界”出发:Cookie 维护会话,XSS 攻击解释器,CSRF 借用浏览器身份,点击劫持利用真实界面,HTTPS 保护运输。它们不能用一个配置统一替代。

浏览器、网络与安全2 道章节练习6 道主练关联

核心模型

安全设计从“谁让什么数据越过了哪条边界”出发:Cookie 维护会话,XSS 攻击解释器,CSRF 借用浏览器身份,点击劫持利用真实界面,HTTPS 保护运输。它们不能用一个配置统一替代。

原理与机制

会话是服务端可撤销的身份关系

Cookie 属性限制发送与读取:Secure 限制安全连接,HttpOnly 不让页面脚本直接读值,SameSite 控制同站及特定跨站场景;Domain 扩大主机范围,Path 不是可靠安全隔离边界。同站不同源的子域仍值得警惕。登录或权限提升时轮换会话,服务端撤销旧标识;退出只删除浏览器 Cookie 而保留旧会话授权,重放仍可能成功。HttpOnly 降低令牌被直接盗取的风险,却阻止不了已注入脚本代表用户发请求。

注入发生在数据被重新解释时

纯文本写入 textContent 能让字符串始终保持数据;innerHTML 则重新进入 HTML 解析器。危险输入可能位于属性、URL、事件处理器或脚本,不只有 script 标签,所以编码必须匹配具体上下文。链接还要限制协议和目标,富文本必须经过维护中的净化器与内容白名单,净化后再拼接不可信 HTML 会破坏保证。框架的默认文本转义只保护其正常文本路径,危险 HTML 接口与第三方组件仍需单独审计。

纵深策略必须真的执行

CSP 可用每个响应新生成且不可预测的 nonce 或内容 hash 收紧脚本执行。先 Report-Only 发现合法依赖,再灰度强制并验证真实拦截;没有报告也可能是上报坏了。Trusted Types 在支持环境中将危险注入点收束到策略,但 createPolicy 本身没有净化魔法:原样返回字符串仍危险,需强制指令与受限策略名配合。报告作为不可信诊断输入聚类,不能看到陌生域就自动加入白名单。

请求和界面都可能被借用

CSRF 利用自动携带的认证信息诱导请求,不要求攻击者读到响应。写接口需符合架构的会话绑定令牌、来源校验或受保护请求头方案,再配 SameSite 等纵深防御;固定用户 ID 不是不可预测令牌。点击劫持则可诱导用户操作真实嵌入页面。响应头中的 frame-ancestors 限制谁能嵌入自己,并检查整条祖先链;frame-src 限制自己加载谁,方向相反,meta 或 default-src 不能代替 frame-ancestors。

传输安全不为内容背书

HTTPS 通过 TLS 提供传输机密性、完整性及服务器身份验证,不能证明页面无注入、业务授权正确。HSTS 让已知策略的浏览器在请求前升级 HTTPS,但首次未知访问有边界,预加载带来更长的部署与撤回周期。includeSubDomains 影响所有适用子域,必须先盘点证书与旧服务;子域发 max-age=0 不能抵消父域仍有效的覆盖。混合内容应消除 HTTP 依赖,而不是要求用户关闭安全保护。 上线后还要维护证书续期、新增子域和回滚流程;停止发送 HSTS 头不会让已记住策略的浏览器立即忘记,部署验收必须包含旧客户端状态。

最小示例

javascript
javascript
function renderLink(node, rawLabel, rawUrl) {
  node.textContent = rawLabel;
  node.removeAttribute('href');
  if (typeof rawUrl !== 'string' || !rawUrl.trim()) return;
  let url;
  try { url = new URL(rawUrl, location.href); }
  catch { return; }
  if (url.protocol !== 'https:' || url.origin !== location.origin) return;
  node.href = url.href;
}
// renderLink(a, '<img src=x onerror=alert(1)>', 'javascript:alert(1)');

示例刻意只允许本站 HTTPS 链接。先移除旧 href,再拒绝非字符串、空输入与无法解析的 URL,因此失败不会遗留上一次链接。文本中的尖括号保持文本,javascript: 也不会得到 href。它只示范文本安全与 URL 许可两个检查,不是富文本净化器;若允许外链,应扩展明确业务名单并独立测试。

环境:现代浏览器;node 为已存在的锚点元素,location 为当前页面位置;策略仅允许本站 HTTPS URL。

核验:已在 Node.js 用模拟锚点和 location 验证合法本站链接、非法 URL、危险协议、外站、空值及旧 href 清除;这是纯逻辑局部验证,未运行真实 DOM 或浏览器安全集成测试。

边界与取舍

边界

  • HttpOnly、CORS、POST 和 HTTPS 都不能单独防住 CSRF 或 XSS;需要沿真实攻击路径组合措施。
  • CSP nonce 固定复用、Trusted Types 策略原样放行,都可能形成“有配置但无有效防护”。
  • frame-ancestors 应由响应头发送;它不继承 default-src,也不等于接口授权。

取舍

  • 严格 CSP 可减少注入后果,却可能破坏第三方脚本;以报告、业务回归和分阶段强制降低上线风险。
  • 较广 Cookie 域和 HSTS 子域覆盖便于统一部署,却扩大配置影响面;优先最小会话范围,安全头逐步提升。

口述示范

我会先定位攻击入口与可信边界:输出按上下文处理,身份由服务端校验与撤销,伪造请求和嵌入分别治理,再用 CSP、Trusted Types、HTTPS 形成纵深。验收要故意构造失败路径,配置存在本身不是安全证据。

章节练习

练习 1

富文本预览声称“删掉 script 且用了 HTTPS 就安全”,请设计最小审查。

展开检查点
  • 分别列出文本、属性、URL、富文本落点。
  • 纯文本用安全接口,富文本净化;测试事件属性和危险协议。
  • 核对 CSP 强制与 Trusted Types 策略,不能只看 API 名称。
练习 2

账户页允许合作方嵌入且依赖 Cookie 登录,设计边界测试。

展开检查点
  • 会话过期、登录轮换后旧 Cookie 重放应失效。
  • 写请求缺失或错误会话令牌被拒绝。
  • 检查精确 frame-ancestors 和多层祖先链,未授权嵌入被阻止。

参考来源与核验边界

按核验日浏览器安全模型与 OWASP 防御指南;Trusted Types、隐私限制与 CSP 降级行为必须核对目标浏览器,不以单一浏览器成功代替完整验收。

内容版本:2026-10-04.2 · 题目和来源 ID 保持原样,本站不将面经标签解释为企业官方出题或高频保证。