Java POST方法的JSON中的无关postfixed数据 我想知道有没有人能告诉我这是一个值得考虑的问题,还是需要解决的问题。
我们有一个用Java编写的web服务,它使用Spring Boot构建并运行在AmazonAWS上。我们的其他产品和服务在内部使用此功能。尽管端点是公共的,但是存在一些阻止公共访问的身份验证 我们的一个API接受JSON作为POST方法的参数。我们的QE指出,我们的API不会检测JSON数据之后的无关数据。例如,假设我们的API需要如下数据:Java POST方法的JSON中的无关postfixed数据 我想知道有没有人能告诉我这是一个值得考虑的问题,还是需要解决的问题。,java,json,spring,jackson,Java,Json,Spring,Jackson,我们有一个用Java编写的web服务,它使用Spring Boot构建并运行在AmazonAWS上。我们的其他产品和服务在内部使用此功能。尽管端点是公共的,但是存在一些阻止公共访问的身份验证 我们的一个API接受JSON作为POST方法的参数。我们的QE指出,我们的API不会检测JSON数据之后的无关数据。例如,假设我们的API需要如下数据: { "name": "John Doe", "email": "john.doe@example.com" } 即使提供以下数据,我们的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文档,但无法找到如何检测到这一点
所以,问题是:这是一种安全威胁吗?如果是,如何解决这个问题
谢谢
Masa我对Jackson的源代码进行了一点挖掘,得出如下结论。将json解析为object时,jackson将解析所有值并将其转换为object,然后检查解析器是否到达末尾(“}”)。所以我们可以看到“}”之后的任何字符串追加都不会被带入jackson。杰克逊只是忽略它们,不会抛出异常 我认为这不会导致任何安全问题,因为“}”后面的字符串被忽略,它们在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;
}
我深入研究了一下Jackson的源代码,得出如下结论。将json解析为object时,jackson将解析所有值并将其转换为object,然后检查解析器是否到达末尾(“}”)。所以我们可以看到“}”之后的任何字符串追加都不会被带入jackson。杰克逊只是忽略它们,不会抛出异常 我认为这不会导致任何安全问题,因为“}”后面的字符串被忽略,它们在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;
}
简而言之:JSON不会读取超过最后的}
,因此不可能通过读取大量数据来拒绝服务。允许的数据大小限制(即在最终}
之前)在此上下文中可能有意义,但可能已经包含在内。简言之:JSON不会读取超过最终}
的数据,因此不可能通过读取大量数据来拒绝服务。在这种情况下,允许的数据大小限制(即在最终}
之前)可能有意义,但可能已经包括在内。