SQL注入問題及解決方案


SQL注入

用戶輸入的內容, 在SQL語句拼接過程中, 完成了一條邏輯發生變化的新的SQL語句 !


例如:  

原SQL語句拼接為: 

	String sql = "select id from user15 where username='"+user.getUserName()+"' and password='"+user.getPassWord()+"'";
	
用戶輸入的帳號密碼分別為:

請輸入您的帳號:
suibian
請輸入您的密碼:
suibian' or '1'='1
組成的SQL語句: 
select id from user15 where username='suibian' and password='suibian' or '1'='1'

解決SQL注入問題

使用預編譯SQL語句 進行參數的傳遞

更改執行環境 Statement  

使用新的環境: PreparedStatement


在通過連接對象 獲取一個預編譯的SQL環境(PreparedStatement)時, 需要傳遞 一個SQL語句 ! 
在這個語句中 可以出現? , ? 表示准備填充的參數值!


使用步驟: 

	1.	通過連接對象, 獲得一個預編譯的SQL執行環境

		PreparedStatement state conn.prepareStatement(sql);

		例如: 
			String sql = "select id from user15 where username=? and password=?";
	
			PreparedStatement state  = conn.prepareStatement(sql);	
			
	2.    向預編譯參數列表中 傳遞值: 

		預編譯的SQL語句中可以包含0-n個問號, 每一個問號表示一個需要傳遞的值 
		我們通過PreparedStatement它的setXXX方法,來完成參數的傳遞
		在傳遞參數時, 需要指定問號的索引, 問號的索引從1開始			

		例如:
			state.setString(1,user.getUserName());
			state.setString(2,user.getPassWord());

	3.	執行語句:
			ResultSet result = state.executeQuery();

PreparedStatement

常用方法: 
	
	填充預編譯的參數: 

	-	setXXX(問號索引,值)
		向預編譯的SQL的?中傳遞值 
		參數1. 問號的索引 ,從1開始
		參數2. 填充到? 中的值

	-	execute()
	-	executeUpdate();
	-	executeQuery();
		上面的三個方法 與 Statement中方法的含義一致, 只不過不存在參數!


免責聲明!

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



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