【发布时间】:2018-06-14 12:31:31
【问题描述】:
在 Java 中,我们有一些代码接受一个复杂的 java 对象并将其序列化为 json。然后,它将该 json 直接写入页面的标记,在脚本标记中,将其分配给变量。
// Get object as JSON using Jackson
ObjectWriter jsonWriter = new ObjectMapper().writer().withDefaultPrettyPrinter();
String json = jsonWriter.writeValueAsString(complexObject);
// Write JSON out to page, and assign it to a javascript variable.
Writer out = environment.getOut();
out.write("var data = " + json);
复杂对象中可能包含最终用户内容,这可能使我们面临 XSS 攻击。
如何获得一个复杂的 java 对象的 json 版本,其中每个 json 属性 HTML 已转义,以防止 XSS 注入?
我已经阅读了OWASP XSS Guide,到目前为止我想出的最好的就是这个,HTML 转义整个 JSON 字符串,然后撤消引号,因此可以将它分配给 javascript 中的变量。我确信有更好的方法可以做到这一点,但这似乎有效。有什么建议吗?
private String objectToHtmlEscapedJson(Object value) {
try {
String result = jsonWriter.writeValueAsString(value);
result = StringEscapeUtils.escapeHtml(result);
result = result.replace(""", "\"");
return result;
} catch (JsonProcessingException e) {
return "null";
}
}
【问题讨论】:
-
另一种方法可能是遍历对象条目并单独转义每个键和值 - 这样也减少了将格式错误的数据传递给您的 JS 的机会。既然您阅读了 OWASP 指南,您可能还想看看 their anti-XSS encoder。
-
谢谢!这是一个很好的建议。我正在考虑它,但希望 owasp 或其他人已经完成了这项任务。