通过替换所有括号字符来防止 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 工作并致力于那个图书馆。)
我正在使用 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 工作并致力于那个图书馆。)