1. 程式人生 > >java面試題精解1:詳解XSS攻擊、SQL注入攻擊、CSRF攻擊

java面試題精解1:詳解XSS攻擊、SQL注入攻擊、CSRF攻擊

1、xss攻擊

1.1 什麼是xss攻擊

XSS全稱cross-site scripting(跨站點指令碼),是當前 web 應用中最危險和最普遍的漏洞之一。攻擊者向網頁中注入惡意指令碼,當用戶瀏覽網頁時,指令碼就會執行,進而影響使用者,比如關不完的網站、盜取使用者的 cookie 資訊從而偽裝成使用者去操作,攜帶木馬等等。

1.2 xss分類

  1. 反射型XSS(非永續性跨站攻擊)
  2. 儲存型XSS(永續性跨站攻擊)
  3. DOM Based XSS(基於 dom 的跨站點指令碼攻擊)

1.2.1 反射型XSS(非永續性跨站攻擊)

利用網站某些頁面會直接輸出請求引數的特性,通過在url的請求引數包含惡意指令碼,誘使使用者點選嵌入惡意指令碼的url連結執行惡意指令碼以達到攻擊的目的。目前有很多攻擊者利用論壇、微博釋出含有惡意指令碼的URL就屬於這種方式。

1.2.2 儲存型XSS(永續性跨站攻擊)

通過表單輸入(比如釋出文章、回覆評論等功能中)插入一些惡意指令碼,並且提交到被攻擊網站的伺服器資料庫中。當用戶瀏覽指定網頁時,惡意指令碼從資料庫中被載入到頁面執行,QQ郵箱的早期版本就曾經被利用作為持久型跨站指令碼攻擊的平臺。

與反射型 XSS 相比,該類的攻擊更具有危害性,因為它影響的不只是一個使用者,而是大量使用者,而且該種類型還可進行蠕蟲傳播。

1.2.3 DOM Based XSS(基於 dom 的跨站點指令碼攻擊)

通過前面兩種型別的方式,注入的指令碼是通過改變 DOM 來進行攻擊的。採用該種方式有一個好處就是從原始碼中不易被發現。

1.3 防範xss攻擊

1.3.1 xss攻擊漏洞產生的原因

產生xss攻擊漏洞主要是因為伺服器沒有對使用者輸入進行編碼和過濾。

另一個原因是,這種攻擊方法有很多變體,攻擊的手法卻不斷翻新,要設計出一個能完全防禦的XSS過濾器是非常困難的。

1.3.2 xss攻擊防護防範

防範xss攻擊的原則就是不相信使用者輸入的資料,我們可以從倆分泌入手:

  1. 消毒(對危險字元進行轉義)
  2. HttpOnly(防範XSS攻擊者竊取Cookie資料)。
消毒
  • 對資料進行轉義,比如<轉義成&lt;,這樣<script>xxx</script>
    指令碼就執行不了了。
  • 錄入資料設定白名單,比如javaWeb專案,設定過濾器過濾特殊字元
  • 前端頁面限制使用者輸入資料型別,比如使用者輸入完年齡後驗證輸入內容只能是數字。
  • 過濾JS事件的標籤,比如onclickload

HttpOnly

將重要的cookie標記為http only, 這樣的話Javascript 中的document.cookie語句就不能獲取到cookie了

2、SQL注入攻擊

2.1 什麼是SQL注入

SQL注入,顧名思義就是通過注入SQL命令來進行攻擊,更確切地說攻擊者把SQL命令插入到web表單或請求引數的查詢字串裡面提交給伺服器,從而讓伺服器執行執行的該SQL。

SQL 注入漏洞產生的原因

既然SQL注入是通過讓伺服器執行了惡意的SQL命令從而進行攻擊的,那麼主要問題就出在於伺服器是如何生成 SQL語句的。絕大多數擁有SQL注入漏洞的Web系統,在生成SQL語句的時候,採用的是拼接字串的方式,並且沒有對要組裝成SQL語句的引數進行檢驗和過濾。另外Mybatis框架的佔位符用的$而不是#也存在被注入的風險。

2.2 SQL注入攻擊防範

SQL注入攻擊的防護與xss攻擊的有點類似,也可以採用消毒的方式,過濾特殊操作字元來避免大部分的注入攻擊。

3、CSRF攻擊

3.1 定義

CSRF攻擊,全程Cross Site Request Forgery(跨站請求偽造),攻擊者通過跨站請求,以合法的使用者身份進行非法操作(如轉賬或發帖等)。CSRF的原理是利用瀏覽器的Cookie或伺服器的Session,盜取使用者身份,從而進行操作。

3.2 CSRF漏洞產生的原因

CSRF漏洞產生的原因是伺服器端沒有對請求的發起源進行合理的檢驗,不加分析地認為請求者一定是正常的使用者,響應請求給非法分子。

3.3 防範

CSRF 攻擊是一種請求偽造的攻擊方式,它利用的是伺服器不能識別使用者的型別從而盜取使用者的資訊來攻擊。因此要防禦該種攻擊,因為從伺服器端著手,增強伺服器的識別能力,設計良好的防禦機制。
主要有以下幾種方式:

  1. 請求頭中的Referer驗證(不推薦)
  2. 請求令牌驗證(token驗證)

3.3.1 請求頭中的Referer驗證

HTTP的頭部有一個Referer資訊的欄位,它記錄著該次HTTP請求的來源地址(即它從哪裡來的),既然CSRF攻擊是偽造請求是從伺服器傳送過來的,那麼我們就禁止跨域訪問,在伺服器端增加驗證,過濾掉那些不是從本伺服器發出的請求,這樣可以在一定程度上避免CSRF攻擊。 但是這也有缺點,比如如果是從搜尋引擎所搜結果調整過來,請求也會被認為是跨域請求。

3.3.2 請求令牌驗證(token驗證)

token驗證是一種比較廣泛使用的防止CSRF攻擊的手段,當用戶通過正常渠道訪問伺服器時,伺服器會生成一個隨機的字串儲存在session中,並作為令牌(token)返回給客戶端,以隱藏的形式儲存在客戶端中,客戶端每次請求都會帶著這個token,伺服器根據該token判斷該請求是否合法