Javascript 如何让杰克逊逃离a</脚本>;在输出字符串中?

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

我有一个简单的Java对象,我正在使用Jackson将其序列化为JSON,然后在初始化JavaScript对象时将其放入JSP页面中的
标记中。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, "<", "&lt;")});</script>
<script>SomeLib.load({"someValue":"hacked!&lt;/script>"});</script>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<script>
  var json = '${fn:replace(jsonString, "<", "&lt;")}';
  SomeLib.load(JSON.parse(json.replace("&lt;", "<")));
</script>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
...
<script>SomeLib.load(${fn:replace(jsonString, "</", "<\\/")});</script>