JSON for POST方法

时间:2016-09-13 00:00:31

标签: java json spring jackson

我想知道是否有人可以告诉我这是一个值得考虑的问题,或者如果需要可以解决这个问题。

我们有一个用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文档,但未能找到如何检测到它。

所以,问题是:这是一个安全威胁吗?如果是这样,如何解决这个问题?

谢谢,

马萨

1 个答案:

答案 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),
...