sql注入就是經過url或者post提交數據時候,字符串類型的參數會被別人利用傳入sql語句,最終破壞數據庫或者達到一些見不得人的目的。javascript
有時候由於業務須要url中會帶一些參數,好比 ?type=xxx 一些人就會把type寫成sql語句html
好比:?type=’ or 1=1– 最終拼接成的sql語句就變成了:select * from table where disabled=0 and type=」 or 1=1 – and id=1 如此一來 – 後面的條件就會被屏蔽,結果就成了 1=1 也就是查詢這張表全部數據。java
這還算是最溫柔的,更有甚者,把輸入的參數變成update delete drop 不就麻煩大了。web
跨站攻擊和連接注入差很少,會有一些java、html的代碼注入進來。同樣的處理。spring
下面說一下最簡單、直接、有效的方式吧:sql
直接寫一個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配置中加入攔截器:spring-mvc
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="org.jeecgframework.core.interceptors.SqlInjectInterceptor" />
</mvc:interceptor>
至此,測試一波,基本解決問題。轉載請註明出處@Sychelmarkdown