2013-02-28 145 views
0

我将使用Jackson Mapper在Spring MVC中转义HTML以避免XSS攻击。

我寻找逃避与杰克逊单独和如何在春季配置杰克逊。
我试图出口JSON包含“<”“>文本”,我希望他们逃脱&#60;&#62;

比如我加了附带一些文本“粗体标签” <b>,我希望看到的是纯黑体标记文本在前端html中,但最终在前端HTML页面中以粗体显示文本。使用Spring MVC和Jackson Mapper进行HTML转义

下面是我的做法,我不知道为什么它没有解决。

任何人都可以帮忙吗?

在此先感谢!

public class CustomObjectMapper extends ObjectMapper { 
    public CustomObjectMapper() { 
     this.getJsonFactory().setCharacterEscapes(new CustomCharacterEscapes()); 
    } 
} 

public class CustomCharacterEscapes extends CharacterEscapes { 
    private final int[] asciiEscapes; 

    public CustomCharacterEscapes() { 
     int[] esc = CharacterEscapes.standardAsciiEscapesForJSON(); 
     esc['<'] = CharacterEscapes.ESCAPE_STANDARD; 
     esc['>'] = CharacterEscapes.ESCAPE_STANDARD; 
     esc['&'] = CharacterEscapes.ESCAPE_STANDARD; 
     esc['\''] = CharacterEscapes.ESCAPE_STANDARD; 
     asciiEscapes = esc; 
    } 

    @Override 
    public int[] getEscapeCodesForAscii() { 
     return asciiEscapes; 
    } 

    @Override 
    public SerializableString getEscapeSequence(int ch) { 
     return null; 
    } 
} 

<bean 
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <property name="messageConverters"> 
     <array> 
      <bean id="jsonConverter" 
       class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> 
       <property name="objectMapper"> 
        <bean class="x.y.z.CustomObjectMapper" /> 
       </property> 
      </bean> 
     </array> 
    </property> 
</bean> 

+0

首先几个一般意见...我会建议重新访问您的标点符号。我很清楚,这个网站上的很多人不会说土着英语,但是你的发帖是一个巨大的启动语句。为了了解每个陈述的结尾,我必须阅读它三次。另外,将你的代码分成两个独立的块。该网站认为Java代码是XML,因为你把它们全部弄混了。这样我们可以看到一些语法突出显示。 – CodeChimp 2013-02-28 13:29:58

+0

一般性评论不谈,你能解释一下你准备做什么吗?如果我能听到我读到的东西,这听起来像你试图返回HTML,但使用MappingJacksonHttpMessageConverter转换一些特殊字符?你为什么使用MappingJacksonHttpMessageConverter呢?你为什么要转换这些角色?或者,你是否说你在JSON响应中返回HTML,默认情况下生成的JSON不正确,因为它不会转换字符或将它们恰当地对齐? – CodeChimp 2013-02-28 13:33:06

+0

我已编辑我的帖子,我是一个相当新手,以stackoverflow,感谢您的建议@CodeChimp。 – 2013-03-01 02:28:59

回答

0

我从来没有试图写我自己的HttpMessageConverter,但我没有找到this posting似乎很relavent你想要做什么。在看他们的解决方案与你贴什么在这里,我只能说我发现最大的区别是,你似乎并没有实现/重写以下:

  1. 保护布尔支持(类clazz所),这表明这你需要支持的类类型(如果你希望它足够通用以处理所有可能性,或者你的域对象特定的某个类,我会在你的情况下重新调用这个对象或者可序列化)
  2. protected Object readInternal(Class clazz, HttpInputMessage inputMessage),看起来像它用于请求端
  3. protected void writeInternal(Object t,HttpOutputMessage outputMessage),看起来像它的使用d为响应端

另一种方法可能是简单地创建与@ResponseBody相结合的自定义Jackson序列化程序。或者,更好的是,如果您有一个用户驱动的值,并且将其存储在数据库中,请在插入之前将值转义。这样你根本不需要做任何事情,并且所讨论的价值将从端到端是“安全的”。如果你想变得疯狂,你可以编写一个自定义的java.beans.PropertyEditor来逃避Strings for HTML,并使用InitBinder将其插入到混音中。

最后,我想推荐一下,不要试图自己替换字符,而是使用类似Apache Commons-LangStringEscapeUtils这样的值来转义值。

+0

我是通过制作一个自定义的Jackson序列化程序来完成的。 谢谢@CodeChimp! – 2013-03-02 14:39:59

+1

您应验证输入和转义输出。 – Tommy 2013-11-27 12:51:38

+0

我同意,验证所有输入(包括来自非人类来源的输入)始终是一种良好的做法。 – CodeChimp 2013-11-29 14:31:41