使用 Jackson/Java 来确保 JSON 的所有序列化在单引号或双引号内分隔不受信任的数据会转义任何特殊字符?
Posted
技术标签:
【中文标题】使用 Jackson/Java 来确保 JSON 的所有序列化在单引号或双引号内分隔不受信任的数据会转义任何特殊字符?【英文标题】:Using Jackson/Java to ensure that and all serialization to JSON delimits untrusted data within single or double quotes escapes any special characters? 【发布时间】:2017-08-23 17:35:22 【问题描述】:我有以下 Fortify 安全问题:
JSON 注入:确保使用安全的序列化函数执行所有序列化,该函数在单引号或双引号内分隔不受信任的数据并转义任何特殊字符。
下面是我的代码:
public String saveJson(String json, long ID, String userId) throws SQLException, JsonParseException, JsonMappingException, IOException
ObjectMapper objectMapper = new ObjectMapper();
List<item> listOfNewItems = objectMapper.readValue(json, new TypeReference<List<item>>());
userId= userFactory.getUser().getID();
String message = saveJson(listOfNewItems,ID,userId);
return message;
我正在尝试使用
org.codehaus.jackson.io.JsonStringEncoder.getInstance().quoteAsString(json);
或许
objectMapper.configure(JsonGenerator.Feature.QUOTE_FIELD_NAMES, false);
objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
但不确定?
有关错误的更多详细信息:
将未经验证的输入写入 JSON
有什么想法吗?
【问题讨论】:
您发布的问题描述谈到了序列化,但您发布的代码实际上执行了反序列化。您在寻求序列化或反序列化方面的帮助吗? 也许您需要在反序列化之前清理 JSON 字符串? OWASP 的 json sanitizer 看起来很适合。几年前的Here's a short discussion。如果您需要逐字段处理,您可能正在考虑自定义(反)序列化。 This might be a start. 你能提供一个不使用专门序列化功能的json示例和另一个使用专门序列化功能的安全json版本吗?默认 ObjectMapper 应该可以满足您的要求。为什么要更改配置? 【参考方案1】:到目前为止mikaelhg
和gagan singh
的cmets 是正确的:
Jackson ObjectMapper
在其默认设置中已经“确保使用安全的序列化函数执行所有序列化,该函数在单引号或双引号内分隔不受信任的数据并转义任何特殊字符。”
您显示的代码是反序列化的,而不是序列化的(和/或已损坏或复制不正确)
【讨论】:
谢谢你,丰富。您第一点中引用的文字正是我想要的。 (我引用了你的问题) 哈,你做到了。 Objectmapper 文档是否像引用的文本一样以简单、直接的方式陈述了这一事实? 我怀疑它是直接陈述的,因为我认为它从设计目标中是不言而喻的。如果没有正确转义,该库将无法“往返”来自 Java -> JSON -> Java 的任意字符串。 我查看了 Jackson 文档,但找不到任何类似的声明。我认为作者只是认为这是不言而喻的。搜索诸如“杰克逊 json 是否转义字符串”之类的内容会得到类似 javausecase.com/2017/02/22/… 的博客文章以上是关于使用 Jackson/Java 来确保 JSON 的所有序列化在单引号或双引号内分隔不受信任的数据会转义任何特殊字符?的主要内容,如果未能解决你的问题,请参考以下文章
Jackson Java 到 JSON 对象映射器修改字段名称
Jackson2 Java到Json数组在创建数组时忽略字段名称