在json字符串
上使用ESAPI.encoder().canonicalize
时
输入:
{ "key1":"some data b\"h" }
输出:
{ "key1":"somedata b"h" }
输出不再是有效的json字符串。
如何保留原始\“以便有一个有效的json字符串进行进一步处理?
答案 0 :(得分:0)
ESAPI.encoder().canonicalize
使用多个编解码器对字符串进行解码。默认情况下它会执行以下操作:
DefaultEncoder encoder = new DefaultEncoder(Arrays.asList(
HTMLEntityCodec.class.getName(),
PercentCodec.class.getName(),
JavaScriptCodec.class.getName()
));
encoder.canonicalize(...);
JavaScript编解码器将\"
替换为"
。使用JSON数据最终会破坏输入。您可以改为创建DefaultEncoder
的实例而不包含JavaScriptCodec
,或者根本不对其进行规范化。它并不了解JSON格式,因此规范化并没有做任何有用的事情。
要防止XSS,您需要注意如何将JSON字符串传递给客户端,以及如何使用它的内容。这包括在输出数据时对数据进行编码,以及使用innerHTML等检查添加到DOM的任何内容。