每天進步一點點

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

          2011年5月11日

          創(chuàng)建用戶:   public Long createTempUser(TempUser user) {
                  TempUser tempuser = this.findTempUserByName(user.getYhm());
                  user.setMm(createEncryptPSW(user.getMm().trim()));  
          //生成加密密碼
                  if (tempuser != null) {
                      user.setId(tempuser.getId());
                      
          this.getHibernateTemplate().merge(user);
                  } 
          else {
                      
          this.getHibernateTemplate().saveOrUpdate(user);
                  }
                  
          return user.getId();
              }
          createEncryptPSW(加密方法): private String createEncryptPSW(String psw) {
                  MessageDigest messagedigest;
                  
          try {
                      messagedigest 
          = MessageDigest.getInstance("MD5");
                      messagedigest.update(psw.getBytes(
          "UTF8"));
                      
          byte abyte0[] = messagedigest.digest();
                      
          return (new BASE64Encoder()).encode(abyte0);
                  } 
          catch (Exception e) {
                      
          throw new RuntimeException("加密失敗:" + e.getMessage());
                  }
              }
          登錄(解密):   
           public Long userCer(String userName, String password) {
                  TempUser user 
          = this.findTempUserByName(userName);
                  
          if (null == user) return 0L;
                  
          boolean flag = createEncryptPSW(password.trim()).equals(user.getMm());
                  
          if (flag) return user.getId();
                  
          return 0L;
              }




          posted @ 2011-05-11 15:46 MyOracleX 閱讀(152) | 評論 (0)編輯 收藏

          2011年5月9日

              只有注冊用戶登錄后才能閱讀該文。閱讀全文

          posted @ 2011-05-09 23:44 MyOracleX 閱讀(69) | 評論 (0)編輯 收藏

          2010年11月23日

          SQL注射原理

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

          posted @ 2010-11-23 17:33 MyOracleX 閱讀(1139) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 玉林市| 新郑市| 精河县| 田东县| 武强县| 密山市| 汝阳县| 赣榆县| 海丰县| 繁昌县| 浏阳市| 丽水市| 门源| 老河口市| 松滋市| 平山县| 石棉县| 盖州市| 金川县| 阿城市| 山丹县| 洞口县| 五台县| 邵阳市| 花莲市| 磐安县| 个旧市| 哈巴河县| 萨嘎县| 武威市| 伊宁市| 裕民县| 黄大仙区| 通州区| 通道| 图木舒克市| 乌兰察布市| 大洼县| 尖扎县| 宜良县| 武宁县|