細心!用心!耐心!

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

          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 張金鵬 閱讀(358) 評論(0)  編輯  收藏 所屬分類: 數據庫編程
          主站蜘蛛池模板: 兴城市| 阿图什市| 碌曲县| 桓台县| 南召县| 慈溪市| 新蔡县| 晋宁县| 苗栗市| 大埔区| 贵德县| 柳林县| 定兴县| 庄浪县| 吉木乃县| 江华| 永宁县| 兴安县| 梅河口市| 麻阳| 宜阳县| 昌黎县| 佛冈县| 保德县| 兰考县| 维西| 宁津县| 台南县| 铜山县| 和平县| 南和县| 宣恩县| 鄯善县| 孝义市| 辽宁省| 怀宁县| 莱西市| 德化县| 闽清县| 龙南县| 晋江市|