我想知道是否有人可以告诉我这是一个值得考虑的问题,或者如果需要可以解决这个问题。
我们有一个用Java编写的Web服务,它使用Spring Boot构建并在Amazon AWS上运行。我们内部的其他产品和服务使用它。虽然端点是公共端点,但有一些身份验证会阻止公共访问。
我们的一个API接受JSON作为POST方法的参数。我们的QE指出,我们的API不会检测非常JSON数据后的无关数据。例如,假设我们的API期望数据类似于:
{
"name": "John Doe",
"email": "john.doe@example.com"
}
即使提供以下数据,我们的API也不会抱怨:
{
"name": "John Doe",
"email": "john.doe@example.com"
}
Hello, I’m ignored!
我们的API完全忽略了无关的部分。我们使用Jackson来反序列化JSON字符串。我查找了Jackson和Spring文档,但未能找到如何检测到它。
所以,问题是:这是一个安全威胁吗?如果是这样,如何解决这个问题?
谢谢,
马萨
答案 0 :(得分:2)
我深入研究了杰克逊的源代码,得出如下结论。在将json解析为对象时,jackson将解析所有值并将其转换为对象,然后检查解析器是否到达末尾("}")。所以我们可以看到任何字符串追加到"}"不会被带入杰克逊。杰克逊只是忽略了他们并且不会抛出异常。
我认为这不会引起任何安全问题,因为那些字符串在"}"被忽略,他们从未在杰克逊内部使用,因此没有机会进入你的应用程序。如果你真的不想要这个,你可以使用拦截器进行检查。
希望这可以帮到你。
protected Object _unwrapAndDeserialize(JsonParser p, DeserializationContext ctxt,
DeserializationConfig config,
JavaType rootType, JsonDeserializer<Object> deser)
throws IOException
{
...
// ok, then move to value itself....
p.nextToken();
Object result = deser.deserialize(p, ctxt);
// and last, verify that we now get matching END_OBJECT
if (p.nextToken() != JsonToken.END_OBJECT) {
ctxt.reportWrongTokenException(p, JsonToken.END_OBJECT,
"Current token not END_OBJECT (to match wrapper object with root name '%s'), but %s",
expSimpleName, p.getCurrentToken());
}
return result;
}
The Enum
/* Jackson JSON-processor.
*
* Copyright (c) 2007- Tatu Saloranta, tatu.saloranta@iki.fi
*/
package com.fasterxml.jackson.core;
/**
* Enumeration for basic token types used for returning results
* of parsing JSON content.
*/
public enum JsonToken
{
...
/**
* END_OBJECT is returned when encountering '}'
* which signals ending of an Object value
*/
END_OBJECT("}", JsonTokenId.ID_END_OBJECT),
...