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

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

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

    posts - 3, comments - 0, trackbacks - 0, articles - 0
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    SQL注入原理及PreparedStatement的使用

    Posted on 2010-11-23 17:33 MyOracleX 閱讀(1138) 評論(0)  編輯  收藏

    SQL注射原理

    SQL 注射能使攻擊者繞過認(rèn)證機(jī)制,完全控制遠(yuǎn)程服務(wù)器上的數(shù)據(jù)庫。SQL是結(jié)構(gòu)化查詢語言的簡稱,它是訪問數(shù)據(jù)庫的事實標(biāo)準(zhǔn)。目前,大多數(shù)Web應(yīng)用都使用 SQL數(shù)據(jù)庫來存放應(yīng)用程序的數(shù)據(jù)。幾乎所有的Web應(yīng)用在后臺都使用某種SQL數(shù)據(jù)庫。跟大多數(shù)語言一樣,SQL語法允許數(shù)據(jù)庫命令和用戶數(shù)據(jù)混雜在一 起的。如果開發(fā)人員不細(xì)心的話,用戶數(shù)據(jù)就有可能被解釋成命令,這樣的話,遠(yuǎn)程用戶就不僅能向Web應(yīng)用輸入數(shù)據(jù),而且還可以在數(shù)據(jù)庫上執(zhí)行任意命令了。
    登陸驗證
    現(xiàn) 在以一個需要用戶身份認(rèn)證的簡單的Web應(yīng)用程序為例進(jìn)行講解。假定這個應(yīng)用程序提供一個登錄頁面,要求用戶輸入用戶名和口令。用戶通過HTTP請求發(fā)送 他們的用戶名和口令,之后,Web應(yīng)用程序檢查用戶傳遞來用戶名和口令跟數(shù)據(jù)庫中的用戶名和口令是否匹配。這種情況下,會要求在SQL數(shù)據(jù)庫中使用一個數(shù) 據(jù)庫表。
    對一個用戶進(jìn)行認(rèn)證,實際上就是將用戶的輸入即用戶名和口令跟表中的各行進(jìn)行比較,如果跟某行中的用戶名和口令跟用戶的輸入完全匹配,那么該用戶就會通過認(rèn)證。
    假如后臺的sql語句時這樣拼接的
    select id from test where username='"+myname+"' and password='"+mypasswd+"' ";
    表面上看,如果用戶名和口令對匹配,那么該用戶通過認(rèn)證;否則,該用戶不會通過認(rèn)證——但是,事實果真如此嗎?非也!讀者也許已經(jīng)注意到了,這里并沒有對SQL命令進(jìn)行設(shè)防,所以攻擊者完全能夠在用戶名或者口令字段中注入SQL語句,從而改變SQL查詢 。為此,我們仔細(xì)研究一下上面的SQL查詢字符串:
    上述代碼認(rèn)為字符串username和password都是數(shù)據(jù),不過,攻擊者卻可以隨心所欲地輸入任何字符 。如果一位攻擊者輸入的用戶名為
    ’OR1=1—
    而口令為
    x
    雙劃符號--告訴SQL解析器,右邊的東西全部是注釋,所以不必理會。這樣,查詢字符串相當(dāng)于:
    select id from test where username='' or 1=1;
    如 今的SELECT語句跟以前的已經(jīng)大相徑庭了,因為現(xiàn)在只要用戶名為長度為零的字符串''或1=1這兩個條件中一個為真,就返回用戶標(biāo)識符ID——我們知 道,1=1是恒為真的。所以這個語句將返回user_table中的所有ID。在此種情況下,攻擊者在username字段放入的是SQL指令 'OR1=1--而非數(shù)據(jù)。
    更為嚴(yán)重的情況是當(dāng)username對應(yīng)的是'OR1=1;DROPTABLEuser_table;--
    數(shù)據(jù)庫中執(zhí)行的sql語句就變成了:
    select id from test where username='' or 1=1;drop table test
    這個語句將執(zhí)行句法上完全正確的SELECT語句,并利用drop命令清空test表。
    應(yīng)對策略
    問題的關(guān)鍵就是不要用string構(gòu)造sql語句,這樣就不會利用輸入的參數(shù)構(gòu)造sql語句了。所以要用PreparedStatement替換Statement,即用占位符作為實參定義sql語句,從而避免sql注入攻擊。
    不管什么框架,還是純JDBC,只用Preparedstatement,一定要用占位符作為實參來構(gòu)造sql(或hql)語句。

    String sql= "select * from test where usernmae=? and password=? " ;
    PreparedStatement psm=conn.preparedStatement(sql);
    psm.setString(1,myname);
    psm.setString(2,mypasswd);
    Result rs=psm.executeQuery();

    if (rs.next){
    rs.close();
    con.close();
    return false ;
    }
    else {
    rs.close();
    con.close();
    return true ;
    }


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 免费在线观看亚洲| 在线视频免费观看高清| 久久青青草原亚洲av无码| 精品亚洲成A人在线观看青青| 免费国产黄线在线观看| 亚洲欧美日韩国产精品一区| 无码人妻精品一二三区免费| 亚洲日韩看片无码电影| 在线观着免费观看国产黄| 国内成人精品亚洲日本语音| yy6080久久亚洲精品| h在线看免费视频网站男男| 亚洲热线99精品视频| 热99RE久久精品这里都是精品免费 | 日本免费观看网站| 阿v视频免费在线观看| 亚洲伊人久久成综合人影院| 在线观看肉片AV网站免费| 亚洲美女一区二区三区| 99在线视频免费观看视频| 亚洲男人的天堂网站| 波多野结衣视频在线免费观看| 九九九精品视频免费| 亚洲成AV人片在线观看无| **一级毛片免费完整视| 亚洲熟妇成人精品一区| 亚洲精品无码你懂的网站| 国产成人一区二区三区视频免费| 亚洲国产成人综合| 在线看片无码永久免费aⅴ| 久久国产乱子伦精品免费午夜| 亚洲经典在线中文字幕| 国产精品色午夜免费视频| a级毛片免费在线观看| 亚洲三级视频在线观看| 亚洲M码 欧洲S码SSS222| 777成影片免费观看| 另类专区另类专区亚洲| 亚洲综合一区二区精品导航| 日韩免费视频网站| 国产拍拍拍无码视频免费|