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

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

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

    春風博客

    春天里,百花香...

    導航

    <2016年4月>
    272829303112
    3456789
    10111213141516
    17181920212223
    24252627282930
    1234567

    統計

    公告

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

    Locations of visitors to this page

    常用鏈接

    留言簿(11)

    隨筆分類(224)

    隨筆檔案(126)

    個人軟件下載

    我的其它博客

    我的鄰居們

    最新隨筆

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    SQL注入攻擊及其防范淺談

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

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

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

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

    如果用戶進行SQL注入則可使驗證無效

    如果用戶通過某種途徑知道或是猜測出了驗證SQL語句的邏輯,他就有可能在表單中輸入特殊字符改變SQL原有的邏輯,比如在名稱文本框中輸入“ ‘ or ’1‘=’1‘ or ’1‘=’1 ”或是在密碼文本框中輸入“ 1‘ or ’1‘=’1 ”,SQL語句將會變成:

    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原有的驗證完全無效了。

    使用正則表達式屏蔽特殊字符

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

    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注入攻擊能得逞是因為在原有SQL語句中加入了新的邏輯,如果使用PreparedStatement執行SQL語句,其后只是輸入參數, SQL注入攻擊手段將無效,這是因為PreparedStatement不允許在不同的插入時間改變查詢的邏輯結構。示例代碼如下:

    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的錯誤使用

    用PreparedStatement來防范SQL注入攻擊是因為“因為PreparedStatement不允許在不同的插入時間改變查詢的邏輯結構”,如果如下使用則起不到這個效果,因為SQL語句和參數沒有分開,它們被組合在一起被一次性提交了。

    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注入攻擊還是要借助于正則表達式

    小結

    1.Web系統通常采用數據庫作為數據源,而大多數業務處理都離不開SQL語句,因此系統潛在就有被SQL注入攻擊的隱患,攻擊可能會從任何一次URL提交或是FORM提交中發起。
    2.使用PreparedStatement執行Sql語句比Statement安全得多,如果能使用PreparedStatement就不該用Statement,當然SQL主體和參數應該分開。
    3.如果因為要執行動態多變的SQL語句而不得已采用Statement,則應該在服務器端用正則表達式進行輸入驗證。
    4.客戶端驗證可能被取消,因此服務器端驗證必不可少。

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

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

    評論

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

    很不錯的文章,看來我以后要多注意細節問題了!  回復  更多評論   

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

    33333  回復  更多評論   

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

    ‘ or ’1‘=’1‘ or ’1‘=’1   回復  更多評論   

    sitinspring(http://m.tkk7.com)原創,轉載請注明出處.
    主站蜘蛛池模板: 韩国免费一级成人毛片| 最好看最新的中文字幕免费| 色窝窝免费一区二区三区 | 香蕉免费一区二区三区| 在线观看亚洲精品福利片| 成人无码视频97免费| 亚洲线精品一区二区三区 | 久草免费福利资源站| 亚洲人成在线观看| 2021国内精品久久久久精免费| 亚洲黄色网站视频| 最近中文字幕大全中文字幕免费| 911精品国产亚洲日本美国韩国| 99免费视频观看| 亚洲制服丝袜一区二区三区| 成人毛片免费观看视频在线 | 亚洲欧洲精品久久| 五月亭亭免费高清在线| 亚洲国产精品综合久久20| 午夜免费福利影院| 免费人成网站永久| 亚洲精品国产精品乱码视色| 91在线老王精品免费播放| 涩涩色中文综合亚洲| 亚洲精品无码激情AV| 久久午夜夜伦鲁鲁片免费无码 | 成人永久免费福利视频网站| 色www免费视频| 狠狠色伊人亚洲综合成人| 国产成人免费午夜在线观看| 亚洲乱人伦中文字幕无码| 亚洲精品国自产拍在线观看| 久9久9精品免费观看| 国产99在线|亚洲| 亚洲国产精品一区二区三区久久 | 亚洲人成色77777在线观看| 亚洲精品无码成人片在线观看| 人妻无码久久一区二区三区免费| 亚洲熟妇自偷自拍另欧美| 亚洲乱码中文字幕手机在线| 1000部啪啪毛片免费看|