SQL注入是一種常見的web攻擊方式,主要是利用后端程序的漏洞,主要針對的是數(shù)據(jù)(以傳統(tǒng)關(guān)系型數(shù)據(jù)為主)進(jìn)行攻擊座菠。攻擊者通過精心構(gòu)造的參數(shù)仪媒,繞過服務(wù)器的驗(yàn)證沉桌,來執(zhí)行惡意SQL語句,SQL注入會(huì)造成脫庫(原始數(shù)據(jù)會(huì)被攻擊者所獲取) 繞過權(quán)限驗(yàn)證算吩,串改留凭、惡意刪除數(shù)據(jù),數(shù)據(jù)往往是一個(gè)網(wǎng)站一個(gè)系統(tǒng)的生命線偎巢,一旦SQL漏洞被攻擊者利用通常會(huì)造成很嚴(yán)重的后果蔼夜,我們對于SQL注入的防范。這一點(diǎn)需要我們的開發(fā)者加倍重視压昼。下面是一個(gè)例子來演示SQL注入的過程求冷。對于一個(gè)登陸驗(yàn)證來說,需要用戶輸入用戶名和密碼進(jìn)行查詢驗(yàn)證窍霞。查詢的SQL語句如下所示:
SELECT * FROM USERS WHERE USERNAME= "$username" AND PASSWORD= "$password";
假定現(xiàn)在攻擊者已知該網(wǎng)站的一個(gè)用戶名:archer2018,那么攻擊者可以構(gòu)造密碼為:"anywords=" or 1=1 此時(shí)匠题,后端程序執(zhí)行的SQL語句為:
SELECT * FROM USERS WHERE USERNAME= "archer2018" AND PASSWORD= "anywords" or 1=1 ;
這樣的話,用戶無論輸入什么密碼都會(huì)繞過驗(yàn)證但金,如果更驗(yàn)證一些 構(gòu)造密碼為:“anywords” or 1=1 ;drop table users韭山,那么整個(gè)表都會(huì)被刪掉。執(zhí)行SQL語句如下所示:
SELECT * FROM USERS WHERE USERNAME= "archer2018" AND password = "anywords" OR 1=1;drop table users;
SQL注入的防范:
SQL注入發(fā)生的絕大多數(shù)情況都是直接使用用戶輸入?yún)?shù)拼接SQL語句造成的冷溃,防范SQL注入钱磅,主要的方式就是丟失避免直接使用用戶輸入的數(shù)據(jù),
1.使用預(yù)編譯語句似枕,(PreparedStatement),一方面可以加速SQL的執(zhí)行速度盖淡,防范SQL注入。(理解PreparedStatementf防范SQL注入的原理凿歼,首先要理解預(yù)編譯語句的原理褪迟,如下圖所示):
SQL 語句的編譯過程,分為以下一個(gè)步驟:
(1).基本解析:包含SQL語句的語法毅往,語義解析牵咙,以及對應(yīng)的表和列是否真實(shí)存在、
(2).編譯:將SQL語句編譯成機(jī)器理解的中間代碼格式攀唯。
(3).查詢優(yōu)化:編譯器在所在的所有的執(zhí)行方案中選擇一個(gè)最優(yōu)的洁桌。
(4).執(zhí)行階段:執(zhí)行最終的查詢方案并且吧執(zhí)行的結(jié)果返回。
2.如果不可避免的要使用SQL拼裝侯嘀,可以對用戶輸入的數(shù)據(jù)進(jìn)行轉(zhuǎn)移另凌,尤其是多單雙引號的轉(zhuǎn)義谱轨。
3.可以對用戶輸入數(shù)據(jù)的表單進(jìn)行輸入限制校驗(yàn)。