何為SQL注入
SQL注入即是指web應(yīng)用程序?qū)τ脩糨斎霐?shù)據(jù)的合法性沒有判斷或過濾不嚴(yán),攻擊者可以在web應(yīng)用程序中事先定義好的查詢語句的結(jié)尾上添加額外的SQL語句,在管理員不知情的情況下實現(xiàn)非法操作幔摸,以此來實現(xiàn)欺騙數(shù)據(jù)庫服務(wù)器執(zhí)行非授權(quán)的任意查詢,從而進一步得到相應(yīng)的數(shù)據(jù)信息。
舉例:
select * from login_user where username = ? and password = ?
假如這是一個用戶登錄時的查詢語句秀姐。
如果沒有sql防注入措施,那么當(dāng)攻擊者輸入 '' or 1 = 1 時若贮,username = '' or 1 = 1 省有,這條查詢語句必然會通過,導(dǎo)致攻擊者可以隨意登錄谴麦。
基于springboot的sql防注入過濾器
我們可以通過構(gòu)建一個過濾器蠢沿,過濾每個消息,如果消息是那種敏感詞匯匾效,則過濾掉舷蟀。
第一步:
新建一個SqlFilter類實現(xiàn)Filter接口,相應(yīng)地實現(xiàn)Filter接口的三個方法面哼。
第二步:
在SqlFilter類上添加兩個注解:@WebFilter @Configuration
@WebFilter(urlPatterns = "/*",filterName = "sqlFilter") :
urlPatterns:表示過濾的范圍野宜," /* "表示過濾所有請求路徑,"/project/user/login" 則表示過濾http://localhost:8080/project/user/login這個路徑的請求魔策。
filterName:表示這個過濾器的名稱
@Configuration:表明當(dāng)前類是一個配置類匈子。
第三步:
在springboot啟動類上增加一個注解:
@ServletComponentScan()
basePackages:過濾器的路徑。
第四步:
編寫過濾條件:在SqlFilter類繼承自Filter接口的doFilter方法中編寫過濾條件闯袒。
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
ServletRequest request = servletRequest;
ServletResponse response = servletResponse;
//獲得所有請求參數(shù)名
Enumeration<String> names = request.getParameterNames();
String sql = "";
while (names.hasMoreElements()){
//得到參數(shù)名
String name = names.nextElement().toString();
//得到參數(shù)對應(yīng)值
String[] values = request.getParameterValues(name);
for (int i = 0; i < values.length; i++) {
sql += values[i];
}
}
if (sqlValidate(sql)){
throw new IOException("您發(fā)送請求中的參數(shù)中含有非法字符");
} else {
filterChain.doFilter(request,response);
}
}
//效驗
protected static boolean sqlValidate(String str){
String s = str.toLowerCase();//統(tǒng)一轉(zhuǎn)為小寫
String badStr =
"select|update|and|or|delete|insert|truncate|char|into|substr|ascii|declare|exec|count|master|into|drop|execute|table|"+
"char|declare|sitename|xp_cmdshell|like|from|grant|use|group_concat|column_name|" +
"information_schema.columns|table_schema|union|where|order|by|" +
"'\\*|\\;|\\-|\\--|\\+|\\,|\\//|\\/|\\%|\\#";//過濾掉的sql關(guān)鍵字虎敦,特殊字符前面需要加\\進行轉(zhuǎn)義
//使用正則表達式進行匹配
boolean matches = s.matches(badStr);
return matches;
}
自此,一個sql防注入過濾器就完成了搁吓。
以下是完整的源碼
package com.kingpoint.kingstd.common.utils;
import org.springframework.context.annotation.Configuration;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
import java.util.Enumeration;
/**
* @Description sql防注入過濾器
*/
@WebFilter(urlPatterns = "/*",filterName = "sqlFilter")
@Configuration
public class SqlFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
ServletRequest request = servletRequest;
ServletResponse response = servletResponse;
//獲得所有請求參數(shù)名
Enumeration<String> names = request.getParameterNames();
String sql = "";
while (names.hasMoreElements()){
//得到參數(shù)名
String name = names.nextElement().toString();
//得到參數(shù)對應(yīng)值
String[] values = request.getParameterValues(name);
for (int i = 0; i < values.length; i++) {
sql += values[i];
}
}
if (sqlValidate(sql)){
throw new IOException("您發(fā)送請求中的參數(shù)中含有非法字符");
} else {
filterChain.doFilter(request,response);
}
}
//效驗
protected static boolean sqlValidate(String str){
String s = str.toLowerCase();//統(tǒng)一轉(zhuǎn)為小寫
String badStr =
"select|update|and|or|delete|insert|truncate|char|into|substr|ascii|declare|exec|count|master|into|drop|execute|table|"+
"char|declare|sitename|xp_cmdshell|like|from|grant|use|group_concat|column_name|" +
"information_schema.columns|table_schema|union|where|order|by|" +
"'\\*|\\;|\\-|\\--|\\+|\\,|\\//|\\/|\\%|\\#";//過濾掉的sql關(guān)鍵字原茅,特殊字符前面需要加\\進行轉(zhuǎn)義
//使用正則表達式進行匹配
boolean matches = s.matches(badStr);
return matches;
}
@Override
public void destroy() {
}
}