使用 com.fasterxml.jackson.databind.ObjectMapper 在序列化/反序列化 JSON 内容期间从异常日志中删除敏感数据

Posted

技术标签:

【中文标题】使用 com.fasterxml.jackson.databind.ObjectMapper 在序列化/反序列化 JSON 内容期间从异常日志中删除敏感数据【英文标题】:Remove sensitive-data from exception logs during serialize/deserialize JSON content while using com.fasterxml.jackson.databind.ObjectMapper 【发布时间】:2021-10-19 01:02:38 【问题描述】:

背景: 我们正在使用 com.fasterxml.jackson.databind.ObjectMapper 的 readValue() 方法将 JSON 转换为 Java POJO。当 JsonParseExceptionJsonMappingException 发生时,原始数据摘录(JSON 内容)正在打印到日志中。

问题: 我们的 JSON 可能包含敏感数据,因此不应记录它以满足安全合规性。

我们正在考虑的选项...

选项1:用JsonParseExceptionJsonMappingException包装readValue()方法并添加clearLocation()

fyi... clearLocation() on JsonParseExceptionJsonMappingException 从异常消息中删除上下文信息

        try 
            objectMapper.readValue(jsonContent, pojoObject);
         catch (JsonParseException | JsonMappingException e) 
            e.clearLocation();
            throw e;
         

此解决方案的缺点是,readValue() 方法在多个应用程序的很多地方都使用。所以我们需要处理大量的代码更改。我们不应该忘记在未来的实现中调用 clearLocation()

选项 2:创建自定义 ObjectMapper

public class CustomObjectMapper 
    private static ObjectMapper objectMapper = new ObjectMapper();
    
    // showing only one method to simplify
    public static <T> T convertJsonToPojo(String content, Class<T> valueType)
            throws IOException, JsonParseException, JsonMappingException 
        try 
            return objectMapper.readValue(content, valueType);
         catch (JsonParseException | JsonMappingException e) 
            e.clearLocation();
            throw e;
         catch (JsonProcessingException e) 
            e.clearLocation();
            throw e;
         catch (Exception e) 
            throw e;
        
    

如果您遇到类似情况并采取不同的处理方式,请告诉我。

【问题讨论】:

不应该只记录您想查看的字段吗?否则即使使用 elk 或 splunk 之类的工具,搜索日志也会非常忙碌 第二个选项没问题,但我会考虑使用方面或异常处理程序。 【参考方案1】:

你可以使用方面;

@Aspect
@Component
public class OMAspect 

    @Around("within(<your base package>..*)")
    public Object aroundOMMethods(ProceedingJoinPoint joinPoint) throws Throwable 
        try 
           return joinPoint.proceed();
         catch (JsonProcessingException e) 
            e.clearLocation();
            throw e;
         catch (Throwable e) 
            throw e;
        
    

【讨论】:

我还认为在这里使用方面会是一个很好的解决方案!

以上是关于使用 com.fasterxml.jackson.databind.ObjectMapper 在序列化/反序列化 JSON 内容期间从异常日志中删除敏感数据的主要内容,如果未能解决你的问题,请参考以下文章

jar包下载地址(fasterxml.jackson)

(转)关于Jackson2.x中com.fasterxml.jackson包的用法

com.fasterxml.jackson.core.JsonParseException:无法识别的令牌

com.fasterxml.jackson.databind.exc.MismatchedInputException:

导入 com.fasterxml.jackson.databind.ObjectMapper 无法解析

fasterxml jackson 的包冲突太垃圾太恶心了: Could not initialize class com.fasterxml.jackson.databind.Seriali...