溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

防止web項(xiàng)目中的SQL注入方法有哪些

發(fā)布時(shí)間:2021-12-03 15:06:19 來源:億速云 閱讀:98 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“防止web項(xiàng)目中的SQL注入方法有哪些”,在日常操作中,相信很多人在防止web項(xiàng)目中的SQL注入方法有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”防止web項(xiàng)目中的SQL注入方法有哪些”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

    一、SQL注入簡(jiǎn)介

    SQL注入是比較常見的網(wǎng)絡(luò)攻擊方式之一,它不是利用操作系統(tǒng)的BUG來實(shí)現(xiàn)攻擊,而是針對(duì)程序員編寫時(shí)的疏忽,通過SQL語句,實(shí)現(xiàn)無賬號(hào)登錄,甚至篡改數(shù)據(jù)庫。

    二、SQL注入攻擊的總體思路

    • 1.尋找到SQL注入的位置

    • 2.判斷服務(wù)器類型和后臺(tái)數(shù)據(jù)庫類型

    • 3.針對(duì)不同的服務(wù)器和數(shù)據(jù)庫特點(diǎn)進(jìn)行SQL注入攻擊

    三、SQL注入攻擊實(shí)例

    比如在一個(gè)登錄界面,要求輸入用戶名和密碼:

    可以這樣輸入實(shí)現(xiàn)免帳號(hào)登錄:

    用戶名: ‘or 1 = 1 –

    密 碼:

    點(diǎn)登陸,如若沒有做特殊處理,那么這個(gè)非法用戶就很得意的登陸進(jìn)去了.(當(dāng)然現(xiàn)在的有些語言的數(shù)據(jù)庫API已經(jīng)處理了這些問題)

    這是為什么呢? 下面我們分析一下:

    從理論上說,后臺(tái)認(rèn)證程序中會(huì)有如下的SQL語句:

    String sql = "select * from user_table where username=
    ' "+userName+" ' and password=' "+password+" '";
    
    當(dāng)輸入了上面的用戶名和密碼,上面的SQL語句變成:
    SELECT * FROM user_table WHERE username=
    ''or 1 = 1 -- and password=''
    
    """
    分析SQL語句:
    條件后面username=”or 1=1 用戶名等于 ” 或1=1 那么這個(gè)條件一定會(huì)成功;
    
    然后后面加兩個(gè)-,這意味著注釋,它將后面的語句注釋,讓他們不起作用,這樣語句永遠(yuǎn)都能正確執(zhí)行,用戶輕易騙過系統(tǒng),獲取合法身份。
    這還是比較溫柔的,如果是執(zhí)行
    SELECT * FROM user_table WHERE
    username='' ;DROP DATABASE (DB Name) --' and password=''
    其后果可想而知…
    """

    四、如何防御SQL注入

    注意:但凡有SQL注入漏洞的程序,都是因?yàn)槌绦蛞邮軄碜钥蛻舳擞脩糨斎氲淖兞炕騏RL傳遞的參數(shù),并且這個(gè)變量或參數(shù)是組成SQL語句的一部分,

    對(duì)于用戶輸入的內(nèi)容或傳遞的參數(shù),我們應(yīng)該要時(shí)刻保持警惕,這是安全領(lǐng)域里的「外部數(shù)據(jù)不可信任」的原則,縱觀Web安全領(lǐng)域的各種攻擊方式,

    大多數(shù)都是因?yàn)殚_發(fā)者違反了這個(gè)原則而導(dǎo)致的,所以自然能想到的,就是從變量的檢測(cè)、過濾、驗(yàn)證下手,確保變量是開發(fā)者所預(yù)想的。

    1、檢查變量數(shù)據(jù)類型和格式

    如果你的SQL語句是類似where id={$id}這種形式,數(shù)據(jù)庫里所有的id都是數(shù)字,那么就應(yīng)該在SQL被執(zhí)行前,檢查確保變量id是int類型;如果是接受郵箱,那就應(yīng)該檢查并嚴(yán)格確保變量一定是郵箱的格式,其他的類型比如日期、時(shí)間等也是一個(gè)道理??偨Y(jié)起來:只要是有固定格式的變量,在SQL語句執(zhí)行前,應(yīng)該嚴(yán)格按照固定格式去檢查,確保變量是我們預(yù)想的格式,這樣很大程度上可以避免SQL注入攻擊。

    比如,我們前面接受username參數(shù)例子中,我們的產(chǎn)品設(shè)計(jì)應(yīng)該是在用戶注冊(cè)的一開始,就有一個(gè)用戶名的規(guī)則,比如5-20個(gè)字符,只能由大小寫字母、數(shù)字以及一些安全的符號(hào)組成,不包含特殊字符。此時(shí)我們應(yīng)該有一個(gè)check_username的函數(shù)來進(jìn)行統(tǒng)一的檢查。不過,仍然有很多例外情況并不能應(yīng)用到這一準(zhǔn)則,比如文章發(fā)布系統(tǒng),評(píng)論系統(tǒng)等必須要允許用戶提交任意字符串的場(chǎng)景,這就需要采用過濾等其他方案了。

    2、過濾特殊符號(hào)

    對(duì)于無法確定固定格式的變量,一定要進(jìn)行特殊符號(hào)過濾或轉(zhuǎn)義處理。

    3、綁定變量,使用預(yù)編譯語句

    MySQL的mysqli驅(qū)動(dòng)提供了預(yù)編譯語句的支持,不同的程序語言,都分別有使用預(yù)編譯語句的方法

    實(shí)際上,綁定變量使用預(yù)編譯語句是預(yù)防SQL注入的最佳方式,使用預(yù)編譯的SQL語句語義不會(huì)發(fā)生改變,在SQL語句中,變量用問號(hào)?表示,黑客即使本事再大,也無法改變SQL語句的結(jié)構(gòu)

    到此,關(guān)于“防止web項(xiàng)目中的SQL注入方法有哪些”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI