Jsp防SQL注入

2021-08-23 13:18:11 字數 2060 閱讀 9750

在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,;等做費盡心機的判斷和過慮.

上面的幾個原因,還不足讓你在任何時候都使用preparedstatement嗎?

後面那個附件是asp中用的 函式,過濾字元的

防SQL注入

這段 有好處也有壞處,用的時候得小心,搞不好就會跳進錯誤 dimsql injdata sql injdata and exec insert select delete update chr mid master truncate char declare sql inj split sql in...

防SQL注入

1.必須認定使用者輸入的資料都是不安全的 使用者輸入的資料進行過濾處理 if preg match w get username matches else 讓我們看下在沒有過濾特殊字元時,出現的sql情況 設定 name 中插入了我們不需要的sql語句 name qadir delete from ...

防SQL注入

與資料庫互動的 web 應用程式中最嚴重的風險之一 sql 注入攻擊。sql 注入是應用程式開發人員未預期的把 sql 傳入到應用程式的過程,它由於應用程式的糟糕設計而使攻擊成為可能,並且只有那些直接使用使用者提供的值構建 sql 語句的應用程式才會受影響。sql 語句通過字串的構造技術動態建立,文...