<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    春風(fēng)博客

    春天里,百花香...

    導(dǎo)航

    <2014年11月>
    2627282930311
    2345678
    9101112131415
    16171819202122
    23242526272829
    30123456

    統(tǒng)計(jì)

    公告

    MAIL: junglesong@gmail.com
    MSN: junglesong_5@hotmail.com

    Locations of visitors to this page

    常用鏈接

    留言簿(11)

    隨筆分類(lèi)(224)

    隨筆檔案(126)

    個(gè)人軟件下載

    我的其它博客

    我的鄰居們

    最新隨筆

    搜索

    積分與排名

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    SQL注入攻擊及其防范淺談

    SQL注入攻擊
    SQL注入攻擊的基本原理,是從客戶(hù)端合法接口提交特殊的非法代碼,讓其注入到服務(wù)器端執(zhí)行業(yè)務(wù)的SQL中去,進(jìn)而改變SQL語(yǔ)句的原有邏輯和影響服務(wù)器端正常業(yè)務(wù)的處理。
    SQL注入攻擊是Web應(yīng)用中一個(gè)重要的安全問(wèn)題,雖然Java具備較高的安全性,但如果開(kāi)發(fā)人員不注意,也有可能留下安全隱患,請(qǐng)看示例:

    執(zhí)行驗(yàn)證的SQL語(yǔ)句
    現(xiàn)有一個(gè)Login頁(yè)面用來(lái)控制WebApp的入口,用戶(hù)想要進(jìn)入只有輸入“用戶(hù)名”和“密碼”,負(fù)責(zé)用戶(hù)登錄處理的Servlet接受到請(qǐng)求后,將看數(shù)據(jù)表usertable中是否存在這個(gè)用戶(hù)名和密碼,如果存在則讓其進(jìn)入,否則拒絕,進(jìn)行驗(yàn)證的SQL語(yǔ)句如下:

    select count(*from usertable where name='用戶(hù)名' and pswd='密碼‘

    執(zhí)行完這條SQL語(yǔ)句后,如果記錄數(shù)等于零說(shuō)明在usertable表找不到用戶(hù)名和密碼對(duì)應(yīng)的記錄,應(yīng)該拒絕;如果記錄數(shù)大于零則說(shuō)明能在usertable表中找到對(duì)應(yīng)的記錄,應(yīng)予放行。

    如果用戶(hù)進(jìn)行SQL注入則可使驗(yàn)證無(wú)效

    如果用戶(hù)通過(guò)某種途徑知道或是猜測(cè)出了驗(yàn)證SQL語(yǔ)句的邏輯,他就有可能在表單中輸入特殊字符改變SQL原有的邏輯,比如在名稱(chēng)文本框中輸入“ ‘ or ’1‘=’1‘ or ’1‘=’1 ”或是在密碼文本框中輸入“ 1‘ or ’1‘=’1 ”,SQL語(yǔ)句將會(huì)變成:

    1select count(*from usertable where name='' or '1'='1' or '1'='' and pswd='' 
    2select count(*from usertable where name='' and pswd='1' or '1'='1' 

    明顯,or和單引號(hào)的加入使得where后的條件始終是true原有的驗(yàn)證完全無(wú)效了。

    使用正則表達(dá)式屏蔽特殊字符

    使用SQL注入攻擊多在特殊字符上下手腳,如“’”,“*”,“/” ,”--”等,如果用正則表達(dá)式限制特殊字符輸入,這些手段將沒(méi)有效果。下面的代碼將阻止含有特殊字符的請(qǐng)求。

    if(Pattern.matches("\\w+", name)==false || Pattern.matches("\\w+", pswd)==false ){
      
    // 返回login界面
      request.setAttribute("feedbackMsg""用戶(hù)名和密碼不允許包括特殊字符");
      RequestDispatcher dispatcher 
    = request.getRequestDispatcher("/web/page/login1.jsp?curr=0");
      dispatcher.forward(request, response);
      
    return;
    }

    使用PreparedStatement代替Statement

    SQL注入攻擊能得逞是因?yàn)樵谠蠸QL語(yǔ)句中加入了新的邏輯,如果使用PreparedStatement執(zhí)行SQL語(yǔ)句,其后只是輸入?yún)?shù), SQL注入攻擊手段將無(wú)效,這是因?yàn)?span style="color: #ff0000">PreparedStatement不允許在不同的插入時(shí)間改變查詢(xún)的邏輯結(jié)構(gòu)。示例代碼如下:

    Connection conn=null;
    PreparedStatement ps
    =null
    ResultSet rs
    =null;

    String sql
    =" select count(*) from usertable where name=? and pswd=? ";
    ps
    =conn.prepareStatement(sql);
    ps.setString(
    1, name);
    ps.setString(
    2, pswd);

    PreparedStatement的錯(cuò)誤使用

    用PreparedStatement來(lái)防范SQL注入攻擊是因?yàn)?#8220;因?yàn)镻reparedStatement不允許在不同的插入時(shí)間改變查詢(xún)的邏輯結(jié)構(gòu)”,如果如下使用則起不到這個(gè)效果,因?yàn)镾QL語(yǔ)句和參數(shù)沒(méi)有分開(kāi),它們被組合在一起被一次性提交了。

    Connection conn=null;
    PreparedStatement ps
    =null
    ResultSet rs
    =null;

    。。。。
    conn
    =DBUtil.getConnection(); 
    sql
    =" select count(*) from usertable where name='"+name+"' and pswd='"+pswd+"";
    ps
    =conn.prepareStatement(sql);   
    rs
    =ps.executeQuery();

    這種情況下要防范SQL注入攻擊還是要借助于正則表達(dá)式

    小結(jié)

    1.Web系統(tǒng)通常采用數(shù)據(jù)庫(kù)作為數(shù)據(jù)源,而大多數(shù)業(yè)務(wù)處理都離不開(kāi)SQL語(yǔ)句,因此系統(tǒng)潛在就有被SQL注入攻擊的隱患,攻擊可能會(huì)從任何一次URL提交或是FORM提交中發(fā)起。
    2.使用PreparedStatement執(zhí)行Sql語(yǔ)句比Statement安全得多,如果能使用PreparedStatement就不該用Statement,當(dāng)然SQL主體和參數(shù)應(yīng)該分開(kāi)。
    3.如果因?yàn)橐獔?zhí)行動(dòng)態(tài)多變的SQL語(yǔ)句而不得已采用Statement,則應(yīng)該在服務(wù)器端用正則表達(dá)式進(jìn)行輸入驗(yàn)證。
    4.客戶(hù)端驗(yàn)證可能被取消,因此服務(wù)器端驗(yàn)證必不可少。

    示例代碼:
    http://m.tkk7.com/Files/sitinspring/SQLInjection20081011195750.rar

    posted on 2008-10-11 19:52 sitinspring 閱讀(10289) 評(píng)論(3)  編輯  收藏 所屬分類(lèi): Java APIDB&SQL

    評(píng)論

    # re: SQL注入攻擊及其防范淺談 2008-10-11 20:46 日月雨林@gmail.com

    很不錯(cuò)的文章,看來(lái)我以后要多注意細(xì)節(jié)問(wèn)題了!  回復(fù)  更多評(píng)論   

    # re: SQL注入攻擊及其防范淺談 2014-11-28 13:03 22222222222222222222222222222222222222222222222222

    33333  回復(fù)  更多評(píng)論   

    # re: SQL注入攻擊及其防范淺談 2016-04-02 19:40 ‘ or ’1‘=’1‘ or ’1‘=’1

    ‘ or ’1‘=’1‘ or ’1‘=’1   回復(fù)  更多評(píng)論   

    sitinspring(http://m.tkk7.com)原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處.
    主站蜘蛛池模板: 亚洲国产一区二区三区| 99爱免费观看视频在线| 一二三四免费观看在线电影| 久久精品国产精品亚洲人人 | 国产精品久久久久久亚洲小说| 无码专区永久免费AV网站| 色噜噜综合亚洲av中文无码| 一级毛片免费观看不卡视频| 亚洲欧洲一区二区| 99久久综合国产精品免费| 99亚偷拍自图区亚洲| 精品国产麻豆免费网站| 国产精品亚洲а∨无码播放不卡| 又黄又大又爽免费视频| caoporn国产精品免费| 亚洲人成中文字幕在线观看| 国产免费无码AV片在线观看不卡| 亚洲人成网www| 性色av免费观看| 无码免费又爽又高潮喷水的视频 | 91在线视频免费看| 老子影院午夜伦不卡亚洲| 亚洲人午夜射精精品日韩| 丁香花在线观看免费观看图片 | 亚洲中文字幕成人在线| 免费国产成人午夜在线观看| 亚洲美女一区二区三区| 在线视频免费观看高清| 一级A毛片免费观看久久精品 | 午夜亚洲福利在线老司机| 最近免费中文字幕中文高清| 亚洲日韩图片专区第1页| 成人无遮挡毛片免费看| 国产高清对白在线观看免费91| 久久亚洲精品无码| 全免费a级毛片免费**视频 | 人人玩人人添人人澡免费| 亚洲AV综合色区无码二区爱AV| 亚洲第一永久AV网站久久精品男人的天堂AV | 国产偷国产偷亚洲高清在线| 亚洲精品高清国产一线久久|