HTML 输入转义 - 正确的方法是什么?

HTML input escaping - what's the proper way?

考虑申请:

JS 框架前端(例如 AngularJS)和 REST API 后端(例如 Jackson + Spring REST)和一些 HTML 邮件模板。

从 XSS 全局保护整个系统的正确方法是什么?

第一件事是保护前端的 Web 组件不暴露来自输入字段的 HTML 个实体。

第二件事是防止后端服务创建 HTML 模板(例如 HTML 邮件),其中包含来自用户字段的恶意值。

想象像 post/评论这样的字段将包含 Twitter 样式标签 - #tag 将自动转换为指向 someurl/tags/tag 的超链接,这将通过创建 HTML 标签来构建渲染时,final div 将附加到网站。这种 div 的其他用途是将其嵌入 HTML 邮件模板,通过 SMTP 发送给其他用户。

像这样的应用会有很多领域

我不想禁止用户通过正则表达式或后端验证从这些字段中输入非字母数字字符。但是,此输入将以默认允许 XSS 攻击的方式公开。

保护此类字段的正确方法是什么?当 posting 字段值到后端时,是否应该使用 Jackson 过滤器/转换器/转义器在全球范围内完成?还是应该在暴露到前端或邮件模板中的每个地方时每次都转义?

你应该:

  • 渲染时转义前端的值。这应该通过全局实用程序或设置来完成。一些前端框架默认这样做(例如 React)。
  • 在提交到后端时验证值并在适当的地方阻止字符。例如。名称字段可能不需要 <>.

你可以考虑:

  • 提供 return 转义值的端点(如果需要)(即 &escapeHtml=true)。我个人不是很喜欢这个,但也许它适合你的情况。

我不推荐:

  • 在存储到后端之前转义所有数据。也许这是个人喜好,但是转义 html 呈现的数据是假设数据只会用于此类(例如,如果有人直接调用 API 将数据放入 CSV 中会发生什么或 html 转义不适用的其他格式)。