細心!用心!耐心!

          吾非文人,乃市井一俗人也,讀百卷書,跨江河千里,故申城一游; 一兩滴辛酸,三四年學業,五六點粗墨,七八筆買賣,九十道人情。

          BlogJava 聯系 聚合 管理
            1 Posts :: 196 Stories :: 10 Comments :: 0 Trackbacks
           
          下面是自己以前初學JDBC時候寫的代碼,存在sql注入漏洞。
          不安全因素:statement。。。應該用Preparedstatement來代替statement,這樣我們就可以使用占位符作為實參來定義sql語句,從而避免sql注入的攻擊。
                  當然也可以用statement,你得注意你的sql的寫法,要是下例肯定不行。還得對url惡意傳入參數進行過濾(SQL元字符處理)。。。這樣就比較麻煩了,而且也無法保證絕對的安全。
                  我們在用hibernate等框架的時候(hql語句),避免sql注入攻擊也是一樣的,關鍵是不要用string來構造sql語句,不管什么框架,還是純JDBC,只要用Preparedstatement就OK。。。一定要用占位符作為實參來構造sql(或hql)語句。
          package cn.zhd;
          import java.io.*;
          import org.apache.log4j.*;
          import java.sql.Connection;
          import java.sql.DriverManager;
          import java.sql.SQLException;
          import java.sql.Statement;
          import java.sql.ResultSet;

          public class LoginDemo {
              
              public void execute(String user,String pass){
                  boolean foo=false;
                  try{
                      Class.forName("com.mysql.jdbc.Driver");
                      Connection con=DriverManager.getConnection("jdbc:mysql://localhost/students","root","");
                      Statement stam=con.createStatement();
                      //存在注入攻擊漏洞:select * from login where user='' or'x'='x' or 'x'='' and '1'
                      ResultSet rs=stam.executeQuery("select * from login where user='" + user + "' and pass='"+ pass + "'");
                      while(rs.next()){

                              foo=true;
                          
                      }
                      if(foo){
                          System.out.println("登陸成功");
                      }
                      else
                      {
                          System.out.println("用戶名密碼錯誤");
                      }

                  }catch(ClassNotFoundException e){
                      e.printStackTrace();
                  }catch(SQLException e){
                      e.printStackTrace();
                  }
                  
              }
              public static void main(String[] args){
                  Logger log=Logger.getLogger(LoginDemo.class);
                  try{
                      LoginDemo ld=new LoginDemo();
                      BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
                      log.info("請輸入用戶名");
                      String bf_str=bf.readLine();
                      log.info("請輸入密碼");
                      String bf2_str=bf.readLine();
                      bf.close();
                      ld.execute(bf_str,bf2_str);
                  }catch(IOException e){
                      e.printStackTrace();
                  }
                  
              }
          }

          當輸入用戶名的時候輸入:' or 'x'='x' or '2'='
          密碼隨便輸.....
          成功登陸了吧.....
          posted on 2007-04-20 13:51 張金鵬 閱讀(352) 評論(0)  編輯  收藏 所屬分類: 數據庫編程
          主站蜘蛛池模板: 丹江口市| 鄯善县| 连平县| 神农架林区| 贵州省| 博客| 邢台市| 苗栗市| 宜昌市| 肃南| 额敏县| 赤水市| 海阳市| 隆林| 理塘县| 浙江省| 弥渡县| 平山县| 平远县| 轮台县| 开原市| 黄石市| 扶风县| 石家庄市| 定陶县| 三穗县| 兴海县| 清河县| 敖汉旗| 苏尼特右旗| 宁津县| 济源市| 莱州市| 西乌珠穆沁旗| 临澧县| 漳平市| 泽州县| 平定县| 博湖县| 南川市| 宝丰县|