如何禁用DefaultTyping。默认情况下是否禁用

2020年12月1日 54点热度 0条评论

我需要确保我正在编写的应用程序没有杰克逊XML / JSON漏洞(CSV)。我所见过的所有讨论都在谈论如何管理它!我要关闭它。

我正在使用最新的Jackson版本2.10.0,最新的Spring Boot 2.1.9和Spring 5.2.0,但是我必须证明使用Jackson是合理的,并且我不需要任何多态行为。

医生说我需要使用activateDefaultTyping()。听起来好像将其打开。我是否需要使用activateDefaultTyping并实现PolymorphicTypeValidator来防止这种情况?我需要这样做以防止所有多态行为吗?

我已经阅读了很多有关管理行为的文章,但是我仍然不清楚默认行为是什么。如果默认情况下是多态的,则需要将其关闭。

解决方案如下:

如果您通过外部API以JSON格式接受来自第三方,应用程序外部的输入,并且您在其中接受Object类型的字段(或其他广泛实现的类,如Serializable),则您很容易受到攻击。然后,潜在的攻击者可以发送(几乎)任何东西,包括在类路径上可用的广泛可用的类(所谓的小工具类),其构造函数或设置器的执行(在反序列化时由Jackson实例化)可能会对系统造成危险的影响。

为了容易受到攻击,您需要在“对象”字段中添加注释

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "@class", visible = true)

或使用

ObjectMapper.enableDefaultTyping()

要么

来自杰克逊2.10.0的ObjectMapper.activateDefaultTyping()

这将告诉Jackson将输入的json反序列化为@class指定的特定类型。

否则,无论发送什么数据,默认情况下都会反序列化为键值映射。

因此,默认情况下,“默认类型”为OFF。

您提到的activateDefaultTyping()仅应与自定义验证器结合使用,以便以解耦的方式定义自己允许反序列化的类型。

简而言之:如果您希望将其关闭并且不需要多态反序列化,请不要使用@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)或不专门启用它。

你也可以打电话

ObjectMapper.deactivateDefaultTyping()以确保未使用它,但请注意,在您的类上使用@JsonTypeInfo不会受到此调用的影响。