什麽是XSS攻擊
XSS(Cross-SiteScripting)又(yòu)稱跨站腳本,XSS的重點不在于跨站點,而是在于腳本的執行。XSS是一(yī)種經常出現在Web應用程序中(zhōng)的計算機安全漏洞,是由于Web應用程序對用戶的輸入過濾不足而産生(shēng)的。
常見的XSS攻擊有三種:反射型、DOM-based型、存儲型。其中(zhōng)反射型、DOM-based型可以歸類爲非持久型XSS攻擊,存儲型歸類爲持久型XSS攻擊。
1.反射型
反射型XSS一(yī)般是攻擊者通過特定手法(如電(diàn)子郵件),誘使用戶去(qù)訪問一(yī)個包含惡意代碼的URL,當受害者點擊這些專門設計的鏈接的時候,惡意代碼會直接在受害者主機上的浏覽器執行。
對于訪問者而言是一(yī)次性的,具體(tǐ)表現在我(wǒ)(wǒ)們把我(wǒ)(wǒ)們的惡意腳本通過URL的方式傳遞給了服務器,而服務器則隻是不加處理的把腳本“反射”回訪問者的浏覽器而使訪問者的浏覽器執行相應的腳本。反射型XSS的觸發有後端的參與,要避免反射性XSS,必須需要後端的協調,後端解析前端的數據時首先做相關的字串檢測和轉義處理。
此類XSS通常出現在網站的搜索欄、用戶登錄口等地方,常用來竊取客戶端Cookies或進行釣魚欺騙。
整個攻擊過程大(dà)約如下(xià):
2.DOM-based型
客戶端的腳本程序可以動态地檢查和修改頁面内容,而不依賴于服務器端的數據。例如客戶端如從URL中(zhōng)提取數據并在本地執行,如果用戶在客戶端輸入的數據包含了惡意的JavaScript腳本,而這些腳本沒有經過适當的過濾和消毒,那麽應用程序就可能受到DOM-basedXSS攻擊。需要特别注意以下(xià)的用戶輸入源document.URL、location.hash、location.search、document.referrer等。
整個攻擊過程大(dà)約如下(xià):
3.存儲型
攻擊者事先将惡意代碼上傳或儲存到漏洞服務器中(zhōng),隻要受害者浏覽包含此惡意代碼的頁面就會執行惡意代碼。這就意味着隻要訪問了這個頁面的訪客,都有可能會執行這段惡意腳本,因此儲存型XSS的危害會更大(dà)。
存儲型XSS一(yī)般出現在網站留言、評論、博客日志(zhì)等交互處,惡意腳本存儲到客戶端或者服務端的數據庫中(zhōng)。
整個攻擊過程大(dà)約如下(xià):
XSS攻擊的危害
XSS可以導緻:
攻擊劫持訪問;
盜用cookie實現無密碼登錄;
配合csrf攻擊完成惡意請求;
使用js或css破壞頁面正常的結構與樣式等;
防禦方法
1.XSS防禦之HTML編碼
應用範圍:将不可信數據放(fàng)入到HTML标簽内(例如div、span等)的時候進行HTML編碼。
編碼規則:将&<>"'/轉義爲實體(tǐ)字符(或者十進制、十六進制)。
示例代碼:
functionencodeForHTML(str,kwargs){return(''+str).replace(/&/g,'&').replace(/<.replace(/>/g,'>').replace(/"/g,'"').replace(/'/g,''')//'不推薦,因爲它不在HTML規範中(zhōng).replace(/\//g,'/');};
HTML有三種編碼表現方式:十進制、十六進制、命名實體(tǐ)。例如小(xiǎo)于号(<)可以編碼爲"十進制><","十六進制=><","命名實體(tǐ)=><"三種方式。對于單引号(')由于實體(tǐ)字符編碼方式不在HTML規範中(zhōng),所以此處使用了十六進制編碼。
2.XSS防禦之HTMLAttribute編碼
應用範圍:将不可信數據放(fàng)入HTML屬性時(不含src、href、style和事件處理屬性),進行HTMLAttribute編碼
編碼規則:除了字母數字字符以外(wài),使用HH;(或者可用的命名實體(tǐ))格式來轉義ASCII值小(xiǎo)于256所有的字符
示例代碼:
functionencodeForHTMLAttibute(str,kwargs){letencoded='';for(leti=0;i
3.XSS防禦之JavaScript編碼
作用範圍:将不可信數據放(fàng)入事件處理屬性、JavaScirpt值時進行JavaScript編碼
編碼規則:除字母數字字符外(wài),請使用xHH格式轉義ASCII碼小(xiǎo)于256的所有字符
示例代碼:
functionencodeForJavascript(str,kwargs){letencoded='';for(leti=0;i
4.XSS防禦之URL編碼
作用範圍:将不可信數據作爲URL參數值時需要對參數進行URL編碼
編碼規則:将參數值進行encodeURIComponent編碼
示例代碼:
functionencodeForURL(/templates/default/str,kwargs){returnencodeURIComponent(str);};
5.XSS防禦之CSS編碼
作用範圍:将不可信數據作爲CSS時進行CSS編碼
編碼規則:除了字母數字字符以外(wài),使用XXXXXX格式來轉義ASCII值小(xiǎo)于256的所有字符
示例代碼:
functionencodeForCSS(attr,str,kwargs){letencoded='';for(leti=0;i
後記
在任何時候用戶的輸入都是不可信的。對于HTTP參數,理論上都要進行驗證,例如某個字段是枚舉類型,其就不應該出現枚舉以爲的值;對于不可信數據的輸出要進行相應的編碼;此外(wài)httpOnly、CSP、X-XSS-Protection、SecureCookie等也可以起到有效的防護。
XSS漏洞有時比較難發現,所幸當下(xià)React、Vue等框架都從框架層面引入了XSS防禦機制,一(yī)定程度上解放(fàng)了我(wǒ)(wǒ)們的雙手。
但是作爲開(kāi)發人員(yuán)依然要了解XSS基本知(zhī)識、于細節處避免制造XSS漏洞。框架是輔助,我(wǒ)(wǒ)們仍需以人爲本,規範開(kāi)發習慣,提高Web前端安全意識。