清理客户端:为何服务器端 HTML 清理注定会失败

主要观点:多年来一直在对抗跨站脚本攻击(XSS),开发者和安全专家寻求新方法保护 web 应用,常见方法是使用 sanitizer,但服务器端 sanitization 有局限性,本文展示其局限性及为何是绕过的主要原因之一。
关键信息

  • 接收用户输入后要确保安全,平衡安全与功能需实施特定技术。
  • sanitizer 可清理 HTML 输入防止 XSS 攻击,但配置越多攻击面越大。
  • HTML sanitizers 工作原理是解析输入创建 DOM 树并迭代检查元素和属性。
  • XSS 攻击涉及攻击者、服务器和受害者三方,应在受害者端(客户端)进行 sanitization。
  • 研究发现服务器端 sanitizer 存在解析问题,多数用 PHP 的 sanitizer 因使用旧 HTML4 标准的内置解析器而易被绕过,如 HTML5 新特性在不同解析器中存在差异。
  • HTML 解析存在挑战,如不同浏览器解析差异、语言不断进化、解析器配置等影响,服务器无法确保 HTML 解析一致,应在可能发生 XSS 的端点进行解析和 sanitization。
  • 开发者目前需依赖第三方库或构建自定义 sanitization 机制,DOMPurify 较稳健(用于客户端),同时 PHP 已更新文档提醒勿用 HTML4 解析 API 进行 sanitizing,8.4 版本将用 Lexbor 库支持 HTML5 但仍未解决客户端 sanitization 问题。
    重要细节
  • 展示多种绕过 sanitizer 的 payload 及它们的共同根因。
  • 以注释为例说明 HTML4 和 HTML5 在解析上的差异导致 sanitizer 漏洞。
  • 提及第三方 HTML5 解析器也存在导致 sanitizer 绕过的差异。
  • 介绍开发者应采取的措施及相关博客帖子。
阅读 33
0 条评论