<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      使用jdbc拼接條件查詢語句時如何防止sql注入

      本人微信公眾號,歡迎掃碼關注!

      使用jdbc拼接條件查詢語句時如何防止sql注入

      • 最近公司的項目在上線時需要進行安全掃描,但是有幾個項目中含有部分老代碼,操作數據庫時使用的是jdbc,并且竟然好多都是拼接的SQL語句,真是令人抓狂。
      • 在具體改造時,必須使用PreparedStatement來防止SQL注入,普通SQL語句比較容易改造,本重點探討在拼接查詢條件的時候如何方式SQL注入,具體思路請參考下面的示例代碼。

      1 數據庫示例數據

      2 使用statement(不防止SQL注入)

      2.1 示例代碼

      @Test
      public void statementTest() {
          String username = "tom";
          String sex = "1";
          String address = "' or '1'='1";
          Statement stat = null;
          ResultSet res = null;
      
          Connection conn = ConnectionFactory.getConnection();
          String sql = "SELECT * FROM user WHERE 1 = 1";
      
          sql += username == null ? "" : " AND username = '" + username + "'";
          sql += sex == null ? "" : " AND sex = '" + sex + "'";
          sql += address == null ? "" : " AND address = '" + address + "'";
      
          System.out.println(sql);
      
          try {
              stat = conn.createStatement();
              res = stat.executeQuery(sql);
              printRes(res);
          } catch (SQLException e) {
              e.printStackTrace();
          } finally {
              ResourceClose.close(res, stat, conn);
          }
      }
      

      2.2 控制臺結果

      SELECT * FROM user WHERE 1 = 1 AND username = 'tom' AND sex = '1' AND address = '' or '1'='1'
      10 tom 2014-07-10 1 beijing 
      16 tom 2018-07-31 1 shanghai 
      22 tom 2019-04-16 2 shanghai 
      24 tom 2019-06-22 1 guangzhou 
      25 tom 2019-01-22 2 guangzhou 
      28 tom 2018-07-31 1 shenzhen 
      

      2.3 小結

      • 經過上面的示例代碼我們可以發現,單純拼接SQL語句是非常危險的,特別容易被SQL注入,但是如果使用prepareStatement的話,像這種條件查詢我們預先并不能確定到底有多少個?(占位符),也就不能使用按照?(占位符)索引去設置參數了,那怎么辦呢?
      • 別擔心,此時我們使用一個小小的技巧,具體參考下面的示例代碼

      3 使用prepareStatement(可以防止SQL注入)

      3.1 示例代碼

      @Test
      public void prepareStatementTest() {
          String username = "tom";
          String sex = null;
          String address = "' or '1'='1";
          PreparedStatement stat = null;
          ResultSet res = null;
      
          Connection conn = ConnectionFactory.getConnection();
          String sql = "SELECT * FROM user WHERE 1 = 1";
      
          List<Object> param = new ArrayList<>();
      
          if (username != null) {
              sql += " AND username = ?";
              param.add(username);
          }
          if (sex != null) {
              sql += " AND sex = ?";
              param.add(sex);
          }
          if (address != null) {
              sql += " AND address = ?";
              param.add(address);
          }
          System.out.println(sql);
      
          try {
              stat = conn.prepareStatement(sql);
              for (int i = 0; i < param.size(); i++) {
                  stat.setObject(i+1,param.get(i));
              }
              res = stat.executeQuery();
              printRes(res);
          } catch (SQLException e) {
              e.printStackTrace();
          } finally {
              ResourceClose.close(res, stat, conn);
          }
      }
      

      3.2 控制臺結果

      SELECT * FROM user WHERE 1 = 1 AND username = ? AND address = ?
      

      3.3 小結

      • 可以看出,使用prepareStatement是可以防止SQL注入的。
      • 但進行類似條件拼接這種操作時,可以先把參數放入一個集合中,然后遍歷集合,同時利用setObject(index,obj)這個方法就可以動態的獲取參數的索引了,而且不用關心參數是何種類型。

      4 問題總結

      • 如今在進行項目開發時已經很少使用原生的jdbc了,大多數都用功能強大的框架去完成,他們幫我們簡化了很多操作,如獲取數據庫連接、封裝結果集、SQL預編譯(可以防止SQL注入)
      • 如果實在避免不了使用的話一定要使用可以需編譯的prepareStatement對象,避免被SQL注入帶來的風險。
      posted @ 2019-04-27 21:49  云端笑猿  閱讀(7306)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲中文字幕久久精品品| 国产精品成人观看视频国产奇米| 日本一区二区a√成人片| 欧美成人精品三级网站| av中文无码韩国亚洲色偷偷| 人妻少妇偷人无码视频| 国产成人精品日本亚洲网站| 日韩有码国产精品一区| 色呦呦九九七七国产精品| 中文无码乱人伦中文视频在线| 久爱无码精品免费视频在线观看| 婷婷丁香五月深爱憿情网| 九九久久人妻精品一区色| 天天躁夜夜躁av天天爽| 开心久久综合激情五月天| 中文字幕av一区二区| 亚洲欧美偷国产日韩| 国产福利精品一区二区 | 从江县| 国产自产视频一区二区三区| 在线播放深夜精品三级| 肥臀浪妇太爽了快点再快点| 亚洲性日韩精品一区二区三区| 伊人久久精品一区二区三区 | 日日猛噜噜狠狠扒开双腿小说| 超碰人人模人人爽人人喊手机版 | 国产精品免费观在线| 一个人在看www免费| 寻乌县| 久久精品国产亚洲av天海翼| 亚洲成a人无码av波多野| 亚洲AV无码精品色午夜果冻| 国产欧美一区二区精品性色| 毛片av在线尤物一区二区| 成人精品区| 精品欧洲av无码一区二区| 大伊香蕉在线精品视频75| 日本福利一区二区精品| 亚洲人成网站观看在线观看| 色吊丝一区二区中文字幕| 无码国产精品一区二区免费3p |