1. 程式人生 > >JDBC學習之路(三)防止SQL注入,PreparedStatement探索

JDBC學習之路(三)防止SQL注入,PreparedStatement探索

   現在登入註冊或者其他很多地方遇到使用者輸入的內容可以直接拿到資料庫內部去進行執行SQL語句,這個是一項很危險的運動,因為你不知道使用者會輸入什麼,如果使用者對SQL語句很熟悉,他就可以在輸入的時候加上''兩個冒號作為特殊字元,這樣的話會讓計算機認為他輸入的是SQL語句的關鍵字從而改變你的SQL語句,照成不可估量的損失,下面介紹防止此類事情發生的程式碼

package com.bird.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

/**
 * @use1 preparedStatement可以做一些預處理工作,將特殊字元去除,保證查詢安全
 * @use2 比起Statement速度更快
 * @use3 單次測試不好說,但是多次執行還是PreparedStatement執行塊的
 * @author bird
 *
 */

public class SQLInsert {//使用PreStatement防止SQL注入攻擊
	public static void read(String num) throws Exception{
		
		Connection conn = null;
		PreparedStatement pt = null;
		ResultSet rs = null;
		try{
			conn = JdbcUtil.getConnecttion();//建立連線
			
			String sql = "select * from niao where password = ?";//問號代替num
			pt = conn.prepareStatement(sql);//建立語句	
			pt.setString(1, num);
			
			rs = pt.executeQuery();//執行語句
			
			while(rs.next()){//得到資料
				System.out.println(rs.getObject("username")+"\t"+rs.getObject("password")+"\t"+rs.getObject("keywords")+"\t"
						+rs.getObject("userkeywords1")+"\t"+rs.getObject("time1")+"\t"+rs.getObject("userkeywords2")+"\t"
						+rs.getObject("time2")+"\t");
			}
		}finally{
			JdbcUtil.free(rs, pt, conn);
		}
		
		
	}
	
	public static void main(String [] args) throws Exception{
		read("123");
              //read("' or 2 or'");這句話包含了兩個單引號,會讓計算機認為是SQL關鍵字很危險
	}
}

1.PreparedStatement是繼承自Statement, 可以說Statement能做的事情他都能做。

2.PreparedStatement可以對你輸入的SQL語句進行預處理,刪除那些特殊字元和危險

字元,非常有好處,給開發者幫助

3.PreparedStatement對SQL執行進行了優化,對於多次大量的SQL查詢,效率要比Statement快的很多,建議能用它就用他