SQL注入攻擊的防范

一、SQL注入簡介

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

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

  1. 尋找到SQL注入的位置
  2. 判斷服務(wù)器類型和后臺數(shù)據(jù)庫類型
  3. 針對不通的服務(wù)器和數(shù)據(jù)庫特點進行SQL注入攻擊

三屈呕、SQL注入攻擊實例

比如在一個登錄界面,要求輸入用戶名和密碼:
可以這樣輸入實現(xiàn)免帳號登錄:
用戶名: ‘or 1 = 1 ––
密 碼:
點擊登錄尔觉,如果沒有做特殊處理凉袱,那么這個非法用戶就會很容易的登錄成功。(當(dāng)然現(xiàn)在的有些語言的數(shù)據(jù)庫API已經(jīng)處理了這些問題)

這是為什么呢侦铜?

從理論上說专甩,后臺認(rèn)證程序中會有如下的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 那么這個條件一定會成功钉稍;然后后面加兩個-涤躲,這意味著注釋,它將后面的語句注釋贡未,讓它們不起作用种樱,這樣語句永遠(yuǎn)都能正確執(zhí)行,用戶輕易騙過系統(tǒng)俊卤,獲取合法身份嫩挤。這還是比較溫柔的,如果是執(zhí)行如下:

select * from user_table where
username=’’;DROP DATABASE (DB Name) --’ and password=’’

其后果可想而知消恍。

四岂昭、應(yīng)對方法

針對JSP,應(yīng)對方法如下:

1.(簡單又有效的方法)PreparedStatement

采用預(yù)編譯語句集狠怨,它內(nèi)置了處理SQL注入的能力约啊,只要使用它的setXXX方法傳值即可。

使用好處:
(1) 代碼的可讀性和可維護性佣赖;
(2) PreparedStatement盡最大可能提高性能恰矩;
(3) 最重要的一點是極大地提高了安全性。

原理:
sql注入只對sql語句的準(zhǔn)備(編譯)過程有破壞作用憎蛤。而PreparedStatement已經(jīng)準(zhǔn)備好了外傅,執(zhí)行階段只是把輸入串作為數(shù)據(jù)處理,而不再對sql語句進行解析俩檬、準(zhǔn)備栏豺,因此也就避免了sql注入問題。

2.使用正則表達(dá)式過濾傳入的參數(shù)

要引入的包:
import java.util.regex.*;

正則表達(dá)式:
private String CHECKSQL = “^(.+)\sand\s(.+)|(.+)\sor(.+)\s$”;

判斷是否匹配:
Pattern.matches(CHECKSQL,targerStr);

下面是具體的正則表達(dá)式:

