什么是 SQL 注入攻擊?
SQL 注入就是通過(guò)把 SQL 命令插入到 Web 表單提交或輸入域名或頁(yè)面請(qǐng)求的查詢字符串,服務(wù)器拿到這個(gè)字符串之后,會(huì)把這個(gè)字符串作為 sql 的執(zhí)行參數(shù)去數(shù)據(jù)庫(kù)查詢,然而這個(gè)參數(shù)是惡意的,以至于服務(wù)器執(zhí)行這條 sql 命令之后,出現(xiàn)了問(wèn)題。
下面直接弄個(gè)案例吧,這樣容易理解一些。
比如,在一個(gè)登錄界面,要求輸入用戶名和密碼,可以這樣輸入實(shí)現(xiàn)免帳號(hào)登錄:
用戶名: ‘or 1 = 1 --
密 碼:
用戶一旦點(diǎn)擊登錄,如若沒(méi)有做特殊處理,那么這個(gè)非法用戶就很得意的登陸進(jìn)去了。
這是為什么呢?
下面我們分析一下:從理論上說(shuō),后臺(tái)認(rèn)證程序中可能會(huì)有如下的SQL語(yǔ)句:
String sql = “select * from user_table where username=’ “+userName+” ’ and password=’ “+password+” ‘”;
注:可以左右拉動(dòng),下同
因此,當(dāng)輸入了上面的用戶名和密碼,把參數(shù)代進(jìn)去,則上面的SQL語(yǔ)句變成:
SELECT * FROM user_table WHERE username=’’or 1 = 1 –- and password=’’
分析上述SQL語(yǔ)句我們知道,username=‘ or 1=1 這個(gè)語(yǔ)句一定會(huì)成功;然后后面加兩個(gè)-,在 sql 中,兩個(gè) -這意味著注釋,它將后面的語(yǔ)句注釋,讓他們不起作用。這樣,后面的and password=’’語(yǔ)句將不會(huì)執(zhí)行,所以上述語(yǔ)句永遠(yuǎn)都能正確執(zhí)行,用戶輕易騙過(guò)系統(tǒng),獲取合法身份。
應(yīng)對(duì)方法
(1). 參數(shù)綁定
使用預(yù)編譯手段,綁定參數(shù)是最好的防SQL注入的方法。目前許多的 ORM 框架及 JDBC 等都實(shí)現(xiàn)了 SQL 預(yù)編譯和參數(shù)綁定功能,攻擊者的惡意SQL會(huì)被當(dāng)做SQL 的參數(shù)而不是 SQL 命令被執(zhí)行。
在mybatis的mapper文件中,對(duì)于傳遞的參數(shù)我們一般是使用 # 和$來(lái)獲取參數(shù)值。
當(dāng)使用#時(shí),變量是占位符,就是一般我們使用 javajdbc 的 PrepareStatement 時(shí)的占位符,所有可以防止 sql 注入;當(dāng)使用 $時(shí),變量就是直接追加在sql中,一般會(huì)有 sql 注入問(wèn)題。
(2). 使用正則表達(dá)式過(guò)濾傳入的參數(shù),例如把出現(xiàn)雙-的過(guò)濾掉等等。
--------------END--------------
更多計(jì)算機(jī)網(wǎng)絡(luò)入門文章,可以來(lái)帥地的個(gè)人網(wǎng)站看,之前寫過(guò)一個(gè)極簡(jiǎn)入門教程,網(wǎng)站:https://www.iamshuaidi.com/359.html
注:點(diǎn)擊閱讀原文可以直達(dá),不過(guò)建立PC打開(kāi)。
