1. 程式人生 > >java當中sql注入詳解

java當中sql注入詳解

(1)程式碼如下

package cn.packa.wwy;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.junit.Test;
public class TestLogin {
@Test
public void testLogin() {
try {
login("wwy' or 'gg", "111");
} catch (ClassNotFoundException | SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
* 測試sql注入

*/
public void login(String username, String password) throws ClassNotFoundException, SQLException {


// 註冊驅動
Class.forName("com.mysql.jdbc.Driver");
// 獲取連線
String url = "jdbc:mysql://127.0.0.1:3308/wwy221?useUnicode=true&characterEncoding=utf8";
String conname = "root";
String password1 = "123456";
Connection conn = DriverManager.getConnection(url, conname, password1);
// 建立執行sql的物件
Statement stement = conn.createStatement();
String sql = "select * from tb_user where username='" + username + "' and userpass='" + password + "'";
ResultSet rs = stement.executeQuery(sql);
if (rs.next()) {
System.out.println("登入成功");
System.out.println(sql);
} else {
System.out.println("無此人");
System.out.println(sql);
}
if (rs != null)
rs.close();
if (stement != null)
stement.close();
if (conn != null)
conn.close();
}


}

(2)資料庫設計如下


(3)查詢結果如下


(4)由於statement當中存在sql拼接問題,因此可能會導致開發過程當中出現sql注入問題

(5)解決方案

1、過濾使用者輸入的資料是否合法

2、分步校驗,先使用使用者名稱對使用者身份進行校驗,如果找到了,在進行密碼校驗

3、使用preparestatement,該程式碼如下

public void preStatementLogin(String username, String pass) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
// 獲取連線
String url = "jdbc:mysql://127.0.0.1:3308/wwy221?useUnicode=true&characterEncoding=utf8";
String conname = "root";
String password1 = "123456";
Connection conn = DriverManager.getConnection(url, conname, password1);
String sql = "select * from tb_user where username=? and userpass=?";
PreparedStatement pst = conn.prepareStatement(sql);
pst.setString(1, username);
pst.setString(2, pass);
ResultSet rs = null;
rs = pst.executeQuery();
if (rs.next()) {
System.out.println("登入成功");
System.out.println(sql);
} else {
System.out.println("無此人");
System.out.println(sql);
}
if (rs != null)
rs.close();
if (pst != null)
pst.close();
if (conn != null)
conn.close();

}

效果截圖