檢測SQL meta-characters的正則表達(dá)式 :
/(%27)|(’)|(–)|(%23)|(#)/ix

修正檢測SQL meta-characters的正則表達(dá)式 :/((%3D)|(=))[^ ]*((%27)|(’)|(–)|(%3B)|(:))/i

典型的SQL 注入攻擊的正則表達(dá)式 :/w*((%27)|(’))((%6F)|o|(%4F))((%72)|r|(%52))/ix

檢測SQL注入豆胸,UNION查詢關(guān)鍵字的正則表達(dá)式 :/((%27)|(’))union/ix(%27)|(’)

檢測MS SQL Server SQL注入攻擊的正則表達(dá)式:

/exec(s|+)+(s|x)pw+/ix

等等奥洼。

3.字符串過濾

比較通用的一個方法:
(||之間的參數(shù)可以根據(jù)自己程序的需要添加)

public static boolean sql_inj(String str){
   String inj_str = "’|and|exec|insert|select|delete|update|
   count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";
   String inj_stra[] = split(inj_str,"|");
   for (int i=0 ; i < inj_stra.length ; i++ ){
     if (str.indexOf(inj_stra[i])>=0){
       return true;
     }
    }
   return false;
}

4.jsp中調(diào)用該函數(shù)檢查是否包函非法字符

防止SQL從URL注入:

sql_inj.java代碼:

import [java.net](http://java.net/).*;
import [java.io](http://java.io/).*;
import java.sql.*;
import java.text.*;
import java.lang.String;

public class sql_inj{
    public static boolean sql_inj(String str){
        String inj_str = "’|and|exec|insert|select|delete|update|
                count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";
                //這里的東西還可以自己添加
                String[] inj_stra=inj_str.split("|");
                for (int i=0 ; i < inj_stra.length ; i++ ){
                    if (str.indexOf(inj_stra[i])>=0){
                        return true;
                    }
                }
                return false;
    }
}

5.JSP頁面判斷代碼:

使用javascript在客戶端進行不安全字符屏蔽

功能介紹:檢查是否含有”‘”,”\”,”/”

參數(shù)說明:要檢查的字符串

返回值:0:是1:不是

函數(shù)名是

function check(a){
    return 1;
    fibdn = new Array (”‘” ,”\”,”/”);
    i=fibdn.length;
    j=a.length;
    for (ii=0; ii<i; ii++)
    { for (jj=0; jj<j; jj++)
    { temp1=a.charAt(jj);
    temp2=fibdn[ii];
    if (tem’; p1==temp2){ 
        return 0; 
    }
    }
    }
    return 1;
}

總的說來,防范一般的SQL注入只要在代碼規(guī)范上下點功夫就可以了晚胡。凡涉及到執(zhí)行的SQL中有變量時灵奖,用JDBC(或者其他數(shù)據(jù)持久層)提供的如:PreparedStatement就可以 嚼沿,切記不要用拼接字符串的方法就可以了。

五瓷患、降低注入攻擊的危害

  1. 把應(yīng)用服務(wù)器的數(shù)據(jù)庫權(quán)限降至最低骡尽,盡可能地減少 SQL 注入攻擊帶來的危害
  2. 避免網(wǎng)站打印出SQL錯誤信息,比如類型錯誤擅编、字段不匹配等攀细,把代碼里的SQL語句暴露出來,以防止攻擊者利用這些錯誤信息進行SQL注入爱态。
  3. 對進入數(shù)據(jù)庫的特殊字符('"\尖括號&*;等)進行轉(zhuǎn)義處理谭贪,或編碼轉(zhuǎn)換。
  4. 所有的查詢語句建議使用數(shù)據(jù)庫提供的參數(shù)化查詢接口锦担,參數(shù)化的語句使用參數(shù)而不是將用戶輸入變量嵌入到SQL語句中俭识,即不要直接拼接SQL語句。
  5. 在測試階段洞渔,建議使用專門的 SQL 注入檢測工具進行檢測套媚。網(wǎng)上有很多這方面的開源工具,例如sqlmap磁椒、SQLninja等堤瘤。
  6. 善用數(shù)據(jù)庫操作庫,有些庫包可能已經(jīng)做好了相關(guān)的防護浆熔,我們只需閱讀其文檔本辐,看是否支持相應(yīng)的功能即可。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蘸拔,一起剝皮案震驚了整個濱河市师郑,隨后出現(xiàn)的幾起案子环葵,更是在濱河造成了極大的恐慌调窍,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件张遭,死亡現(xiàn)場離奇詭異邓萨,居然都是意外死亡,警方通過查閱死者的電腦和手機菊卷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門缔恳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人洁闰,你說我怎么就攤上這事歉甚。” “怎么了扑眉?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵纸泄,是天一觀的道長赖钞。 經(jīng)常有香客問我,道長聘裁,這世上最難降的妖魔是什么雪营? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮衡便,結(jié)果婚禮上献起,老公的妹妹穿的比我還像新娘。我一直安慰自己镣陕,他們只是感情好谴餐,可當(dāng)我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著茁彭,像睡著了一般总寒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上理肺,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天摄闸,我揣著相機與錄音,去河邊找鬼妹萨。 笑死年枕,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的乎完。 我是一名探鬼主播熏兄,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼树姨!你這毒婦竟也來了摩桶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤帽揪,失蹤者是張志新(化名)和其女友劉穎硝清,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體转晰,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡芦拿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了查邢。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蔗崎。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖扰藕,靈堂內(nèi)的尸體忽然破棺而出缓苛,到底是詐尸還是另有隱情,我是刑警寧澤邓深,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布未桥,位于F島的核電站番官,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏钢属。R本人自食惡果不足惜徘熔,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望淆党。 院中可真熱鬧酷师,春花似錦、人聲如沸染乌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽荷憋。三九已至台颠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間勒庄,已是汗流浹背串前。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留实蔽,地道東北人荡碾。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像局装,于是被迫代替她去往敵國和親坛吁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Web安全簡史 在Web1.0時代铐尚,人們更多是關(guān)注服務(wù)器端動態(tài)腳本語言的安全問題拨脉,比如將一個可執(zhí)行腳本(俗稱Web...
    潘良虎閱讀 3,930評論 3 72
  • 隨著當(dāng)今世界網(wǎng)絡(luò)技術(shù)與信息技術(shù)高速發(fā)展,Web應(yīng)用程序具有界面統(tǒng)一宣增,使用簡單玫膀,易于維護,擴展性好统舀,共享度高等優(yōu)先匆骗。...
    高美麗閱讀 3,970評論 0 4
  • 今日收盤點評: 今日上證低開震蕩闷串,創(chuàng)業(yè)板低開低走;兩市較昨天有所縮量筋量;今天房地產(chǎn)烹吵、汽車整車碉熄、超級品牌、造紙肋拔、鋼鐵等...
    學(xué)以致用118閱讀 226評論 0 0
  • 人活著就是為了解決困難锈津。這才是生命的意義,也是生命的內(nèi)容凉蜂。逃避不是辦法琼梆,知難而上往往是解決問題的最好手段。 沒規(guī)劃...
    小記小悟閱讀 154評論 0 0
  • 【最美山西·文化】 春 園 (唐 王勃) 山泉兩處晚窿吩,花柳一園春茎杂。 還持千日醉,共作百年人纫雁。
    張梅霞?xì)g樂誦閱讀 149評論 0 0