4

我们使用 Spring 及其内置的 MappingJacksonHttpMessageConverter 生成大量 JSON 对象。都很棒。

但现在我想用html 转义我的(任何类型的)对象的字符串值,以防止 XSS。

那么,我该如何解决这个问题呢?我首先想到我可以编写一个自定义对象映射器并将其放入 MappkingJacksonHttpMessageConverter。但是,writeValue 需要一个对象,我不希望这样,我想让它的字段进行迭代。我敢打赌,杰克逊转换器也需要这样做,而不是我自己这样做。所以我想影响那部分。

现在我得到了一个 SerializerProvider 接口。标准实现(StdSerializerProvider)被 ObjectMapper 调用。所以我想在某个地方覆盖/影响负责设置值的方法。

那可能吗?据我所知,很难扩展。我无法覆盖 StdSerializerProvider 来覆盖 ObjectMapper 使用的方法。也许我需要覆盖另一个?

或者,也许这是完全错误的,我需要从一个完全不同的角度来处理它?

有什么想法吗?

哦,顺便说一句,我自己实现 SerializerProvider 并创建一个委托给 StdSerializerProvider 的合成可能是可能的,但我宁愿不这样做。(我自己在实例化 StdSerializerProvider 时已经遇到问题)。

任何想法表示赞赏!

4

2 回答 2

4

有多种方法,具体取决于您如何识别要逃避的事物。一些想法:

  • 如果你想引用/转义所有字符串,你可以定义自定义字符串序列化器
  • 您可以先序列化为 JSON 树 (JsonNode) -- ObjectMapper.convertValue(pojo, JsonNode.class) -- 修改它,然后序列化为 JSON (ObjectMapper.writeValue(intermediateTree))
  • 如果您想要一个灵活的系统,您可以在其中为需要特殊处理的字段添加注释,您可以使用 ContextualSerializers 的 Jackson 1.7 功能;可以根据注释重新配置自身的自定义序列化程序。一开始可能看起来有点矫枉过正,但这可以用来轻松指定自定义修饰符(值为 Class 的注释属性,指示序列化程序可以调用以修改正在序列化的值的对象——比如转义)
于 2011-02-16T07:39:24.927 回答
1

给出了这个答案,而问题是关于验证字符串不包含 XSS 并且不转义。如果您想转义字符串,此答案将无济于事。

使用JSR 303 Bean Validation验证创建的对象(命令对象)怎么样?

例如,通过对“命令对象”的字符串属性使用非 @NotHtml(注释和验证)。

当然你必须自己实现@NotHtml(@NotJavaScript 或@NotXSS)注解和验证器。

于 2011-02-15T16:49:45.350 回答