北京Web培訓
達內北京萬壽路中心

010-62126400

熱門課程

北京Web培訓 > web知識 >北京web培訓班:前端新手該如何躲過 XSS 攻擊?

北京web培訓班:前端新手該如何躲過 XSS 攻擊?

  • 時間:2020-03-18 16:26
  • 發布:北京Web培訓
  • 來源:web知識

作為JS系工程師接觸最多的漏洞我想就是 XSS 漏洞了,然鵝并不是所有的同學對其都有一個清晰的認識。今天達內北京web培訓機構為大家分享一下 XSS 漏洞攻擊,希望能幫助到大家。

什么是 XSS 攻擊

XSS(Cross-Site Scripting)又稱跨站腳本,XSS的重點不在于跨站點,而是在于腳本的執行。XSS是一種經常出現在 Web 應用程序中的計算機安全漏洞,是由于 Web 應用程序對用戶的輸入過濾不足而產生的。

常見的 XSS 攻擊有三種:反射型、DOM-based 型、存儲型。其中反射型、DOM-based 型可以歸類為非持久型 XSS 攻擊,存儲型歸類為持久型 XSS 攻擊。

1、反射型

反射型 XSS 一般是攻擊者通過特定手法(如電子郵件),誘使用戶去訪問一個包含惡意代碼的 URL,當受害者點擊這些專門設計的鏈接的時候,惡意代碼會直接在受害者主機上的瀏覽器執行。

對于訪問者而言是一次性的,具體表現在我們把我們的惡意腳本通過 URL 的方式傳遞給了服務器,而服務器則只是不加處理的把腳本“反射”回訪問者的瀏覽器而使訪問者的瀏覽器執行相應的腳本。反射型 XSS 的觸發有后端的參與,要避免反射性 XSS,必須需要后端的協調,后端解析前端的數據時首先做相關的字串檢測和轉義處理。

此類 XSS 通常出現在網站的搜索欄、用戶登錄口等地方,常用來竊取客戶端 Cookies 或進行釣魚欺騙。

整個攻擊過程大約如下:

反射型

2、DOM-based 型

客戶端的腳本程序可以動態地檢查和修改頁面內容,而不依賴于服務器端的數據。例如客戶端如從 URL 中提取數據并在本地執行,如果用戶在客戶端輸入的數據包含了惡意的 JavaScript 腳本,而這些腳本沒有經過適當的過濾和消毒,那么應用程序就可能受到 DOM-based XSS 攻擊。需要特別注意以下的用戶輸入源 document.URL、 location.hash、 location.search、 document.referrer 等。

整個攻擊過程大約如下:

DOM-based

3、存儲型

攻擊者事先將惡意代碼上傳或儲存到漏洞服務器中,只要受害者瀏覽包含此惡意代碼的頁面就會執行惡意代碼。這就意味著只要訪問了這個頁面的訪客,都有可能會執行這段惡意腳本,因此儲存型XSS的危害會更大。

存儲型 XSS 一般出現在網站留言、評論、博客日志等交互處,惡意腳本存儲到客戶端或者服務端的數據庫中。

整個攻擊過程大約如下:

DOM-based

這XSS 攻擊的危害

XSS 可以導致:

1、攻擊劫持訪問;

2、盜用 cookie 實現無密碼登錄;

3、配合 csrf 攻擊完成惡意請求;

4、使用 js 或 css 破壞頁面正常的結構與樣式等;

防御方法

1、XSS 防御之 HTML 編碼

應用范圍:將不可信數據放入到 HTML 標簽內(例如div、span等)的時候進行HTML編碼。

編碼規則:將 & < > " ' / 轉義為實體字符(或者十進制、十六進制)。

示例代碼:

