春風(fēng)博客

          春天里,百花香...

          導(dǎo)航

          <2008年10月>
          2829301234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          統(tǒng)計(jì)

          公告

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

          Locations of visitors to this page

          常用鏈接

          留言簿(11)

          隨筆分類(224)

          隨筆檔案(126)

          個(gè)人軟件下載

          我的其它博客

          我的鄰居們

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          SQL注入攻擊及其防范淺談

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

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

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

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

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

          如果用戶通過某種途徑知道或是猜測出了驗(yàn)證SQL語句的邏輯,他就有可能在表單中輸入特殊字符改變SQL原有的邏輯,比如在名稱文本框中輸入“ ‘ or ’1‘=’1‘ or ’1‘=’1 ”或是在密碼文本框中輸入“ 1‘ or ’1‘=’1 ”,SQL語句將會(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和單引號的加入使得where后的條件始終是true原有的驗(yàn)證完全無效了。

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

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

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

          使用PreparedStatement代替Statement

          SQL注入攻擊能得逞是因?yàn)樵谠蠸QL語句中加入了新的邏輯,如果使用PreparedStatement執(zhí)行SQL語句,其后只是輸入?yún)?shù), SQL注入攻擊手段將無效,這是因?yàn)?span style="color: #ff0000">PreparedStatement不允許在不同的插入時(shí)間改變查詢的邏輯結(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來防范SQL注入攻擊是因?yàn)?#8220;因?yàn)镻reparedStatement不允許在不同的插入時(shí)間改變查詢的邏輯結(jié)構(gòu)”,如果如下使用則起不到這個(gè)效果,因?yàn)镾QL語句和參數(shù)沒有分開,它們被組合在一起被一次性提交了。

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

          示例代碼:
          http://www.aygfsteel.com/Files/sitinspring/SQLInjection20081011195750.rar

          posted on 2008-10-11 19:52 sitinspring 閱讀(10302) 評論(3)  編輯  收藏 所屬分類: Java APIDB&SQL

          評論

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

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

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

          33333  回復(fù)  更多評論   

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

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

          sitinspring(http://www.aygfsteel.com)原創(chuàng),轉(zhuǎn)載請注明出處.
          主站蜘蛛池模板: 泸西县| 共和县| 丘北县| 正宁县| 朝阳区| 什邡市| 武山县| 宁蒗| 许昌县| 宽甸| 台安县| 浦北县| 洛扎县| 揭阳市| 堆龙德庆县| 新泰市| 孝昌县| 江安县| 宜春市| 冀州市| 哈密市| 永兴县| 扎鲁特旗| 崇明县| 吴桥县| 溆浦县| 文安县| 沐川县| 界首市| 旺苍县| 巢湖市| 上思县| 安福县| 会同县| 昭通市| 闸北区| 射阳县| 安丘市| 漯河市| 耒阳市| 白银市|