1. 程式人生 > >Spring MVC通過攔截器處理sql注入、跨站XSS攻擊風險(jeecg)

Spring MVC通過攔截器處理sql注入、跨站XSS攻擊風險(jeecg)

最近一個以前做的政府網站被資訊保安部門掃描了一下,存在一些風險,發了一份安全報告過來。所以開始對這個網站進行安全性升級。其中主要的幾個問題是sql注入風險、跨站xss攻擊和連結注入問題。

首先,什麼是sql注入,度娘一下一大堆,官方語言我就不多說了,說說我自己的理解吧。

sql注入就是通過url或者post提交資料時候,字串型別的引數會被別人利用傳入sql語句,最終破壞資料庫或者達到一些見不得人的目的。

有時候因為業務需要url中會帶一些引數,比如 ?type=xxx 一些人就會把type寫成sql語句

比如:?type=’ or 1=1– 最終拼接成的sql語句就變成了:select * from table where disabled=0 and type=” or 1=1 – and id=1 如此一來 – 後面的條件就會被遮蔽,結果就成了 1=1 也就是查詢這張表所有資料。

這還算是最溫柔的,更有甚者,把輸入的引數變成update delete drop 不就麻煩大了。

跨站攻擊和連結注入差不多,會有一些java、html的程式碼注入進來。一樣的處理。

下面說一下最簡單、直接、有效的方式吧:

直接寫一個spring的攔截器來處理一下,sql注入的就直接攔截不給訪問了,因為一些亂七八糟的引數也是無法正常繼續訪問的,其他注入清理一下就行了:

package org.jeecgframework.core.interceptors;  

import java.util.Enumeration;

import javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class SqlInjectInterceptor implements HandlerInterceptor{ @Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws
Exception { // TODO Auto-generated method stub } @Override public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { // TODO Auto-generated method stub } @Override public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception { Enumeration<String> names = arg0.getParameterNames(); while(names.hasMoreElements()){ String name = names.nextElement(); String[] values = arg0.getParameterValues(name); for(String value: values){ //sql注入直接攔截 if(judgeSQLInject(value.toLowerCase())){ arg1.setContentType("text/html;charset=UTF-8"); arg1.getWriter().print("引數含有非法攻擊字元,已禁止繼續訪問!"); return false; } //跨站xss清理 clearXss(value); } } return true; } /** * 判斷引數是否含有攻擊串 * @param value * @return */ public boolean judgeSQLInject(String value){ if(value == null || "".equals(value)){ return false; } String xssStr = "and|or|select|update|delete|drop|truncate|%20|=|-|--|;|'|%|#|+|,|//|/| |\\|!=|(|)"; String[] xssArr = xssStr.split("\\|"); for(int i=0;i<xssArr.length;i++){ if(value.indexOf(xssArr[i])>-1){ return true; } } return false; } /** * 處理跨站xss字元轉義 * * @param value * @return */ private String clearXss(String value) { if (value == null || "".equals(value)) { return value; } value = value.replaceAll("<", "<").replaceAll(">", ">"); value = value.replaceAll("\\(", "(").replace("\\)", ")"); value = value.replaceAll("'", "'"); value = value.replaceAll("eval\\((.*)\\)", ""); value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\""); value = value.replace("script", ""); return value; } }

然後spring-mvc.xml配置中加入攔截器:

<mvc:interceptor>
            <mvc:mapping path="/**" />
            <bean class="org.jeecgframework.core.interceptors.SqlInjectInterceptor" />
        </mvc:interceptor>

至此,測試一波,基本解決問題。

轉載請註明出處@Sychel