Javascript 如何让杰克逊逃离a</脚本>;在输出字符串中?
我有一个简单的Java对象,我正在使用Jackson将其序列化为JSON,然后在初始化JavaScript对象时将其放入JSP页面中的Javascript 如何让杰克逊逃离a</脚本>;在输出字符串中?,javascript,jsp,jackson,Javascript,Jsp,Jackson,我有一个简单的Java对象,我正在使用Jackson将其序列化为JSON,然后在初始化JavaScript对象时将其放入JSP页面中的标记中。e、 g <script>SomeLib.load(${someObject});</script> SomeLib.load(${someObject}); 除非someObject的某个字段是包含“”的字符串,否则这非常有效,因为。也就是说,如果输出如下所示: <script>SomeLib.load({"som
标记中。e、 g
<script>SomeLib.load(${someObject});</script>
SomeLib.load(${someObject});
除非someObject的某个字段是包含“
”的字符串,否则这非常有效,因为。也就是说,如果输出如下所示:
<script>SomeLib.load({"someValue":"hacked!</script>"});</script>
SomeLib.load({“someValue”:“hacked!”});
然后浏览器(目前为止在Chrome和FF中都进行了测试)相信被黑客攻击后的
标记代码>正在关闭脚本标记。这会破坏JavaScript并使用户可见“});
有没有办法让Jackson以某种方式转义该值以解决此问题?您可以使用JSTL函数fn:replace()
来转义开始的是错误的。请参阅我的评论
一个更好的方法是在中转义斜杠,只要转义xml,就需要一个库,除非您可以使用jstl,但是因为它看起来像是在使用一种标记库,所以只需使用jstl函数库的escapexml或核心jstl库的“out”“它通过default@zack6849这不太正确,因为escapeXml=“true”
也会对引号进行转义,你会得到{&";someValue";:";hacked!";}
转义正斜杠/
是我经常看到的对付这种“攻击”的常见模式不,这是行不通的,因为代码实际上就在那个JavaScript字符串中(它不是unscaped)。这是错误的。如果原始数据包含“”,则代码会将其损坏为“
<script>SomeLib.load(${fn:replace(jsonString, "<", "<")});</script>
<script>SomeLib.load({"someValue":"hacked!</script>"});</script>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<script>
var json = '${fn:replace(jsonString, "<", "<")}';
SomeLib.load(JSON.parse(json.replace("<", "<")));
</script>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
...
<script>SomeLib.load(${fn:replace(jsonString, "</", "<\\/")});</script>