在制作Spring Redis数据模板时,我使用:
RedisTemplate<String, xxxDTO> template = new RedisTemplate<>();
然后我还将反序列化器设置为自定义反序列化器,该自定义反序列化器将某些类列入白名单,以防反序列化不安全。
Fortify 不知何故仍然突出:
new RedisTemplate<>();
在输入验证和表示领域内,动态代码评估期间的不安全反序列化。
如何制作RedisTemplate而不被标记?
我遇到了同样的问题,Fortify 扫描报告将其标记为“动态代码评估:不安全的反序列化”。添加解决方案,因为我在 StackOverflow 上没有得到正确的解决方案。
初始代码
@Bean
public RedisTemplate redisTemplate() {
RedisSerializer<String> stringSerializer = new StringRedisSerializer();
RedisTemplate<?, ?> template = new RedisTemplate<>();
template.setConnectionFactory(jedisConnectionFactory());
template.setKeySerializer(stringSerializer);
template.setValueSerializer(stringSerializer);
template.afterPropertiesSet();
return template;
}
问题是由于这条线而发生的
RedisTemplate<?, ?> template = new RedisTemplate<>();
现在,建议使用安全序列化器,我已使用
Jackson2JsonRedisSerializer
来序列化和反序列化对象。我已经在使用 StringRedisSerializer
来表示字符串了。
此外,我初始化了RedisTemplate
解决方案
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisSerializer<String> stringSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer<Object> objectSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(jedisConnectionFactory());
template.setKeySerializer(stringSerializer);
template.setValueSerializer(objectSerializer);
template.setHashKeySerializer(stringSerializer);
template.setHashValueSerializer(objectSerializer);
template.setEnableDefaultSerializer(true);
template.afterPropertiesSet();
return template;
}
这解决了我的 Fortify 问题。
我通过静态代码分析器的尝试和实验找到了自己的答案。 显然,您应该重写 RedisTemplate 类的实现并执行您自己的 jdkserializationredisserializer 实现。
具体来说,您应该重写并创建一个反序列化转换器,该转换器将在构造方法中的 jdkserializationredisserializer 类中调用,因为它默认不使用任何验证(它使用 DeserializingConverter)。然后在反序列化转换器中,您实现白名单方法来指定所需的类。确保您也对它们进行单元测试,因为它们可能具有需要反序列化的依赖类。