XSS攻擊一般指的是經過利用網頁開發時留下的漏洞,經過巧妙的方法注入惡意指令代碼到網頁,使用戶加載並執行攻擊者惡意製造的網頁程序。這些惡意網頁程序一般是JavaScript,但實際上也能夠包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻擊成功後,攻擊者可能獲得包括但不限於更高的權限(如執行一些操做)、私密網頁內容、會話和cookie等各類內容。html
XSS (Cross-Site Scripting),跨站腳本攻擊,由於縮寫和CSS同樣,因此就只能叫XSS。是很是常見的一種web攻擊手段。XSS的原理是攻擊者往Web頁面插入惡意可執行網頁腳本,當用戶瀏覽這個頁面的時候,嵌在網頁中的腳本就會執行,從而達到竊取用戶信息的目的。前端
XSS的攻擊手段很是多,大體能夠分爲下面幾個類型。web
非持久型XSS攻擊,顧名思義是一次性的攻擊,僅對當前訪問的頁面產生影響。攻擊者會讓用戶訪問一個被篡改的URL,當用戶訪問該連接的時候就會觸發預先插入網頁中的腳本,從而達到攻擊的目的。數據庫
https://xxx.com/xxx?test=<script>alert(document.cookie)</script>
複製代碼
舉個例子: 攻擊者能夠經過上面的URL執行腳本代碼alert('XSS')後端
持久型XSS漏洞,通常存在於表單提交等交互功能,如文章留言,提交文本信息等,黑客利用的XSS漏洞,將攻擊腳本經正常功能提交進入數據庫持久保存,當前端頁面得到後端從數據庫中讀出的注入代碼時,剛好將其渲染執行。跨域
WeChat5a10e5ea6b59dd0198ab34d1bdee19c1.png 瀏覽器
相較於反射性XSS攻擊,存儲型XSS攻擊更持久,危害性也更高。可是攻擊成本也會相應的提升。安全
由於同時要知足幾個條件:後端數據入庫的時候沒有進行轉義。前端拿到數據沒有轉義直接渲染。任何一個條件的不知足都會致使攻擊的失敗。服務器
咱們常說用戶的輸入是不可信的,把用戶的輸入想象成具備攻擊性的代碼。最廣泛的作法就是轉義輸入輸出的內容,對於引號、尖括號、斜槓進行轉義。如今有不少開源的XSS Filter。markdown
在前端渲染的時候對可能存在攻擊的內容作XSS過濾。轉義格式化標誌字符,從而禁止可疑代碼的執行。想要對抗XSS,如下的字符轉義內容是必不可少的:
特殊字符 | 實體編碼 |
---|---|
& | & |
< | < |
> | > |
" | " |
' | ' |
/ | / |
這是預防XSS攻擊竊取用戶cookie最有效的防護手段。Web應用程序在設置cookie時,將其屬性設爲HttpOnly,就能夠避免該網頁的cookie被客戶端惡意JavaScript竊取,保護用戶cookie信息。
跨站請求僞造(Cross-site request forgery),也被稱爲one-click attack 或者session riding,一般縮寫爲CSRF 或者XSRF, 是一種挾制用戶在當前已登陸的Web應用程序上執行非本意的操做的攻擊方法。
經過如下幾個原則能夠大大減小CSRF的攻擊:
對Cookie設置SameSite屬性。該屬性表示Cookie不隨着跨域請求發送,能夠很大程度減小CSRF的攻擊。
在HTTP請求中以參數的形式加入一個隨機產生的token,並在服務器創建一個攔截器來驗證這個token。服務器讀取瀏覽器當前域cookie中這個token值,會進行校驗該請求當中的token和cookie當中的token值是否都存在且相等,才認爲這是合法的請求。不然認爲此次請求是違法的,拒絕該次服務。
Referer是header的一部分,當瀏覽器向web服務器發送請求時,通常會帶上Referer信息告訴服務器是從哪一個頁面連接過來的,服務器籍此能夠得到一些信息用於處理。能夠經過檢查請求的來源來防護CSRF攻擊。正常請求的referer具備必定規律,如在提交表單的referer一定是在該頁面發起的請求。因此經過檢查http包頭referer的值是否是這個頁面,來判斷是否是CSRF攻擊。可是這個方法存在必定的風險。
這是一個偏向業務的方法,也在不少的網站中應用。當用戶想要操做存在危險的動做,好比修改密碼、更換本身的手機號、修改銀行卡、轉帳等操做的時候,進行驗證碼二次確承認以很大程度上提升安全性。