prepareStatement:
SQL注入:
查詢時,通過修改where後面的條件,将條件改為真,檢視全表
防止SQL注入:
預執行SQL語句,提前判斷該SQL語句的語義和文法是否正确
當我們要查詢的資訊比較敏感,對安全性要求高,我們就使用prepareStatement,來進行查詢
java_SQL速配
public class java_SQL速配 {
//驅動
public static final String DRIVER = "com.mysql.cj.jdbc.Driver";
//使用者
public static final String USER = "root";
//密碼
public static final String PWD = "12345678";
//資料庫服務IP
public static final String IP = "127.0.0.1";
//端口号
public static final String PORT = "3306";
//url
public static String url(String dbName) {
return "jdbc:mysql://" + IP + ":" + PORT + "/" + dbName + "?useUnicode=true&characterEncoding=UTF8&useSSL=false";
}
}
java_防止SQL注入
public class java_防止sql注入 {
public static void main(String[] args) {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection connection =DriverManager.getConnection(java_SQL速配.url("jdbc"), java_SQL速配.USER, java_SQL速配.PWD);
//方法的參數是預執行的SQL語句,需要給值的地方用?占位後續再用真實值替換
PreparedStatement ps = connection.prepareStatement("select * from student where name=?");
//1.為?指派:預執行SQL語句
/*
* 第一個參數:?的位置 第二個參數:要賦的值 位置是從1開始
*/
ps.setString(1, "'田博' or 1=1");
//2.執行SQL語句
//有傳回結果集的執行
ResultSet rs = ps.executeQuery();
rs.beforeFirst();
while(rs.next()) {
System.out.println(rs.getObject(1));
System.out.println(rs.getObject(2));
System.out.println(rs.getObject(3));
}
//無傳回結果集的執行
// ps.executeUpdate();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}