基于springboot的sql防注入過濾器

何為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接口的三個方法面哼。


image.png

第二步:

在SqlFilter類上添加兩個注解:@WebFilter @Configuration

@WebFilter(urlPatterns = "/*",filterName = "sqlFilter") :

urlPatterns:表示過濾的范圍野宜," /* "表示過濾所有請求路徑,"/project/user/login" 則表示過濾http://localhost:8080/project/user/login這個路徑的請求魔策。

filterName:表示這個過濾器的名稱

@Configuration:表明當(dāng)前類是一個配置類匈子。

image

第三步:

在springboot啟動類上增加一個注解:

@ServletComponentScan()

basePackages:過濾器的路徑。

image

第四步:

編寫過濾條件:在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() {

    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市堕仔,隨后出現(xiàn)的幾起案子擂橘,更是在濱河造成了極大的恐慌,老刑警劉巖摩骨,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件通贞,死亡現(xiàn)場離奇詭異,居然都是意外死亡恼五,警方通過查閱死者的電腦和手機昌罩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來灾馒,“玉大人茎用,你說我怎么就攤上這事。” “怎么了轨功?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵旭斥,是天一觀的道長。 經(jīng)常有香客問我古涧,道長垂券,這世上最難降的妖魔是什么这刷? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任疯溺,我火速辦了婚禮,結(jié)果婚禮上袋励,老公的妹妹穿的比我還像新娘柒昏。我一直安慰自己凳宙,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布职祷。 她就那樣靜靜地躺著近速,像睡著了一般。 火紅的嫁衣襯著肌膚如雪堪旧。 梳的紋絲不亂的頭發(fā)上削葱,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機與錄音淳梦,去河邊找鬼析砸。 笑死,一個胖子當(dāng)著我的面吹牛爆袍,可吹牛的內(nèi)容都是我干的首繁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼陨囊,長吁一口氣:“原來是場噩夢啊……” “哼弦疮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蜘醋,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤胁塞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后压语,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體啸罢,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年胎食,在試婚紗的時候發(fā)現(xiàn)自己被綠了扰才。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡厕怜,死狀恐怖衩匣,靈堂內(nèi)的尸體忽然破棺而出蕾总,到底是詐尸還是另有隱情,我是刑警寧澤琅捏,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布谤专,位于F島的核電站,受9級特大地震影響午绳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜映之,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一拦焚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧杠输,春花似錦赎败、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鹦牛,卻和暖如春搞糕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背曼追。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工窍仰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人礼殊。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓驹吮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親晶伦。 傳聞我的和親對象是個殘疾皇子碟狞,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,601評論 2 353