java - 如何禁用默认打字。是否默认禁用

标签 java spring-boot jackson polymorphism

我需要确保我正在编写的应用程序没有 Jackson XML/JSON 漏洞 (CSV)。我看到的所有讨论都在讨论如何管理它!我想把它关掉。

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

文档说我需要使用 activateDefaultTyping()。这听起来好像它打开了。我是否需要使用 activateDefaultTyping 并实现 PolymorphicTypeValidator 来防止它?我需要这个来防止所有多态行为吗?

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

最佳答案

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

为了容易受到攻击,您需要将对象字段注释为

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

或使用

ObjectMapper.enableDefaultTyping()

ObjectMapper.activateDefaultTyping()来自 jackson 2.10.0

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

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

因此默认情况下“默认输入”是关闭的。

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

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

您也可以调用

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

关于java - 如何禁用默认打字。是否默认禁用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58302380/

相关文章:

java - 如何在 spring mvc 中使用 servlet 3.1?

java - 如何验证param实际上是Json,而不仅仅是字符串

java - HTML 输入转义 - 正确的方法是什么?

java - 为什么 Jackson 库内部实现利用 getter 调用来生成 Json

java - 在 Spring 上下文创建之前执行操作

java - 在actionPerformed java中声明整数

java - 在哪里可以找到适用于 Java ME 的良好二维代码库?

java - 根据级别从链表中删除对象

java - 验证不适用于 Spring Boot 和 Hibernate

spring - 如何在 Spring Boot 和 Spring WebFlux 中使用 "Functional bean definition Kotlin DSL"?