代码之家  ›  专栏  ›  技术社区  ›  Cooper Labinger

HTML标记是否可以在不使用标准“<”字符的情况下呈现在纯HTML文档中?

  •  0
  • Cooper Labinger  · 技术社区  · 1 年前

    背景

    我正在开发一个现有的web应用程序,允许用户生成的内容具有HTML标记。为了减轻XSS攻击和其他风险,我使用 HTML Purifier 库,将内容解析为HTML,并在服务器端呈现之前删除不在允许列表中的任何标记。

    我希望通过使用更便宜的测试,只为被认为有风险的字符串调用昂贵的净化器库来提高性能,也就是说,通过检查 < 字符,表示字符串中可能存在HTML标记。

    主要问题

    那么 < 用户生成的字符串中的字符可以保证该字符串在包含在服务器的HTML文档中时不包含任何将被呈现为HTML标记的内容?换句话说,攻击者是否可以包含一个子字符串,从而导致 <script></script> 标记,而不包含包含 < 性格

    我想到的是使用字符编码技巧使浏览器最终处理 < 字符作为标记的开头,而没有包含该文字字符的原始字符串。

    用例说明

    我可以解释用户输入的HTML实体,并将它们呈现为相关联的字符,例如 &amp; 被渲染为 & 。我只想确保在允许列表之外没有HTML标记。

    编码所有HTML实体的常用方法(例如。 < , > , & )字符串中的 此应用程序的一个选项:允许允许列表上的HTML标记是必需的。

    1 回复  |  直到 1 年前
        1
  •  1
  •   Iłya Bursov    1 年前

    html标准要求 < 用于指示标记的符号:

    从…起

    https://www.w3.org/TR/2011/WD-html5-20110405/syntax.html#syntax-start-tag

    开始标记的第一个字符 必须是 一个U+003C LESS-THAN符号字符(<)。

    因此,如果没有它,文本就不能被视为包含html标记,您可以在将字符串传递给净化器之前检查它是否存在

    不过,可能存在现有或未来浏览器的错误,这些错误将接受除U+003C符号之外的其他符号