如何防止網站被SQL注入攻擊之java網站安全防禦

SQL注入攻擊(SQL injection)是目前網站安全以及服務器安全層面上是最具備攻擊性,危害性較高,被黑客利用最多的一個漏洞,基本上針對於網站代碼,包括JAVA JSP PHP ASP apache tomcat 語言開發的代碼都會存在sql注入漏洞。前端

 

隨着JAVA JSP架構的市場份額愈來愈多,許多平臺都使用JAVA開發,本文經過對sql注入的詳細分析,從代碼層面以及服務器層面,根本上來防止sql注入攻擊。nginx

 

SQL注入漏洞的原理很簡單,通俗來說:就是程序員在編寫網站代碼的時候,一些執行數據庫命令的代碼,程序員沒有認真寫以及認真過濾,致使能夠將外部的惡意參數拼接到SQL語句當中去,直接傳入到數據庫中去執行,致使黑客能夠執行一些查詢用戶帳戶密碼,修改信息,執行系統命令的安全操做。程序員

 

網站安全服務web

 

下面咱們來搭建一個JAVA環境的網站,設計一個能夠查詢用戶信息的一個api 服務接口,咱們採用的都是springboot + jersey 來搭建咱們的web服務查詢框架。spring

 

數據庫是Mysql 架構的,創建一個新的數據庫表:admin,而後建立管理員帳戶跟密碼(採用md5加密方式),這樣咱們的用戶信息有了,就能夠提供查詢了。咱們把springboot + jersey框架服務搭建起來,而後寫一下查詢的代碼到框架裏。Sine安全公司是一家專一於:服務器安全、網站安全、網站安全檢測、網站漏洞修復,滲透測試,安全服務於一體的網絡安全服務提供商。sql

 

咱們再來測試下查詢的接口,是否能夠正常輸出:數據庫

 

經過網站進行get請求提交,Web服務接口返回200並輸出了用戶名爲admin的管理員帳戶以及密碼。這樣的輸出是屬於正常的,可是咱們在網站端發送一條帶有逗號的GET請求,會發現報錯了。apache

 

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''xxxx''' at line 1。api

 

也就是說上面的查詢是錯誤的,由於咱們添加了一個逗號在裏面,致使傳入到數據庫並執行的同時,數據庫返回的錯誤提示。tomcat

網站安所有署

 

SQL注入詳情解析:

 

GET的網站時候參數的時候,傳入了一個String類型的name參數值,而且經過字符串聯起來,構建了數據庫的查詢語句。在正常操做的狀況下,用戶會傳入合法的name參數值進行數據庫查詢,可是攻擊者會編造一些惡意的參數,只要參數經過字符串拼接後依然是一句合法的SQL查詢,此時SQL注入就發生了。正如咱們上文輸入的name=xxxx'or'a'='a與咱們接口中的查詢語句進行拼接後構成以下SQL語句如圖:

當接口執行name=xxxx'or'a'='a這個SQL語句後,系統後臺也就至關於免費的送給黑客了,黑客一看到管理員密碼這個hash,都不用去cmd5解密了,攻擊者就會直接使用123456這個密碼去登陸網站的後臺管理系統。爲何?由於123456的md5哈希太常見了,這就是不少JAVA網站的現實,在網站安全以及弱口令方面簡直作的不忍直視。

 

好了,如今咱們應該明白了,SQL Injection緣由就是因爲傳入的參數與系統的SQL拼接成了合法的SQL而致使的,而其本質仍是將用戶輸入的數據當作了代碼執行。在系統中只要有一個SQL注入點被黑客發現,那麼黑客基本上能夠執行任意想執行的SQL語句了,例如添加一個管理員,查詢全部表,修改用戶密碼等等。

 

以上是對sql注入攻擊的詳情,下文會詳細的介紹,如何去防範sql注入的攻擊,知彼知己才能百戰不殆。瞭解了sql的攻擊原理,才能更好去防護sql注入攻擊。

網站安全須要精心雕琢,服務器安全是100 - 1 = 0的業務,即便你防護了99%的攻擊,那還不算勝利,只要有一次網站被入侵了,那就有可能給公司帶來很嚴重的損失跟後果。若是不懂網站防SQL攻擊的的話,也能夠找專業的安全公司來部署防sql注入攻擊部署,國內安全公司像綠盟、Sinesafe、在安全方面都是作的比較不錯的。

 

 

SQL注入的其餘防範辦法

不少公司都會存在老系統中有大量SQL注入風險代碼的問題,可是因爲其已穩定支持公司業務好久,不宜採用大面積代碼更新的方式來消除注入隱患,因此須要考慮其採用他方式來防範SQL注入。除了在在SQL執行方式上防範SQL注入,不少時候還能夠經過架構上,或者經過其餘過濾方式來達到防止SQL注入的效果。

一切輸入都是不安全的:對於接口的調用參數,要進行格式匹配,例如admin的經過name查詢的接口,與之匹配的Path應該使用正則匹配(由於用戶名中不該該存在特殊字符),從而確保傳入參數是程序控制範圍以內的參數,即只接受已知的良好輸入值,拒毫不良輸入。注意:驗證參數應將它與輸出編碼技術結合使用。

利用分層設計來避免危險:前端儘可能靜態化,儘可能少的暴露能夠訪問到DAO層的接口到公網環境中,若是現有項目,很難修改存在注入的代碼,能夠考慮在web服務以前增長WAF進行流量過濾,固然代碼上就不給hacker留有攻擊的漏洞才最好的方案。也能夠在擁有nginx的架構下,採用OpenRestry作流量過濾,將一些特殊字符進行轉義處理。

儘可能使用預編譯SQL語句:因爲動態SQL語句是引起SQL注入的根源。應使用預編譯語句來組裝SQL查詢。

規範化:將輸入安裝規定編碼解碼後再進行輸入參數過濾和輸出編碼處理;拒絕一切非規範格式的編碼。

相關文章
相關標籤/搜索