什么是預編譯,為什么預編譯能防止SQL注入?


一、什么是預編譯?

預編譯是做些代碼文本的替換工作。是整個編譯過程的最先做的工作

 

 

 通過上面的解釋可能還是不太理解預編譯,通俗簡單的說在程序真正執行一段代碼之前,我們對要執行的代碼做一些特定的處理,來達到我們后期所想要達到的一個效果

 

二、為什么預編譯能防止SQL注入?

在知道為什么預編譯能防止SQL注入時,我們先來看一個例子:

使用sql拼接:"select * from user where username = ' " + username + " ' ";

頁面上可能會有個輸入框:用戶名:________________________

如果有人這么填:用戶名:___hello'; delete from user where id='1__最終的Sql就是 "select * from user where username = 'hello'; delete from user where id='1' ";

Sql注入就發生了,不僅僅會返回你想要的用戶信息,還會刪除id為1的用戶;與代碼預期的邏輯不一致

使用prepareStatement
Sql發送到服務器大致會有如下流程:

 

 

  1. 解析階段
  2. 編譯階段
  3. 優化階段
  4. 緩存階段
  5. 執行階段

PrepareStatement發送到服務器后會經歷上述1、2、3、4過程,PrepareStatement並不是完整的sql語句,在執行之前還需要進行用戶數據替換。在填入用戶數據時,PrepareStatement已經經歷了上述過程,就不會重新編譯,用戶的數據只能作為數據進行填充,而不是sql的一部分。服務器從緩存中獲得已經編譯優化后的語句,替換掉用戶數據執行,避免了sql注入

 


免責聲明!

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



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