通过替换所有括号字符来防止 Javascript XSS

Preventing Javascript XSS by replacing all the bracket characters

我正在使用 MongoDB 作为后端,这让我相信我不应该担心我的数据库中的 XSS。

对于 "frontend",我通过 JSP 生成页面。现在,我虔诚地逃避用户生成的内容(应该是纯文本 - 没有 Javascript 或 HTML 标签),但我并不 100% 相信自己。

阅读了一些关于 XSS 的建议后,我想知道以下 hack 是否可以防止我的网站失败。

在服务器端使用用户生成的输入时,我想替换用户生成的内容中的所有括号,例如() 通过 []。我想通过以下方式替换所有 <> 符号: 单左指角引号:‹ 单右指角引号:›

现在,我假设没有 ()<> 几乎不可能编写一段 JavaScript XSS。

这个 hack 会起作用还是我遗漏了什么?

您在上面的评论或问题中陈述或暗示了以下内容,转述:

  • 受污染的数据被插入到 div 数据状态上下文中,例如:<div> tainted data here </div>
  • 污染数据插入嵌套上下文:JavaScript single/double-quoted → 脚本数据状态:<script>$('#someid').populate($.parseJSON('<%=StringEscapeUtils.escapeEcmaScript‌​(jsonString)%>'));</script>
  • 您对上述 JavaScript 上下文使用 Apache Commons JavaScript 字符串转义器 StringEscapeUtils.escapeEcmaScript‌​
  • 您将过滤掉 <> 个字符

鉴于上述情况,我看不出有任何 XSS 发生的方法。如果您 转义 <> 那么您的代码 might be susceptible to some weirdness 关于脚本数据转义状态。这种怪异可能会导致 XSS。

我建议使用 Coverity 安全库 Escape.jsString 方法转义数据,而不是过滤,该方法转义 <>。 (完全披露:我在 Coverity 工作并致力于那个图书馆。)