在Spring MVC项目中,我有控制器以各种对象的形式返回数据。稍后,这些对象被序列化为JSON,并且JSON作为对客户端的响应而返回。
这是通过在应用程序配置中注册自定义MappingJackson2HttpMessageConverter
和configureMessageConverters()
来实现的。转换器使用
jackson.databind.ObjectWriter.writeValue(jackson.core.JsonGenerator, object)
用于对象序列化。
现在我需要实施XSS保护。由于所有数据都经过序列化步骤,我想在此处过滤字符串值,删除除白名单中的所有符号(字母数字和一些标点符号)。
有没有办法为Jackson提供一个过滤器,可以在序列化过程中编辑String值?
答案 0 :(得分:1)
我有一个MappingJackson2HttpMessageConverter
的实例。在方法writeInternal(Object object, HttpOutputMessage outputMessage)
中,我创建了一个自定义映射器的实例:mapper = new KJsonMapper();
然后在此处使用此映射器生成JSON。
KJsonMapper.java:
public class KJsonMapper extends ObjectMapper {
public KJsonMapper() {
enableAntiXSS();
}
private void enableAntiXSS() {
SimpleModule module = new SimpleModule("Anti-XSS Serializer",
new Version(1, 0, 0, "FINAL", "klab", "klab.anti-xss-serializer"));
module.addSerializer(String.class, new KJsonAntiXssSerializer());
registerModule(module);
}
}
映射器本身使用自定义JsonSerializer,它提供反xss过滤。
KJsonAntiXssSerializer.java:
public class KJsonAntiXssSerializer extends JsonSerializer<String> {
public void serialize(String value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
throws IOException {
if (value == null) {
return;
}
String encodedValue = antiXss(value);
jsonGenerator.writeString(encodedValue);
}
private String antiXss(String value) {
// return processed value from here
}
}