預防JSP的SQL注入問題

2021-04-23 12:03:17 字數 2225 閱讀 6571

在jdbc應用中,如果你已經是稍有水平開發者,你就應該始終以preparedstatement代替statement.也就是說,在任何時候都不要使用statement.  

基於以下的原因:  

一.**的可讀性和可維護性.  

雖然用preparedstatement來代替statement會使**多出幾行,但這樣的**無論從可讀性還是可維護性上來說.都比直接用statement的**高很多檔次:  

stmt.executeupdate("insert   into   tb_name   (col1,col2,col2,col4)   values   ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");  

perstmt   =   con.preparestatement("insert   into   tb_name   (col1,col2,col2,col4)   values   (?,?,?,?)");  

perstmt.setstring(1,var1);  

perstmt.setstring(2,var2);  

perstmt.setstring(3,var3);  

perstmt.setstring(4,var4);  

perstmt.executeupdate();  

不用我多說,對於第一種方法.別說其他人去讀你的**,就是你自己過一段時間再去讀,都會覺得傷心.  

二.preparedstatement盡最大可能提高效能.  

每一種資料庫都會盡最大努力對預編譯語句提供最大的效能優化.因為預編譯語句有可能被重複呼叫.所以語句在被db的編譯器編譯後的執行**被快取下來,那麼下次呼叫時只要是相同的預編譯語句就不需要編譯,只要將引數直接傳入編譯過的語句執行**中(相當於乙個涵數)就會得到執行.這並不是說只有乙個connection中多次執行的預編譯語句被快取,而是對於整個db中,只要預編譯的語句語法和快取中匹配.那麼在任何時候就可以不需要再次編譯而可以直接執行.而statement的語句中,即使是相同一操作,而由於每次操作的資料不同所以使整個語句相匹配的機會極小,幾乎不太可能匹配.比如:  

insert   into   tb_name   (col1,col2)   values   ('11','22');  

insert   into   tb_name   (col1,col2)   values   ('11','23');  

即使是相同操作但因為資料內容不一樣,所以整個個語句本身不能匹配,沒有快取語句的意義.事實是沒有資料庫會對普通語句編譯後的執行**快取.這樣每執行一次都要對傳入的語句編譯一次.  

當然並不是所以預編譯語句都一定會被快取,資料庫本身會用一種策略,比如使用頻度等因素來決定什麼時候不再快取已有的預編譯結果.以儲存有更多的空間儲存新的預編譯語句.  

三.最重要的一點是極大地提高了安全性.  

即使到目前為止,仍有一些人連基本的惡義sql語法都不知道.  

string   sql   =   "select   *   from   tb_name   where   name=   '"+varname+"'   and   passwd='"+varpasswd+"'";  

如果我們把['   or   '1'   =   '1]作為varpasswd傳入進來.使用者名稱隨意,看看會成為什麼?  

select   *   from   tb_name   =   '隨意'   and   passwd   =   ''   or   '1'   =   '1';  

因為'1'='1'肯定成立,所以可以任何通過驗證.更有甚者:  

把[';drop   table   tb_name;]作為varpasswd傳入進來,則:  

select   *   from   tb_name   =   '隨意'   and   passwd   =   '';drop   table   tb_name;有些資料庫是不會讓你成功的,但也有很多資料庫就可以使這些語句得到執行.  

而如果你使用預編譯語句.你傳入的任何內容就不會和原來的語句發生任何匹配的關係.(前提是資料庫本身支援預編譯,但上前可能沒有什麼服務端資料庫不支援編譯了,只有少數的桌面資料庫,就是直接檔案訪問的那些)只要全使用預編譯語句,你就用不著對傳入的資料做任何過慮.而如果使用普通的statement,有可能要對drop,;等做費盡心機的判斷和過慮.  

sql注入預防

sql注入即是指web應用程式對使用者輸入資料的合法性沒有判斷或過濾不嚴,攻擊者可以在web應用程式中事先定義好的查詢語句的結尾上新增額外的sql語句,在管理員不知情的情況下實現非法操作,以此來實現欺騙資料庫伺服器執行非授權的任意查詢,從而進一步得到相應的資料資訊。1.簡單又有效的方法 prepar...

sql注入預防

在我們登陸驗證時會發現sql注入的現象。1.sql注入發生原因 因為如果使用者在使用者名稱上輸入的是 or 1 1 時,我們得到的sql語句是select from shop user where username or 1 1 and password d41d8cd98f00b204e98009...

如何預防SQL注入

以前我出去面試時,人家問我什麼叫sql注入,我很迷芒的告訴人家 我不知道,因為我從來沒有遇到過這類情況。後來隨著sql注入漸入流行,我才發現,其實sql注入是因為程式設計師寫程式時的不良習慣導致的一類漏洞的總稱。其主要原因是程式設計師沒有處理好sql語句中的單引號 例如,在數字型引數中,沒有用程式去...