Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java POST方法的JSON中的无关postfixed数据 我想知道有没有人能告诉我这是一个值得考虑的问题,还是需要解决的问题。_Java_Json_Spring_Jackson - Fatal编程技术网

Java POST方法的JSON中的无关postfixed数据 我想知道有没有人能告诉我这是一个值得考虑的问题,还是需要解决的问题。

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也

我们有一个用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"
}
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不会读取超过最终
}
的数据,因此不可能通过读取大量数据来拒绝服务。在这种情况下,允许的数据大小限制(即在最终
}
之前)可能有意义,但可能已经包括在内。