spring mvc jackson 防止XSS 注入方法

最近在做系統防止XSS攻擊功能,從網絡上找到了很多方式,大多都是通過增加過濾器,對request的參數進行過濾,在通常的情況下是有效的,但是在spring mvc中卻無效。

下文方法有效,但只是對輸出的時候有效

-------------------------------------------------------------------------------------------------------------------------------------

在別人的博客上看到一篇解決xss注入的辦法,如下文

spring mvc 做應用時,如果採用接受或者返回 json 格式的數據的時候,有可能會產生 XSS 注入, 對於XSS注入的一個常用方法,就是將接受到的數據進行 escape 處理。如果數量很少的方法,可以自己單獨處理,但如果很多地方用到,最好是用公用的方法,一個簡單的方法就是 擴展jackson 定製自己的 方法,對所有json 格式數據進行escape 處理.
spring mvc json 格式處理配置

 

<!-- http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd -->

<!-- Customize ObjectMapper for XSS -->
    <mvc:annotation-driven>
        <mvc:message-converters>
            <bean
                class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>text/html;charset=UTF-8</value>
                    </list>
                </property>
                <property name="objectMapper">
                    <bean class="com.yihaomen.util.CustomObjectMapper" />
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

 這裏注意定製的 objectMapper 屬性. 具體的實現類如下:

 

 

import java.io.IOException;

import org.springframework.web.util.HtmlUtils;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.Version;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.module.SimpleModule;

public class CustomObjectMapper extends ObjectMapper {
    private static final long serialVersionUID = -3448961813323784217L;

    public CustomObjectMapper() {
        SimpleModule module = new SimpleModule("HTML XSS Serializer",
                new Version(1, 0, 0, "FINAL","com.yihaomen","ep-jsonmodule"));
        module.addSerializer(new JsonHtmlXssSerializer(String.class));
        this.registerModule(module);
    }

    class JsonHtmlXssSerializer extends JsonSerializer<String> {

        public JsonHtmlXssSerializer(Class<String> string) {
            super();
        }

        public Class<String> handledType() {
            return String.class;
        }

        public void serialize(String value, JsonGenerator jsonGenerator,
                SerializerProvider serializerProvider) throws IOException,
                JsonProcessingException {
            if (value != null) {
                String encodedValue = HtmlUtils.htmlEscape(value.toString());
                jsonGenerator.writeString(encodedValue);
            }
        }
    }
}

 在escape 數據的時候,採用了 spring 自帶的工具類 org.springframework.web.util.HtmlUtils; 來處理.這樣就能對所有需要接收json 格式的數據進行統一的處理了,從而避免 XSS 注入。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章