1. 程式人生 > 實用技巧 >防止XSS指令碼注入-前端vue、後端springboot

防止XSS指令碼注入-前端vue、後端springboot

作者時間
雨中星辰 2020-09-10

xss是什麼

跨站指令碼攻擊(XSS),是目前最普遍的Web應用安全漏洞。這類漏洞能夠使得攻擊者嵌入惡意指令碼程式碼到正常使用者會訪問到的頁面中,當正常使用者訪問該頁面時,則可導致嵌入的惡意指令碼程式碼的執行,從而達到惡意攻擊使用者的目的。

xss指令碼注入演示

  1. 通過表單,先新增一個數據,其中一條資料為指令碼
插入資料
  1. 重新整理頁面
重新整理頁面

從截圖看,注入的指令碼已經執行了。

防止xss指令碼注入的原理

將引數中的特殊字元進行轉換
處理前為:

<script>alert(1);</script>

處理後為:

&lt;script&gt;alert(1);&lt;/script&gt;

後臺springboot 防止xss注入配置

  1. 新增依賴

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-text</artifactId>
        <version>1.8</version>
    </dependency>
    
  1. 新增xss過濾器

import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringEscapeUtils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

//用於將html引數轉義
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {

    public XssHttpServletRequestWrapper(HttpServletRequest request) {
        super(request);
    }

    @Override
    public String getQueryString() {
        return StringEscapeUtils.escapeHtml4(super.getQueryString());
    }

    @Override
    public String getParameter(String name) {
        return StringEscapeUtils.escapeHtml4(super.getParameter(name));
    }

    @Override
    public String[] getParameterValues(String name) {
        String[] values = super.getParameterValues(name);
        if (ArrayUtils.isEmpty(values)) {
            return values;
        }
        int length = values.length;
        String[] escapeValues = new String[length];
        for (int i = 0; i < length; i++) {
            escapeValues[i] = StringEscapeUtils.escapeHtml4(values[i]);
        }
        return escapeValues;
    }

}
  1. JSON字串請求引數處理

實現Jackson反序列化方法,將引數值轉義處理

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import org.apache.commons.lang3.StringEscapeUtils;

import java.io.IOException;

public class XssJacksonDeserializer extends JsonDeserializer<String> {

    @Override
    public String deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
        return StringEscapeUtils.escapeHtml4(jsonParser.getText());
    }

}
  1. SON字串響應結果處理

實現Jackson序列化方法,將引數值轉義處理


import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringEscapeUtils;

import java.io.IOException;

@Slf4j
public class XssJacksonSerializer extends JsonSerializer<String> {

    @Override
    public void serialize(String s, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        jsonGenerator.writeString(StringEscapeUtils.escapeHtml4(s));
    }

}
  1. xxs攔截器

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

@Slf4j
@WebFilter(filterName = "xssFilter", urlPatterns = "/*", asyncSupported = true)
public class XssFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        XssHttpServletRequestWrapper xssHttpServletRequestWrapper = new XssHttpServletRequestWrapper(request);
        filterChain.doFilter(xssHttpServletRequestWrapper, servletResponse);
    }

    /**
     * springboot預設的json庫為jackson,將其配置xss
     * @param builder
     * @return
     */
    @Bean
    @Primary
    public ObjectMapper xssObjectMapper(Jackson2ObjectMapperBuilder builder) {
        //解析器
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        //註冊xss解析器
        SimpleModule xssModule = new SimpleModule("XssStringJsonSerializer");
        xssModule.addSerializer(new XssJacksonSerializer());
        xssModule.addDeserializer(String.class,new XssJacksonDeserializer());
        objectMapper.registerModule(xssModule);
        //返回
        return objectMapper;
    }

}
  1. 啟動類新增@ServletComponentScan註解,掃描使用servlet註解的類,啟用 XssFilter

前端vue 防止xss指令碼注入

vue防止xss注入

  • 儘量使用插值表示式{{}},它會把要顯示的內容轉為字串。
  • 如果使用v-html,要保證來自服務端的渲染資料都是安全的。
  • 在使用第三方UI元件庫的的時候,要檢查一下它們渲染頁面的方式,是否使用了v-html

引用:

https://springboot.plus/guide/xss.html#%E5%90%8E%E5%8F%B0%E5%A4%84%E7%90%86

https://github.com/lynnic26/LynnNote/issues/1



作者:雨中星辰0
連結:https://www.jianshu.com/p/64b12be27f77
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。