我有一个简单的 Java 对象,我使用 Jackson 将其序列化为 JSON,然后将其放入 <script>
中。我的 JSP 页面中的标记作为初始化 JavaScript 对象的一部分。例如
<script>SomeLib.load(${someObject});</script>
这很好用除非 someObject 的字段之一是包含"</script>"
的字符串, 因为 this issue .也就是说,如果输出如下所示:
<script>SomeLib.load({"someValue":"hacked!</script>"});</script>
然后浏览器(目前已在 Chrome 和 FF 中测试)相信 </script>
在 hacked!
之后标记正在关闭脚本标签。这会破坏 JavaScript 并留下 "});</script>
对用户可见。
有没有办法让 Jackson 以某种方式摆脱这个值(value),从而解决这个问题?
最佳答案
Ravis answer是错的。在那里查看我的评论。
更好的方法是转义 </
中的斜线带有反斜杠,例如:
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
...
<script>SomeLib.load(${fn:replace(jsonString, "</", "<\\/")});</script>
注意:需要两个反斜杠,以便第一个反斜杠在 JSP 语法中被转义。
好的部分是,它不需要特殊的解码。
PS:要在 Jackson 方面执行此操作,请参阅 this blog - 它涵盖了转义其他字符,但只需将斜杠添加到列表中即可转义(所有)斜杠字符。
关于javascript - 如何让 Jackson 在输出字符串中转义 </script>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28288322/