SQL注入問題的解決方案


一、產生及產生原因分析(sql語句進行拼串的原因)
分析:
  
  
  
          
  1. String sql = "select * from user where username='"+username+"' and password='"+password+"'";
  2. String sql = "select * from user where username='tom' and password='123'";
  3. select * from user where username='jerry' and password='abc'//這種情況是不會有問題的
  4. //測試如果傳入的是SQL語句的的一部分
  5. username:tom' or '1'='1
  6. password:????????
  7. //這時候的SQL語句為一下這種情況
  8. select * from user where username='tom' or '1'='1' and password='?????'
  9. //由於and的執行優先級大於Or 可以看作以下情況
  10. select * from user where username='tom' or ('1'='1' and password='?????');
  11. //由於是or 或者的關系這時的SQL語句可以看作是這樣的語句
  12. select * from user where username='tom'

二、解決方案(引入: PreparedStatement對象,使SQL語句進行預編譯
PreparedStatement pstmt = conn.perpareStatement(String sql);
其實statement執行executeQuery內部分為兩步:
第一步:編譯sql 
第二步:執行sql
優點:能預編譯sql語句
例子:數據庫客戶端服務端基本模型
登陸端
   
   
   
           
  1. package com.heima.login.client;
  2. import java.util.Scanner;
  3. import com.heima.login.bean.User;
  4. import com.heima.login.seriver.services;
  5. public class login {
  6. /**
  7. * @param args
  8. * @throws Exception
  9. */
  10. public static void main(String[] args) throws Exception {
  11. // TODO Auto-generated method stub
  12. // 創建Scanner接收輸入內容
  13. Scanner sc= new Scanner(System.in);
  14. System.out.println("請輸入用戶名");
  15. String username = sc.nextLine();
  16. System.out.println("請輸入密碼");
  17. String password = sc.nextLine();
  18. // 創建服務端對象使用登陸方法
  19. services s=new services();
  20. User user = s.login(username, password);
  21. if(user!=null){
  22. System.out.println(user);
  23. }else{
  24. System.out.println("用戶名或密碼錯誤!!!");
  25. }
  26. }
  27. }
服務端:
    
    
    
            
  1. package com.heima.login.seriver;
  2. import java.sql.Connection;
  3. import java.sql.PreparedStatement;
  4. import java.sql.ResultSet;
  5. import com.heima.Tools.JdbcConnection;
  6. import com.heima.login.bean.User;
  7. public class services {
  8. public User login(String username,String password) throws Exception
  9. {
  10. //新建user引用,默認值問null
  11. User u=null;
  12. //使用自定義數據庫連接工具類進行數據庫連接
  13. Connection conn=JdbcConnection.getConnection();
  14. //創建預編譯數據庫連接語句
  15. String sql = "select * from user where username=? and password=?";
  16. //創建PreparedStatement對象對數據庫語句進行預編譯
  17. PreparedStatement stem=conn.prepareStatement(sql);
  18. //設置預編譯語句中的查詢值
  19. stem.setString(1, username);
  20. stem.setString(2, password);
  21. //執行SQL語句
  22. ResultSet rs=stem.executeQuery();
  23. //如果有記錄對User對象進行賦值
  24. if(rs.next())
  25. {
  26. u = new User();
  27. u.setAge(rs.getInt("age"));
  28. u.setDept(rs.getString("Dept"));
  29. u.setEmail(rs.getString("email"));
  30. u.setGender(rs.getString("gender"));
  31. u.setId(rs.getInt("id"));
  32. u.setPassword(rs.getString("password"));
  33. u.setRegistTime(rs.getDate("registTime"));
  34. u.setSalary(rs.getDouble("salary"));
  35. u.setUsername(rs.getString("username"));
  36. }
  37. //關閉數據庫資源
  38. JdbcConnection.close(conn, stem, rs);
  39. return u;
  40. }
  41. }

User對象:
   
   
   
           
  1. package com.itheima.login.entity;
  2. public class User {
  3. private int id;
  4. private String username;
  5. private String password;
  6. private String email;
  7. public int getId() {
  8. return id;
  9. }
  10. public void setId(int id) {
  11. this.id = id;
  12. }
  13. public String getUsername() {
  14. return username;
  15. }
  16. public void setUsername(String username) {
  17. this.username = username;
  18. }
  19. public String getPassword() {
  20. return password;
  21. }
  22. public void setPassword(String password) {
  23. this.password = password;
  24. }
  25. public String getEmail() {
  26. return email;
  27. }
  28. public void setEmail(String email) {
  29. this.email = email;
  30. }
  31. @Override
  32. public String toString() {
  33. return "User [id=" + id + ", username=" + username + ", password="
  34. + password + ", email=" + email + "]";
  35. }
  36. }






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM