预处理prepareStatement是怎么防止sql注入漏洞的?
序,目前在對(duì)數(shù)據(jù)庫進(jìn)行操作之前,使用prepareStatement預(yù)編譯,然后再根據(jù)通配符進(jìn)行數(shù)據(jù)填值,是比較常見的做法,好處是提高執(zhí)行效率,而且保證排除SQL注入漏洞。
一、prepareStatement的預(yù)編譯和防止SQL注入功能
大家都知道,java中JDBC中,有個(gè)預(yù)處理功能,這個(gè)功能一大優(yōu)勢就是能提高執(zhí)行速度尤其是多次操作數(shù)據(jù)庫的情況,再一個(gè)優(yōu)勢就是預(yù)防SQL注入,嚴(yán)格的說,應(yīng)該是預(yù)防絕大多數(shù)的SQL注入。
? 用法就是如下邊所示:
String sql="update cz_zj_directpayment set dp.projectid = ? where dp.payid= ?"; try {PreparedStatement pset_f = conn.prepareStatement(sql);pset_f.setString(1,inds[j]);pset_f.setString(2,id);pset_f.executeUpdate(sql_update); }catch(Exception e){//e.printStackTrace();logger.error(e.message()); }為什么它這樣處理就能預(yù)防SQL注入提高安全性呢?其實(shí)是因?yàn)镾QL語句在程序運(yùn)行前已經(jīng)進(jìn)行了預(yù)編譯,在程序運(yùn)行時(shí)第一次操作數(shù)據(jù)庫之前,SQL語句已經(jīng)被數(shù)據(jù)庫分析,編譯和優(yōu)化,對(duì)應(yīng)的執(zhí)行計(jì)劃也會(huì)緩存下來并允許數(shù)據(jù)庫已參數(shù)化的形式進(jìn)行查詢,當(dāng)運(yùn)行時(shí)動(dòng)態(tài)地把參數(shù)傳給PreprareStatement時(shí),即使參數(shù)里有敏感字符如 or '1=1’也數(shù)據(jù)庫會(huì)作為一個(gè)參數(shù)一個(gè)字段的屬性值來處理而不會(huì)作為一個(gè)SQL指令,如此,就起到了SQL注入的作用了!
二、Statement和PreparedStatement的區(qū)別
先來說說,什么是java中的Statement:Statement是java執(zhí)行數(shù)據(jù)庫操作的一個(gè)重要方法,用于在已經(jīng)建立數(shù)據(jù)庫連接的基礎(chǔ)上,向數(shù)據(jù)庫發(fā)送要執(zhí)行的SQL語句。具體步驟:
1.首先導(dǎo)入java.sql.*;這個(gè)包。
2.然后加載驅(qū)動(dòng),創(chuàng)建連接,得到Connection接口的的實(shí)現(xiàn)對(duì)象,比如對(duì)象名叫做conn。
3.然后再用conn對(duì)象去創(chuàng)建Statement的實(shí)例,方法是:Statement stmt = conn.creatStatement(“SQL語句字符串”);
Statement 對(duì)象用于將 SQL 語句發(fā)送到數(shù)據(jù)庫中。實(shí)際上有三種 Statement 對(duì)象,它們都作為在給定連接上執(zhí)行 SQL語句的包容器:Statement、PreparedStatement(它從 Statement 繼承而來)和CallableStatement(它從 PreparedStatement 繼承而來)。它們都專用于發(fā)送特定類型的 SQL 語句:Statement 對(duì)象用于執(zhí)行不帶參數(shù)的簡單 SQL 語句;PreparedStatement 對(duì)象用于執(zhí)行帶或不帶參數(shù)的預(yù)編譯 SQL 語句;CallableStatement 對(duì)象用于執(zhí)行對(duì)數(shù)據(jù)庫已存儲(chǔ)過程的調(diào)用。
綜上所述,總結(jié)如下:Statement每次執(zhí)行sql語句,數(shù)據(jù)庫都要執(zhí)行sql語句的編譯,最好用于僅執(zhí)行一次查詢并返回結(jié)果的情形,效率高于PreparedStatement.但存在sql注入風(fēng)險(xiǎn)。PreparedStatement是預(yù)編譯執(zhí)行的。在執(zhí)行可變參數(shù)的一條SQL時(shí),PreparedStatement要比Statement的效率高,因?yàn)镈BMS預(yù)編譯一條SQL當(dāng)然會(huì)比多次編譯一條SQL的效率高。安全性更好,有效防止SQL注入的問題。對(duì)于多次重復(fù)執(zhí)行的語句,使用Prepared
Statement效率會(huì)更高一點(diǎn)。執(zhí)行SQL語句是可以帶參數(shù)的,并支持批量執(zhí)行SQL。由于采用了Cache機(jī)制,則預(yù)編譯的語句,就會(huì)放在Cache中,下次執(zhí)行相同的SQL語句時(shí),則可以直接從Cache中取出來。
PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES SET name= ? WHERE ID = ?"); pstmt.setString(1, "李四"); pstmt.setInt(2, 1); pstmt. executeUpdate();那么CallableStatement擴(kuò)展了PreparedStatement的接口,用來調(diào)用存儲(chǔ)過程,它提供了對(duì)于輸入和輸出參數(shù)的支持,CallableStatement 接口還有對(duì) PreparedStatement 接口提供的輸入?yún)?shù)的sql查詢的支持。
PreparedStatement: 數(shù)據(jù)庫會(huì)對(duì)sql語句進(jìn)行預(yù)編譯,下次執(zhí)行相同的sql語句時(shí),數(shù)據(jù)庫端不會(huì)再進(jìn)行預(yù)編譯了,而直接用數(shù)據(jù)庫的緩沖區(qū),提高數(shù)據(jù)訪問的效率(但盡量采用使用?號(hào)的方式傳遞參數(shù)),如果sql語句只執(zhí)行一次,以后不再復(fù)用。 從安全性上來看,PreparedStatement是通過?來傳遞參數(shù)的,避免了拼sql而出現(xiàn)sql注入的問題,所以安全性較好。
在開發(fā)中,推薦使用 PreparedStatement
三、什么是SQL注入,怎么防止SQL注入?
所謂SQL注入,就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請(qǐng)求的查詢字符串,最終達(dá)到欺騙服務(wù)器執(zhí)行惡意的SQL命令。具體來說,它是利用現(xiàn)有應(yīng)用程序,將(惡意)的SQL命令注入到后臺(tái)數(shù)據(jù)庫引擎執(zhí)行的能力,它可以通過在Web表單中輸入(惡意)SQL語句得到一個(gè)存在安全漏洞的網(wǎng)站上的數(shù)據(jù)庫,而不是按照設(shè)計(jì)者意圖去執(zhí)行SQL語句。
怎么防止SQL注入,使用存儲(chǔ)過程來執(zhí)行所有的查詢;檢查用戶輸入的合法性;將用戶的登錄名、密碼等數(shù)據(jù)加密保存。
四、spring中的事務(wù)是如何配置的?Spring中的AOP實(shí)現(xiàn)是基于什么原理?
先來回答第二個(gè)問題,是個(gè)開發(fā)者都知道Spring中的AOP說的是面向切面的編程。所以,再深入點(diǎn),AOP的實(shí)現(xiàn)原理其實(shí)是Java的動(dòng)態(tài)代理
第二個(gè)問題,先來說說數(shù)據(jù)庫中的事務(wù),再來說所Spring是怎么處理數(shù)據(jù)庫中的事務(wù)的。通俗的說,數(shù)據(jù)庫事務(wù)就是在你需要插入1000條數(shù)據(jù),然后再修改其中5條,刪除其中3條的操作執(zhí)行完畢之后的一次性提交。而在提交之前,這些變動(dòng)實(shí)際上不寫入數(shù)據(jù)庫的。同時(shí),里面如果有一步出錯(cuò)的話,所有的在這一個(gè)事務(wù)內(nèi)部做過的變動(dòng)都要撤銷、回滾。如果未使用事務(wù)的話,對(duì)于上述操作,實(shí)際上數(shù)據(jù)庫操作的次數(shù)是100+5+3次。那么,Spring對(duì)事務(wù)做了一些什么事情呢?Spring對(duì)事務(wù)做了封裝,可以通過申明的方式提供事務(wù)管理,
總結(jié)
以上是生活随笔為你收集整理的预处理prepareStatement是怎么防止sql注入漏洞的?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第四范式陈雨强获评首届世界人工智能大会云
- 下一篇: 交通银行签约第四范式,建设全行级统一AI