防sql注入java
預編譯語句PreparedStatement是 java.sql中的一個介面,繼承自Statement 介面。通過Statement對象執行SQL語句時,需要將SQL語句發送給DBMS,由 DBMS先進行編譯後再執行。而預編譯語句和Statement不同,在創建PreparedStatement對象時就指定了SQL語句,該語句立即發送給DBMS進行編譯,當該編譯語句需要被執行時,DBMS直接運行編譯後的SQL語句,而不需要像其他SQL語句那樣先將其編譯。引發SQL注入的根本原因是惡意用戶將SQL指令偽裝成參數傳遞到後端資料庫執行。作為一種更為安全的動態字元串的構建方法,預編譯語句使用參數佔位符來替代需要動態傳入的參數,這樣攻擊者無法改變SQL語句的結構,SQL語句的語義不會發生改變,即便用戶傳入類似於前面' or '1'='1這樣的字元串,資料庫也會將其作為普通的字元串來處理。
㈡ SpringBoot 防止SQL注入、XSS攻擊、CSRF/CROS惡意訪問
一、SQL 注入問題
SQL 注入即是指 web 應用程序對用戶輸入數據的合法性沒有判斷或過濾不嚴,攻擊者可以在 web 應用程序中事先定義好的查詢語句的結尾上添加額外的 SQL 語句,在管理員不知情的情況下實現非法操作,以此來實現欺騙資料庫伺服器執行非授權的任意查詢,從而進一步得到相應的數據信息。
簡單來說,就是將大部分 SQL 語句當參數傳入系統中,從而獲取系統中的數據。下面簡單舉例說明
系統中有這樣一條信息 SQL 語句執行,分頁查詢所有用戶,每頁查詢 20 條,並且根據指定欄位進行排序,也就是說排序欄位也是參數傳遞過來的
SQL 注入問題分析:
這樣很簡單的一句話 SQL,就可以把系統搞炸掉,這種方式可以實現刪庫跑路
以上語句會把整個 test 資料庫所有內容都刪掉
盡量用預編譯機制,少用字元串拼接的方式傳參,它是 sql 注入問題的根源。
有些特殊字元,比如:%作為 like 語句中的參數時,要對其進行轉義處理。
需要對所有的異常情況進行捕獲,切記介面直接返回異常信息,因為有些異常信息中包含了 sql 信息,包括:庫名,表名,欄位名等。攻擊者拿著這些信息,就能通過 sql 注入隨心所欲地攻擊你的資料庫了。目前比較主流的做法是,有個專門的網關服務,它統一暴露對外介面。用戶請求介面時先經過它,再由它將請求轉發給業務服務。這樣做的好處是:能統一封裝返回數據的返回體,並且如果出現異常,能返回統一的異常信息,隱藏敏感信息。此外還能做限流和許可權控制。
使用 sqlMap 等待代碼檢測工具,它能檢測 sql 注入漏洞。
需要對資料庫 sql 的執行情況進行監控,有異常情況,及時郵件或簡訊提醒。
對生產環境的資料庫建立單獨的賬號,只分配 DML 相關許可權,且不能訪問系統表。切勿在程序中直接使用管理員賬號。
建立代碼 review 機制,能找出部分隱藏的問題,提升代碼質量。
對於不能使用預編譯傳參時,要麼開啟 druid 的 filter 防火牆,要麼自己寫代碼邏輯過濾掉所有可能的注入關鍵字。
XSS 攻擊通常指的是通過利用網頁開發時留下的漏洞,通過巧妙的方法注入惡意指令代碼到網頁,使用戶載入並執行攻擊者惡意製造的網頁程序。這些惡意網頁程序通常是 JavaScript,但實際上也可以包括 Java、 VBScript、ActiveX、 Flash 或者甚至是普通的 HTML。攻擊成功後,攻擊者可能得到包括但不限於更高的許可權(如執行一些操作)、私密網頁內容、會話和 cookie 等各種內容。
通常情況下,被用來盜用 Cookie、破壞頁面結構、重定向到其他網站等
對用戶輸入的表單信息進行檢測過濾
CSRF - Cross-Site Request Forgery - 跨站請求偽造:
攻擊可以在受害者毫不知情的情況下以受害者名義偽造請求發送給受攻擊站點,從而在未授權的情況下執行在許可權保護之下的操作,CORS - Cross Origin Resourse-Sharing - 跨站資源共享,惡意訪問內網敏感資源。
有效的解決辦法是通過多種條件屏蔽掉非法的請求,例如 HTTP 頭、參數等:
防止大規模的惡意請求,niginx 反向代理可以配置請求頻率,對 ip 做限制。nginx 可以很方便地做訪問控制,特別是一些偶發性的大量惡意請求,需要屏蔽處理。
屏蔽 ip 地址
屏蔽 user-agent
屏蔽代理 ip
有兩種情形會需要屏蔽代理 ip:一是代理 ip 訪問,二是負載均衡(real-ip 請求負載均衡伺服器,再代理給後端 server)
創建 包裝器,這是實現 XSS 過濾的關鍵,在其內重寫了 getParameter,getParameterValues,getHeader 等方法,對 http 請求內的參數進行了過濾
㈢ java里拼接sql怎麼防注入
最簡單最容易的是限制用戶輸入。簡單點的就是不允許用戶輸入單引號 和 --,因為單引號號--在SQL中都是影響執行的,兩種方式一種是在JSP中加判斷:
3
另一種是在SQL拼接是對單引號和--等進行轉義,str = str.replace("'", "''");
㈣ java防止sql注入有哪些方法
前台我們可以通過過濾用戶輸入,後台可以通過PreparedStatement來代替Statement來執行SQL語句。
㈤ 如何防範SQL注入漏洞及檢測
以下是OMG我為大家收集整理的文章,希望對大家有所幫助。
SQL注入(SQLInjection)漏洞攻擊是目前網上最流行最熱門的黑客腳本攻擊方法之一,那什麼是SQL注入漏洞攻擊呢?它是指黑客利用一些Web應用程序(如:網站、論壇、留言本、文章發布系統等)中某些存在不安全代碼或SQL語句不縝密的頁面,精心構造SQL語句,把非法的SQL語句指令轉譯到系統實際SQL語句中並執行它,以獲取用戶名、口令等敏感信息,從而達到控制主機伺服器的攻擊方法。
1. SQL注入漏洞攻擊原理
1. 1 SQL注入漏洞攻擊實現原理
SQL(Structured Query Language)是一種用來和資料庫交互的語言文本。SQL注入的攻擊原理就是攻擊者通過Web應用程序利用SQL語句或字元串將非法的數據插入到伺服器端資料庫中,獲取資料庫的管理用戶許可權,然後將資料庫管理用戶許可權提升至操作系統管理用戶許可權,控制伺服器操作系統,獲取重要信息及機密文件。
SQL注入漏洞攻擊主要是通過藉助於HDSI、NBSI和Domain等SQL注入漏洞掃描工具掃描出Web頁面中存在的SQL注入漏洞,從而定位SQL注入點,通過執行非法的SQL語句或字元串達到入侵者想要的操作。下面以一段身份驗證的.NET代碼為例,說明一下SQL 注入攻擊的實現方法。
SqlConnectionnwConn = new SqlConnection((string)ConfigurationSettings.AppSettings["DBconnStrings"]); string queryStr = "SELECT userid,userpwd, username,type FROM users where userid='" + Txtusername.Text +"'";
DataSet userSet = new DataSet();
SqlDataAdapter userAdapter = newSqlDataAdapter(queryStr, nwConn);
userAdapter.Fill(userSet, "Users");
Session["UserID"] =Txtusername.Text.ToString();
Session["type"] =type.Text.ToString();
Response.Redirect("/Myweb/admin/login.aspx");
從上面的代碼中可以看出,程序在與資料庫建立連接得到用戶數據之後,直接將username的值通過session傳給login.aspx,沒有進行任何的過濾和處理措施, 直接用來構造SQL 語句, 其危險系數是非常高的, 攻擊者只要根據SQL 語句的編寫規則就可以繞過身份驗證,從而達到入侵的目的。
1. 2 SQL注入漏洞攻擊分析
SQL注入可以說是一種漏洞,也可以說是一種攻擊。當程序中的變數處理不當,沒有對用戶提交的數據類型進行校驗,編寫不安全的代碼,構造非法的SQL語句或字元串,都可能產生這個漏洞。
例如Web系統有一個login頁面,這個login頁面控制著用戶是否有權訪問,要求用戶輸入一個用戶名和口令,連接資料庫的語句為:
“select * from users where username = 'username' andpassword = 'password'”
攻擊者輸入用戶名為aa or 1=1口令為1234 or 1=1之類的內容。我們可以看出實際上攻擊者並不知道真正的用戶名、口令,該內容提交給伺服器之後,伺服器執行攻擊者構造出的SQL命令,但由於攻擊者輸入的內容非常特殊,所以最後得到的SQL命令變成:
“select * from users where username = 'aa' or 1=1 andpassword = '1234' or 1=1”
伺服器執行查詢或存儲過程,將用戶輸入的身份信息和資料庫users表中真實的身份信息進行核對,由於SQL命令實際上已被修改,存在永遠成立的1=1條件,因此已經不能真正驗證用戶身份,所以系統會錯誤地授權攻擊者訪問。
SQL 注入是通過目標伺服器的80埠進行的,是正常的Web訪問,防火牆不會對這種攻擊發出警告或攔截。當Web伺服器以普通用戶的身份訪問資料庫時,利用SQL注入漏洞就可能進行創建、刪除、修改資料庫中所有數據的非法操作。而當資料庫以管理用戶許可權的身份進行登錄時,就可能控制整個資料庫伺服器。
SQL注入的方法很多,在以手動方式進行攻擊時需要構造各種各樣的SQL語句,所以一般攻擊者需要豐富的經驗和耐心,才能繞過檢測和處理,提交語句,從而獲得想要的有用信息。這個過程需要花費很多的時間,如果以這種手動方式進行SQL注入漏洞攻擊,許多存在SQL注入漏洞的ASP、JSP、PHP、JAVA等網站就會安全很多了,不是漏洞不存在了,而是手動入侵者需要編程基礎,但現在攻擊者可以利用一些現成的黑客工具來輔助SQL注入漏洞攻擊,加快入侵的速度,使SQL注入變得輕而易舉。
由於SQL注入漏洞攻擊利用的是通用的SQL語法,使得這種攻擊具有廣泛性。理論上說,對於所有基於SQL語言的資料庫管理系統都是有效的,包括MSSQLServer、Oracle、DB2、Sybase和MySQL等。當然,各種系統自身的SQL擴展功能會有所不同,因此最終的攻擊代碼可能不盡相同。
1. 3 SQL注入漏洞攻擊過程
(1)繞過身份驗證
如一個login界面,需要輸入用戶名和口令,然後Post到另一個頁面,進行身份驗證,因此攻擊者只需在用戶名和口令的輸入框中都輸入aa or’1’=’1’的內容,那麼攻擊者就可以通過欺騙的驗證方式而直接進入下一個頁面,並擁有和正常登錄用戶一樣的全部特權。原因是什麼呢? 我們比較一下正常用戶登錄和攻擊者登錄時的兩種SQL語句:
1)正常用戶(如用戶名為admin,口令為1234567) :
SQL= " selectfrom users where username = ’admin’and password= ’1234567’ ";
2)攻擊者(用戶名和口令都為aa or’1’=’1’) :
SQL= " select * from users where username='aa or’1’=’1’'and password = ' aa or’1’=’1’'";
可以看到由and連接的兩個條件都被一個永遠成立的1=1所代替,執行的結果為true,資料庫會認為條件恆成立,會返回一個true,讓攻擊者以合法身份登錄進入下一個頁面。
(2)執行非法操作
如一個查詢頁面select1.asp? id=1,編程人員原本設計意圖是顯示id為1的查詢信息,而攻擊者利用程序中沒有對id內容進行檢查的機制,插入自己的代碼。
從select1.asp中摘錄一段關鍵代碼:
SQL= " select *from photo where photoid= 'id'";
可以看到,id沒有進行任何的處理,直接構成SQL語句並執行,而攻擊者在知道該系統資料庫中表名及欄位名的情況下,利用SQL語句特性(分號是將兩句SQL 語句分開的符號),直接向資料庫Tuser表中添加記錄:
select1.asp? id= 1;Insertinto Tuser (username,password,type) values ('hack','1234567','管理員'),然後攻擊者就可以直接用hack進行登錄了。通過這樣的方法,攻擊者還可以對系統做任何的事情,包括添加、刪除、修改系統資源的操作。
(3)執行系統命令
如果Web主機使用MSSQL資料庫管理系統,那麼攻擊者就可以用到xp_cmdshell這個擴展存儲過程,xp_cmdshell是一個非常有用的擴展存儲過程,用於執行系統命令,比如dir、net等,攻擊者可以根據程序的不同,提交不同的語句:
execmaster.dbo.xp_cmdshell " dir "; exec master.dbo.xp_cmdshell" net user hack 1234567 /add ";
execmaster.dbo.xp_cmdshell " net localgroup administrators hack /add ";
這樣就可以向Web主機系統中成功添加了一個管理員帳戶。
2. SQL注入漏洞攻擊的檢測方式及方法
2. 1檢測方式
SQL注入漏洞攻擊檢測分為入侵前的檢測和入侵後的檢測。入侵前的檢測,可以通過手工方式,也可以使用SQL注入漏洞掃描工具軟體。檢測的目的是為預防SQL注入漏洞攻擊,而對於SQL注入漏洞攻擊後的檢測,主要是針對審計日誌的查看,SQL注入漏洞攻擊成功後,會在Web Service和資料庫的審計日誌中留下“痕跡”。
2. 2檢測方法
(1)動態SQL檢查
動態的SQL語句是一個進行資料庫查詢的強大的工具,但把它和用戶輸入混合在一起就使SQL注入成為了可能。將動態的SQL語句替換成預編譯的SQL或者存儲過程對大多數應用程序是可行的。預編譯的SQL或者存儲過程可以將用戶的輸入作為參數而不是命令來執行,這樣就限制了入侵者的行動。當然,它不適用於存儲過程中利用用戶輸入來生成SQL命令的情況。在這種情況下,用戶輸入的SQL命令仍可能得到執行,資料庫仍然存在SQL注入漏洞攻擊的危險。
(2)有效性校驗
如果一個輸入框只可能包括數字,那麼要通過驗證確保用戶輸入的都是數字。如果可以接受字母,檢查是不是存在不可接受的字元,那就需要設置字元串檢查功能。確保應用程序要檢查以下字元:分號、等號、破折號、括弧以及SQL關鍵字。
(3)數據表檢查
使用SQL注入漏洞攻擊工具軟體進行SQL注入漏洞攻擊後,都會在資料庫中生成一些臨時表。通過查看資料庫中最近新建的表的結構和內容,可以判斷是否曾經發生過SQL注入漏洞攻擊。
(4)審計日誌檢查
在Web伺服器中如果啟用了審計日誌功能,則Web Service審計日誌會記錄訪問者的IP地址、訪問時間、訪問文件等信息,SQL注入漏洞攻擊往往會大量訪問某一個頁面文件(存在SQL注入點的動態網頁),審計日誌文件會急劇增加,通過查看審計日誌文件的大小以及審計日誌文件中的內容,可以判斷是否發生過SQL注入漏洞攻擊事件;另外還可以通過查看資料庫審計日誌,查詢某個時間段是否有非法的插入、修改、刪除操作。
(5)其他
SQL注入漏洞攻擊成功後,入侵者往往會添加特權用戶(如:administrator、root、sa等)、開放非法的遠程服務以及安裝木馬後門程序等,可以通過查看用戶帳戶列表、遠程服務開啟情況、系統最近日期產生的一些文件等信息來判斷是否發生過入侵。
3. SQL注入漏洞防範措施
SQL注入漏洞攻擊的防範方法有很多種,現階段總結起來有以下方法:
(1)數據有效性校驗。如果一個輸入框只可能包括數字,那麼要通過校驗確保用戶輸入的都是數字。如果可以接受字母,那就要檢查是不是存在不可接受的字元,最好的方法是增加字元復雜度自動驗證功能。確保應用程序要檢查以下字元:分號、等號、破折號、括弧以及SQL關鍵字。另外限製表單數據輸入和查詢字元串輸入的長度也是一個好方法。如果用戶的登錄名最多隻有10個字元,那麼不要認可表單中輸入10個以上的字元,這將大大增加攻擊者在SQL命令中插入有害代碼的難度。
(2)封裝數據信息。對客戶端提交的數據進行封裝,不要將數據直接存入cookie中,方法就是在編程的代碼中,插入session、if、try、else,這樣可以有效地防止攻擊者獲取cookie中的重要信息。
(3)去除代碼中的敏感信息。將在代碼中存在的用戶名、口令信息等敏感欄位刪除,替換成輸入框。
SQL=" select from users where username = ’admin’and password= ’1234567’ "
如:這樣顯然會暴露管理員的用戶名、口令信息。可以將其修改成:
SQL= " select * from users where username='" +Txtuser.Text + "' and userpwd='" + Textpwd.Text + "'"
這樣就安全了很多,入侵者也是不會輕易的就獲取到用戶名、口令信息。
(4)替換或刪除單引號。使用雙引號替換掉所有用戶輸入的單引號,這個簡單的預防措施將在很大程度上預防SQL注入漏洞攻擊,單引號時常會無法約束插入數據的Value,可能給予輸入者不必要的許可權。用雙引號替換掉單引號可以使大部分SQL注入漏洞攻擊失敗。 如:
“select* from users where username='" + admin + "' and userpwd='" + 1234567+ "'”
顯然會得到與
“select * from users where username='admin' and password= '1234567'”
相同的結果。
(5)指定錯誤返回頁面。攻擊者有時從客戶端嘗試提交有害代碼和攻擊字元串,根據Web Service給出的錯誤提示信息來收集程序及伺服器的信息,從而獲取想得到的資料。應在Web Service中指定一個不包含任何信息的錯誤提示頁面。
(6)限制SQL字元串連接的配置文件。使用SQL變數,因為變數不是可以執行的腳本,即在Web頁面中將連接資料庫的SQL字元串替換成指定的Value,然後將Web.config文件進行加密,拒絕訪問。
(7)設置Web目錄的訪問許可權。將虛擬站點的文件目錄禁止遊客用戶(如:Guest用戶等)訪問,將User用戶許可權修改成只讀許可權,切勿將管理許可權的用戶添加到訪問列表。
(8)最小服務原則。Web伺服器應以最小許可權進行配置,只提供Web服務,這樣可以有效地阻止系統的危險命令,如ftp、cmd、vbscript等。
(9)鑒別信息加密存儲。將保存在資料庫users表中的用戶名、口令信息以密文形式保存,也可以對users表進行加密處理,這樣可以大大增加對鑒別信息訪問的安全級別。
(10)用戶許可權分離。應盡可能的禁止或刪除資料庫中sa許可權用戶的訪問,對不同的資料庫劃分不同的用戶許可權,這樣不同的用戶只能對授權給自己的資料庫執行查詢、插入、更新、刪除操作,就可以防止不同用戶對非授權的資料庫進行訪問。
4. 結束語
SQL注入漏洞攻擊在網上非常普遍,許多ASP、PHP論壇和文章管理系統、下載系統以及新聞系統都存在這個漏洞。造成SQL注入漏洞攻擊的主要原因是開發人員在系統開發的過程中編程不規范,沒有形成良好的編程習慣,問題的解決只有依賴於規范編程。此外,也可以使用現有的SQL注入漏洞掃描器對整個網站中的關鍵代碼進行掃描,查找網站頁面中存在的SQL注入點。對於有問題的頁面,可以及時刪除或更新。本文通過對SQL注入漏洞攻擊的方法、原理以及攻擊實施過程進行了闡述和總結,並給出了一些常見的SQL注入漏洞攻擊防範的方法。
㈥ SQL注入怎麼防範
SQL注入攻擊的危害很大,而且防火牆很難對攻擊行為進行攔截,主要的SQL注入攻擊防範方法,具體有以下幾個方面:
1、分級管理
對用戶進行分級管理,嚴格控制用戶的許可權,對於普通用戶,禁止給予資料庫建立、刪除、修改等相關許可權,只有系統管理員才具有增、刪、改、查的許可權。
2、參數傳值
程序員在書寫SQL語言時,禁止將變數直接寫入到SQL語句,必須通過設置相應的參數來傳遞相關的變數。從而抑制SQL注入。數據輸入不能直接嵌入到查詢語句中。同時要過濾輸入的內容,過濾掉不安全的輸入數據。或者採用參數傳值的方式傳遞輸入變數,這樣可以最大程度防範SQL注入攻擊。
3、基礎過濾與二次過濾
SQL注入攻擊前,入侵者通過修改參數提交and等特殊字元,判斷是否存在漏洞,然後通過select、update等各種字元編寫SQL注入語句。因此防範SQL注入要對用戶輸入進行檢查,確保數據輸入的安全性,在具體檢查輸入或提交的變數時,對於單引號、雙引號、冒號等字元進行轉換或者過濾,從而有效防止SQL注入。
當然危險字元有很多,在獲取用戶輸入提交參數時,首先要進行基礎過濾,然後根據程序的功能及用戶輸入的可能性進行二次過濾,以確保系統的安全性。
4、使用安全參數
SQL資料庫為了有效抑制SQL注入攻擊的影響。在進行SQLServer資料庫設計時設置了專門的SQL安全參數。在程序編寫時應盡量使用安全參數來杜絕注入式攻擊,從而確保系統的安全性。
5、漏洞掃描
為了更有效地防範SQL注入攻擊,作為系統管理除了設置有效的防範措施,更應該及時發現系統存在SQL攻擊安全漏洞。系統管理員可以采購一些SQL漏洞掃描工具,通過專業的掃描工具,可以及時的掃描到系統存在的相應漏洞。
6、多層驗證
現在的網站系統功能越來越龐大復雜。為確保系統的安全,訪問者的數據輸入必須經過嚴格的驗證才能進入系統,驗證沒通過的輸入直接被拒絕訪問資料庫,並且向上層系統發出錯誤提示信息。同時在客戶端訪問程序中驗證訪問者的相關輸入信息,從而更有效的防止簡單的SQL注入。但是如果多層驗證中的下層如果驗證數據通過,那麼繞過客戶端的攻擊者就能夠隨意訪問系統。因此在進行多層驗證時,要每個層次相互配合,只有在客戶端和系統端都進行有效的驗證防護,才能更好地防範SQL注入攻擊。
7、資料庫信息加密
傳統的加解密方法大致分為三種:對稱加密、非對稱加密、不可逆加密。
㈦ java如何防止sql注入
採用預編譯語句集,它內置了處理SQL注入的能力,只要使用它的setString方法傳值即可:
String
sql=
"select
*
from
users
where
username=?;
PreparedStatement
preState
=
conn.prepareStatement(sql);
preState.setString(1,
userName);
preState.setString(2,
password);
ResultSet
rs
=
preState.executeQuery();
㈧ 什麼是sql注入如何防止sql注入
SQL注入是一種非常常見的資料庫攻擊手段,同時也是網路世界中最普遍的漏洞之一,簡單理解就是惡意用戶通過在表單中填寫包含SQL關鍵字的數據來使資料庫執行非常規代碼的過程。
問題來源是,SQL資料庫的操作是通過SQL語句來執行的,而無論是執行代碼還是數據項都必須寫在SQL語句中,也就導致如果我們在數據項中加入了某些SQL語句關鍵字,比如SELECT、DROP等,這些關鍵字就很有可能在資料庫寫入或讀取數據時得到執行。
解決方案
方案一:
採用預編譯技術
使用預編譯的SQL語句,SQL語句的語義不會是不會發生改變的。預編譯語句在創建的時候就已經將指定的SQL語句發送給了DBMS,完成了解析,檢查,編譯等工作,所以攻擊者無法改變SQL語句的結構,只是把值賦給?,然後將?這個變數傳給SQL語句。當然還有一些通過預編譯繞過某些安全防護的操作,大家感興趣可以去搜索一下。
方案二:
嚴格控制數據類型
在java、c等強類型語言中一般是不存在數字型注入的,因為在接受到用戶輸入id時,代碼一般會做一個int id 的數據類型轉換,假如我們輸入的是字元串的話,那麼這種情況下,程序就會報錯。但是在PHP、ASP這些沒有強調處理數據類型的語言,一般我們看到的接收id的代碼都是如下等代碼。
方案三:
對特殊的字元進行轉義
數字型注入可以通過檢查數據類型防止,但是字元型不可以,那麼怎麼辦呢,最好的辦法就是對特殊的字元進行轉義了。比如在MySQL中我們可以對" '
"進行轉義,這樣就防止了一些惡意攻擊者來閉合語句。當然我們也可以通過一些安全函數來轉義特殊字元。如addslashes()等,但是這些函數並非一勞永逸,攻擊者還可以通過一些特殊的方式繞過。
㈨ 用java編寫防止SQL注入!求java高手指點!問題解決後,一定提高懸賞!
SQL注入無非就是把對單引號和雙"-"進行轉換。
最好不要拼裝SQL語句,以使用參數化的sql或者直接使用存儲過程進行數據查詢存取。
㈩ java中preparedstatement為什麼可以防止sql注入
不知道樓主用沒有用過
select * from tab_name where name= '"+name+"' and passwd='"+passwd+"';
把其中passwd換成 [' or '1' = '1] 這樣就可以完成sql注入
更有可能對你的資料庫表drop操作
如果使用preparedstatement的話就可以直接使用預編譯,PreparedStatement不允許在插入時改變查詢的邏輯結構.
舉例
statement
select * from tab_name where name= '"+name+"' and passwd='"+passwd+"';
passwd就可以換成 『 or '1'='1
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(sql);
preparedstatement
select * from tab_name where name=? and passwd=? ;
PreparedStatement pst = con.prepareStatement(sql);
pstmt.setString(1, name);
pstmt.setString(2, passwd);
ResultSet rs = pstmt.executeQuery();