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

时间:2017-05-05 22:26:52

标签: java angularjs jackson xss

考虑申请:

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

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

首先要保护前端的Web组件免于从输入字段中公开HTML实体。

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

想象包含Twitter样式标签的帖子/评论字段 - #tag会自动转换为指向someurl / tags / tag的超链接,这将通过在渲染时创建HTML标记来构建,然后,最终div将是附在网站上。这种div的其他用途是将其嵌入HTML邮件模板中,该模板将通过SMTP发送给其他用户。

在这个应用程序中会有各种各样的领域。

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

确保这种领域的正确方法是什么?在将字段值发布到后端时,是否应该使用Jackson过滤器/转换器/ escaper在全球范围内完成?或者它应该是每次转义,当暴露到前端或邮件模板中的每个地方时?

1 个答案:

答案 0 :(得分:3)

你应该:

  • 渲染时前端的值会转义。这应该使用全局实用程序或设置来完成。默认情况下,某些前端框架会执行此操作(例如React)。
  • 在提交到后端时验证值并在适当时阻止字符。例如。名称字段可能不需要<>

您可以考虑:

  • 提供在请求时返回转义值的端点(即&escapeHtml=true)。我个人并不喜欢这个,但也许这适合你的情况。

我不推荐:

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