function encodeForHTML(str, kwargs){

return ('' + str)

.replace(/&/g, '&')

.replace(/ < HEX=> < Entity=> <

.replace(/>/g, '>')

.replace(/"/g, '"')

.replace(/'/g, ''') // &apos; 不推薦,因為它不在HTML規范中

.replace(/\//g, '/');

};

HTML 有三種編碼表現方式:十進制、十六進制、命名實體。例如小于號(<)可以編碼為 "十進制> <", "十六進制=> <", "命名實體=> <" 三種方式。對于單引號(')由于實體字符編碼方式不在 HTML 規范中,所以此處使用了十六進制編碼。

2、XSS 防御之 HTML Attribute 編碼

應用范圍:將不可信數據放入 HTML 屬性時(不含src、href、style 和事件處理屬性),進行 HTML Attribute 編碼

編碼規則:除了字母數字字符以外,使用 HH;(或者可用的命名實體)格式來轉義ASCII值小于256所有的字符

示例代碼:

function encodeForHTMLAttibute(str, kwargs){

let encoded = '';

for(let i = 0; i < str.length; i++) {

let ch = hex = str[i];

if (!/[A-Za-z0-9]/.test(str[i]) && str.charCodeAt(i) < 256) {

hex = '&#x' + ch.charCodeAt(0).toString(16) + ';';

}

encoded += hex;

}

return encoded;

};

3、XSS 防御之 JavaScript 編碼

作用范圍:將不可信數據放入事件處理屬性、JavaScirpt值時進行 JavaScript 編碼

編碼規則:除字母數字字符外,請使用xHH格式轉義ASCII碼小于256的所有字符

示例代碼:

function encodeForJavascript(str, kwargs) {

let encoded = '';

for(let i = 0; i < str.length; i++) {

let cc = hex = str[i];

if (!/[A-Za-z0-9]/.test(str[i]) && str.charCodeAt(i) < 256) {

hex = '\\x' + cc.charCodeAt().toString(16);

}

encoded += hex;

}

return encoded;

};

4、XSS 防御之 URL 編碼

作用范圍:將不可信數據作為 URL 參數值時需要對參數進行 URL 編碼

編碼規則:將參數值進行 encodeURIComponent 編碼

示例代碼:

function encodeForURL(str, kwargs){

return encodeURIComponent(str);

};

5、XSS 防御之 CSS 編碼

作用范圍:將不可信數據作為 CSS 時進行 CSS 編碼

編碼規則:除了字母數字字符以外,使用XXXXXX格式來轉義ASCII值小于256的所有字符

示例代碼:

function encodeForCSS (attr, str, kwargs){

let encoded = '';

for (let i = 0; i < str.length; i++) {

let ch = str.charAt(i);

if (!ch.match(/[a-zA-Z0-9]/) {

let hex = str.charCodeAt(i).toString(16);

let pad = '000000'.substr((hex.length));

encoded += '\\' + pad + hex;

} else {

encoded += ch;

}

}

return encoded;

};

后記

在任何時候用戶的輸入都是不可信的。對于 HTTP 參數,理論上都要進行驗證,例如某個字段是枚舉類型,其就不應該出現枚舉以為的值;對于不可信數據的輸出要進行相應的編碼;此外 httpOnly、 CSP、 X-XSS-Protection、 Secure Cookie等也可以起到有效的防護。

XSS 漏洞有時比較難發現,所幸當下React、Vue等框架都從框架層面引入了 XSS 防御機制,一定程度上解放了我們的雙手。

但是作為開發人員依然要了解 XSS 基本知識、于細節處避免制造 XSS 漏洞。框架是輔助,我們仍需以人為本,規范開發習慣,提高 Web 前端安全意識。(本文來源于網絡)

上一篇:北京web培訓:有關前端的一些“坑”,別踩!
下一篇:北京web培訓:一文看懂JS無埋點技術!

馬上預約七天免費體驗課

姓名:

電話:

北京web培訓班:有關前端的一些“坑”,別踩!

北京web培訓:30 歲轉行web前端做開發,晚嗎?

CSS的設計模式難?一篇文章即可掌握重點!

前端新手怎么才能做好性能優化?

選擇城市和中心
江西省

貴州省

廣西省

海南省

女人和女人做人爱视频