黄a在线观看-黄a在线-黄a大片-黄色片在线看-黄色毛片免费-黄色大片网站

您的位置:首頁技術文章
文章詳情頁

詳解前端安全之JavaScript防http劫持與XSS

瀏覽:159日期:2023-06-03 09:27:34
目錄HTTP劫持、DNS劫持與XSSHTTP劫持DNS劫持XSS跨站腳本頁面被嵌入 iframe 中,重定向 iframe使用白名單放行正常 iframe 嵌套更改 URL 參數繞過運營商標記內聯事件及內聯腳本攔截瀏覽器事件模型靜態腳本攔截使用白名單對 src 進行匹配過濾動態腳本攔截Mutation Events 與 DOMNodeInserted重寫 setAttribute 與 document.write重寫原生 Element.prototype.setAttribute 方法重寫嵌套 iframe 內的 Element.prototype.setAttribute重寫 document.write鎖死 apply 和 call建立攔截上報HTTPS 與 CSPCSPHTTPSHTTP劫持、DNS劫持與XSS

先簡單講講什么是 HTTP 劫持與 DNS 劫持。

HTTP劫持

什么是HTTP劫持呢,大多數情況是運營商HTTP劫持,當我們使用HTTP請求請求一個網站頁面的時候,網絡運營商會在正常的數據流中插入精心設計的網絡數據報文,讓客戶端(通常是瀏覽器)展示“錯誤”的數據,通常是一些彈窗,宣傳性廣告或者直接顯示某網站的內容,大家應該都有遇到過。

DNS劫持

DNS 劫持就是通過劫持了 DNS 服務器,通過某些手段取得某域名的解析記錄控制權,進而修改此域名的解析結果,導致對該域名的訪問由原IP地址轉入到修改后的指定IP,其結果就是對特定的網址不能訪問或訪問的是假網址,從而實現竊取資料或者破壞原有正常服務的目的。

DNS 劫持比之 HTTP 劫持 更加過分,簡單說就是我們請求的是http://www.a.com/index.html ,直接被重定向了 http://www.b.com/index.html ,本文不會過多討論這種情況。

XSS跨站腳本

XSS指的是攻擊者利用漏洞,向 Web 頁面中注入惡意代碼,當用戶瀏覽該頁之時,注入的代碼會被執行,從而達到攻擊的特殊目的。

關于這些攻擊如何生成,攻擊者如何注入惡意代碼到頁面中本文不做討論,只要知道如 HTTP 劫持 和 XSS 最終都是惡意代碼在客戶端,通常也就是用戶瀏覽器端執行,本文將討論的就是假設注入已經存在,如何利用 Javascript 進行行之有效的前端防護。

頁面被嵌入 iframe 中,重定向 iframe

先來說說我們的頁面被嵌入了 iframe 的情況。也就是,網絡運營商為了盡可能地減少植入廣告對原有網站頁面的影響,通常會通過把原有網站頁面放置到一個和原頁面相同大小的 iframe 里面去,那么就可以通過這個 iframe 來隔離廣告代碼對原有頁面的影響。

詳解前端安全之JavaScript防http劫持與XSS

這種情況還比較好處理,我們只需要知道我們的頁面是否被嵌套在 iframe 中,如果是,則重定向外層頁面到我們的正常頁面即可。

那么有沒有方法知道我們的頁面當前存在于 iframe 中呢?有的,就是window.self與window.top。

window.self

返回一個指向當前 window 對象的引用。

window.top

返回窗口體系中的最頂層窗口的引用。

對于非同源的域名,iframe 子頁面無法通過 parent.location 或者 top.location 拿到具體的頁面地址,但是可以寫入 top.location ,也就是可以控制父頁面的跳轉。

兩個屬性分別可以又簡寫為self與top,所以當發現我們的頁面被嵌套在 iframe 時,可以重定向父級頁面:

if (self != top) { // 我們的正常頁面 var url = location.href; // 父級頁面重定向 top.location = url;}使用白名單放行正常 iframe 嵌套

當然很多時候,也許運營需要,我們的頁面會被以各種方式推廣,也有可能是正常業務需要被嵌套在 iframe 中,這個時候我們需要一個白名單或者黑名單,當我們的頁面被嵌套在 iframe 中且父級頁面域名存在白名單中,則不做重定向操作。

上面也說了,使用 top.location.href 是沒辦法拿到父級頁面的 URL 的,這時候,需要使用document.referrer。

通過 document.referrer 可以拿到跨域 iframe 父頁面的URL。

// 建立白名單var whiteList = [ ’www.aaa.com’, ’res.bbb.com’]; if (self != top) { var // 使用 document.referrer 可以拿到跨域 iframe 父頁面的 URL parentUrl = document.referrer, length = whiteList.length, i = 0; for(; i<length; i++){ // 建立白名單正則 var reg = new RegExp(whiteList[i],’i’); // 存在白名單中,放行 if(reg.test(parentUrl)){ return; } } // 我們的正常頁面 var url = location.href; // 父級頁面重定向 top.location = url;}更改 URL 參數繞過運營商標記

這樣就完了嗎?沒有,我們雖然重定向了父頁面,但是在重定向的過程中,既然第一次可以嵌套,那么這一次重定向的過程中頁面也許又被 iframe 嵌套了,真尼瑪蛋疼。

當然運營商這種劫持通常也是有跡可循,最常規的手段是在頁面 URL 中設置一個參數,例如 http://www.example.com/index.html?iframe_hijack_redirected=1,其中iframe_hijack_redirected=1表示頁面已經被劫持過了,就不再嵌套 iframe 了。所以根據這個特性,我們可以改寫我們的 URL ,使之看上去已經被劫持了:

var flag = ’iframe_hijack_redirected’;// 當前頁面存在于一個 iframe 中// 此處需要建立一個白名單匹配規則,白名單默認放行if (self != top) { var // 使用 document.referrer 可以拿到跨域 iframe 父頁面的 URL parentUrl = document.referrer, length = whiteList.length, i = 0; for(; i<length; i++){ // 建立白名單正則 var reg = new RegExp(whiteList[i],’i’); // 存在白名單中,放行 if(reg.test(parentUrl)){ return; } } var url = location.href; var parts = url.split(’#’); if (location.search) { parts[0] += ’&’ + flag + ’=1’; } else { parts[0] += ’?’ + flag + ’=1’; } try { console.log(’頁面被嵌入iframe中:’, url); top.location.href = parts.join(’#’); } catch (e) {}}

當然,如果這個參數一改,防嵌套的代碼就失效了。所以我們還需要建立一個上報系統,當發現頁面被嵌套時,發送一個攔截上報,即便重定向失敗,也可以知道頁面嵌入 iframe 中的 URL,根據分析這些 URL ,不斷增強我們的防護手段,這個后文會提及。

內聯事件及內聯腳本攔截

在 XSS 中,其實可以注入腳本的方式非常的多,尤其是 HTML5 出來之后,一不留神,許多的新標簽都可以用于注入可執行腳本。

列出一些比較常見的注入方式:

1.<a href='javascript:alert(1)' rel='external nofollow' _fcksavedurl='javascript:alert(1)' ></a>

2.<iframe src='javascript:alert(1)' />

3.<img src=’x’ />

4.<video src=’x’ ></video>

5.<div onmouseover='alert(2)' ><div>

除去一些未列出來的非常少見生僻的注入方式,大部分都是javascript:...及內聯事件on*。

我們假設注入已經發生,那么有沒有辦法攔截這些內聯事件與內聯腳本的執行呢?

對于上面列出的 (1) (5) ,這種需要用戶點擊或者執行某種事件之后才執行的腳本,我們是有辦法進行防御的。

瀏覽器事件模型

這里說能夠攔截,涉及到了事件模型相關的原理。

我們都知道,標準瀏覽器事件模型存在三個階段:

捕獲階段 目標階段 冒泡階段

對于一個這樣<a href='javascript:alert(222)' rel='external nofollow' rel='external nofollow' _fcksavedurl='javascript:alert(222)' ></a>的 a 標簽而言,真正觸發元素alert(222)是處于點擊事件的目標階段。

<a href='javascript:alert(222)' rel='external nofollow' rel='external nofollow' >Click Me</a><script> document.addEventListener(’click’, function(e) { alert(111); }, true);</script>

點擊上面的click me,先彈出 111 ,后彈出 222。

那么,我們只需要在點擊事件模型的捕獲階段對標簽內javascript:...的內容建立關鍵字黑名單,進行過濾審查,就可以做到我們想要的攔截效果。

對于 on* 類內聯事件也是同理,只是對于這類事件太多,我們沒辦法手動枚舉,可以利用代碼自動枚舉,完成對內聯事件及內聯腳本的攔截。

以攔截 a 標簽內的href='javascript:...為例,我們可以這樣寫:

// 建立關鍵詞黑名單var keywordBlackList = [ ’xss’, ’BAIDU_SSP__wrapper’, ’BAIDU_DSPUI_FLOWBAR’]; document.addEventListener(’click’, function(e) { var code = ''; // 掃描 <a href='javascript:' rel='external nofollow' > 的腳本 if (elem.tagName == ’A’ && elem.protocol == ’javascript:’) { var code = elem.href.substr(11); if (blackListMatch(keywordBlackList, code)) { // 注銷代碼 elem.href = ’javascript:void(0)’; console.log(’攔截可疑事件:’ + code); } }}, true); /** * [黑名單匹配] * @param {[Array]} blackList [黑名單] * @param {[String]} value [需要驗證的字符串] * @return {[Boolean]} [false -- 驗證不通過,true -- 驗證通過] */function blackListMatch(blackList, value) { var length = blackList.length, i = 0; for (; i < length; i++) { // 建立黑名單正則 var reg = new RegExp(whiteList[i], ’i’); // 存在黑名單中,攔截 if (reg.test(value)) { return true; } } return false;}

點擊圖中這幾個按鈕,可以看到如下:

詳解前端安全之JavaScript防http劫持與XSS

這里我們用到了黑名單匹配,下文還會細說。

靜態腳本攔截

XSS 跨站腳本的精髓不在于“跨站”,在于“腳本”。

通常而言,攻擊者或者運營商會向頁面中注入一個<script>腳本,具體操作都在腳本中實現,這種劫持方式只需要注入一次,有改動的話不需要每次都重新注入。

我們假定現在頁面上被注入了一個<script src='http://attack.com/xss.js'>腳本,我們的目標就是攔截這個腳本的執行。

聽起來很困難啊,什么意思呢。就是在腳本執行前發現這個可疑腳本,并且銷毀它使之不能執行內部代碼。

所以我們需要用到一些高級 API ,能夠在頁面加載時對生成的節點進行檢測。

MutationObserver

MutationObserver 是 HTML5 新增的 API,功能很強大,給開發者們提供了一種能在某個范圍內的 DOM 樹發生變化時作出適當反應的能力。

說的很玄乎,大概的意思就是能夠監測到頁面 DOM 樹的變換,并作出反應。

MutationObserver()該構造函數用來實例化一個新的Mutation觀察者對象。

MutationObserver( function callback);

目瞪狗呆,這一大段又是啥?意思就是 MutationObserver 在觀測時并非發現一個新元素就立即回調,而是將一個時間片段里出現的所有元素,一起傳過來。所以在回調中我們需要進行批量處理。而且,其中的callback會在指定的 DOM 節點(目標節點)發生變化時被調用。在調用時,觀察者對象會傳給該函數兩個參數,第一個參數是個包含了若干個 MutationRecord 對象的數組,第二個參數則是這個觀察者對象本身。

所以,使用 MutationObserver ,我們可以對頁面加載的每個靜態腳本文件,進行監控:

// MutationObserver 的不同兼容性寫法var MutationObserver = window.MutationObserver || window.WebKitMutationObserver ||window.MozMutationObserver;// 該構造函數用來實例化一個新的 Mutation 觀察者對象// Mutation 觀察者對象能監聽在某個范圍內的 DOM 樹變化var observer = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { // 返回被添加的節點,或者為null. var nodes = mutation.addedNodes; for (var i = 0; i < nodes.length; i++) { var node = nodes[i]; if (/xss/i.test(node.src))) {try { node.parentNode.removeChild(node); console.log(’攔截可疑靜態腳本:’, node.src);} catch (e) {} } } });}); // 傳入目標節點和觀察選項// 如果 target 為 document 或者 document.documentElement// 則當前文檔中所有的節點添加與刪除操作都會被觀察到observer.observe(document, { subtree: true, childList: true});

詳解前端安全之JavaScript防http劫持與XSS

<script type='text/javascript' src='http://m.propowerdrill.cn/bcjs/xss/a.js'></script>是頁面加載一開始就存在的靜態腳本(查看頁面結構),我們使用 MutationObserver 可以在腳本加載之后,執行之前這個時間段對其內容做正則匹配,發現惡意代碼則removeChild()掉,使之無法執行。

使用白名單對 src 進行匹配過濾

上面的代碼中,我們判斷一個js腳本是否是惡意的,用的是這一句:

if (/xss/i.test(node.src)) {}

當然實際當中,注入惡意代碼者不會那么傻,把名字改成 XSS 。所以,我們很有必要使用白名單進行過濾和建立一個攔截上報系統。

// 建立白名單var whiteList = [ ’www.aaa.com’, ’res.bbb.com’]; /** * [白名單匹配] * @param {[Array]} whileList [白名單] * @param {[String]} value [需要驗證的字符串] * @return {[Boolean]} [false -- 驗證不通過,true -- 驗證通過] */function whileListMatch(whileList, value) { var length = whileList.length, i = 0; for (; i < length; i++) { // 建立白名單正則 var reg = new RegExp(whiteList[i], ’i’); // 存在白名單中,放行 if (reg.test(value)) { return true; } } return false;} // 只放行白名單if (!whileListMatch(blackList, node.src)) { node.parentNode.removeChild(node);} 

這里我們已經多次提到白名單匹配了,下文還會用到,所以可以這里把它簡單封裝成一個方法調用。

動態腳本攔截

上面使用 MutationObserver 攔截靜態腳本,除了靜態腳本,與之對應的就是動態生成的腳本。

var script = document.createElement(’script’);script.type = ’text/javascript’;script.src = ’http://www.example.com/xss/b.js’; document.getElementsByTagName(’body’)[0].appendChild(script); 

要攔截這類動態生成的腳本,且攔截時機要在它插入 DOM 樹中,執行之前,本來是可以監聽Mutation Events中的DOMNodeInserted事件的。

Mutation Events 與 DOMNodeInserted

打開MDN,第一句就是:

該特性已經從 Web 標準中刪除,雖然一些瀏覽器目前仍然支持它,但也許會在未來的某個時間停止支持,請盡量不要使用該特性。

雖然不能用,也可以了解一下:

document.addEventListener(’DOMNodeInserted’, function(e) { var node = e.target; if (/xss/i.test(node.src) || /xss/i.test(node.innerHTML)) { node.parentNode.removeChild(node); console.log(’攔截可疑動態腳本:’, node); }}, true);

然而可惜的是,使用上面的代碼攔截動態生成的腳本,可以攔截到,但是代碼也執行了:DOMNodeInserted顧名思義,可以監聽某個 DOM 范圍內的結構變化,與MutationObserver相比,它的執行時機更早。

詳解前端安全之JavaScript防http劫持與XSS

但是DOMNodeInserted不再建議使用,所以監聽動態腳本的任務也要交給MutationObserver。

可惜的是,在實際實踐過程中,使用MutationObserver的結果和DOMNodeInserted一樣,可以監聽攔截到動態腳本的生成,但是無法在腳本執行之前,使用removeChild將其移除,所以我們還需要想想其他辦法。

重寫 setAttribute 與 document.write重寫原生 Element.prototype.setAttribute 方法

在動態腳本插入執行前,監聽 DOM 樹的變化攔截它行不通,腳本仍然會執行。

那么我們需要向上尋找,在腳本插入 DOM 樹前的捕獲它,那就是創建腳本時這個時機。

假設現在有一個動態腳本是這樣創建的:

var script = document.createElement(’script’);script.setAttribute(’type’, ’text/javascript’);script.setAttribute(’src’, ’http://www.example.com/xss/c.js’); document.getElementsByTagName(’body’)[0].appendChild(script);

而重寫Element.prototype.setAttribute也是可行的:我們發現這里用到了 setAttribute 方法,如果我們能夠改寫這個原生方法,監聽設置src屬性時的值,通過黑名單或者白名單判斷它,就可以判斷該標簽的合法性了。

// 保存原有接口var old_setAttribute = Element.prototype.setAttribute; // 重寫 setAttribute 接口Element.prototype.setAttribute = function(name, value) { // 匹配到 <script src=’xxx’ > 類型 if (this.tagName == ’SCRIPT’ && /^src$/i.test(name)) { // 白名單匹配 if (!whileListMatch(whiteList, value)) { console.log(’攔截可疑模塊:’, value); return; } } // 調用原始接口 old_setAttribute.apply(this, arguments);}; // 建立白名單var whiteList = [’www.yy.com’,’res.cont.yy.com’]; /** * [白名單匹配] * @param {[Array]} whileList [白名單] * @param {[String]} value [需要驗證的字符串] * @return {[Boolean]} [false -- 驗證不通過,true -- 驗證通過] */function whileListMatch(whileList, value) { var length = whileList.length, i = 0; for (; i < length; i++) { // 建立白名單正則 var reg = new RegExp(whiteList[i], ’i’); // 存在白名單中,放行 if (reg.test(value)) { return true; } } return false;}

詳解前端安全之JavaScript防http劫持與XSS

重寫Element.prototype.setAttribute,就是首先保存原有接口,然后當有元素調用 setAttribute 時,檢查傳入的 src 是否存在于白名單中,存在則放行,不存在則視為可疑元素,進行上報并不予以執行。最后對放行的元素執行原生的setAttribute,也就是old_setAttribute.apply(this, arguments);。

上述的白名單匹配也可以換成黑名單匹配。

重寫嵌套 iframe 內的 Element.prototype.setAttribute

當然,上面的寫法如果old_setAttribute = Element.prototype.setAttribute暴露給攻擊者的話,直接使用old_setAttribute就可以繞過我們重寫的方法了,所以這段代碼必須包在一個閉包內。

當然這樣也不保險,雖然當前窗口下的Element.prototype.setAttribute已經被重寫了。但是還是有手段可以拿到原生的Element.prototype.setAttribute,只需要一個新的 iframe 。

var newIframe = document.createElement(’iframe’);document.body.appendChild(newIframe); Element.prototype.setAttribute = newIframe.contentWindow.Element.prototype.setAttribute;

通過這個方法,可以重新拿到原生的Element.prototype.setAttribute,因為 iframe 內的環境和外層 window 是完全隔離的。wtf?

怎么辦?我們看到創建 iframe 用到了createElement,那么是否可以重寫原生createElement呢?但是除了createElement還有createElementNS,還有可能是頁面上已經存在 iframe,所以不合適。

那就在每當新創建一個新 iframe 時,對setAttribute進行保護重寫,這里又有用到MutationObserver:

/** * 使用 MutationObserver 對生成的 iframe 頁面進行監控, * 防止調用內部原生 setAttribute 及 document.write * @return {[type]} [description] */function defenseIframe() { // 先保護當前頁面 installHook(window);} /** * 實現單個 window 窗口的 setAttribute保護 * @param {[BOM]} window [瀏覽器window對象] * @return {[type]} [description] */function installHook(window) { // 重寫單個 window 窗口的 setAttribute 屬性 resetSetAttribute(window); // MutationObserver 的不同兼容性寫法 var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver; // 該構造函數用來實例化一個新的 Mutation 觀察者對象 // Mutation 觀察者對象能監聽在某個范圍內的 DOM 樹變化 var observer = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { // 返回被添加的節點,或者為null. var nodes = mutation.addedNodes; // 逐個遍歷 for (var i = 0; i < nodes.length; i++) {var node = nodes[i]; // 給生成的 iframe 里環境也裝上重寫的鉤子if (node.tagName == ’IFRAME’) { installHook(node.contentWindow);} } }); }); observer.observe(document, { subtree: true, childList: true });} /** * 重寫單個 window 窗口的 setAttribute 屬性 * @param {[BOM]} window [瀏覽器window對象] * @return {[type]} [description] */function resetSetAttribute(window) { // 保存原有接口 var old_setAttribute = window.Element.prototype.setAttribute; // 重寫 setAttribute 接口 window.Element.prototype.setAttribute = function(name, value) { ... };} 

我們定義了一個installHook方法,參數是一個window,在這個方法里,我們將重寫傳入的window下的 setAttribute ,并且安裝一個MutationObserver,并對此窗口下未來可能創建的iframe進行監聽,如果未來在此window下創建了一個 iframe ,則對新的iframe也裝上installHook方法,以此進行層層保護。

重寫 document.write

根據上述的方法,我們可以繼續挖掘一下,還有什么方法可以重寫,以便對頁面進行更好的保護。

document.write是一個很不錯選擇,注入攻擊者,通常會使用這個方法,往頁面上注入一些彈窗廣告。

我們可以重寫document.write,使用關鍵詞黑名單對內容進行匹配。

什么比較適合當黑名單的關鍵字呢?我們可以看看一些廣告很多的頁面:

詳解前端安全之JavaScript防http劫持與XSS

這里在頁面最底部嵌入了一個 iframe ,里面裝了廣告代碼,這里的最外層的 id 名id='BAIDU_SSP__wrapper_u2444091_0'就很適合成為我們判斷是否是惡意代碼的一個標志,假設我們已經根據攔截上報收集到了一批黑名單列表:

// 建立正則攔截關鍵詞var keywordBlackList = [’xss’,’BAIDU_SSP__wrapper’,’BAIDU_DSPUI_FLOWBAR’];

接下來我們只需要利用這些關鍵字,對document.write傳入的內容進行正則判斷,就能確定是否要攔截document.write這段代碼。 

// 建立關鍵詞黑名單var keywordBlackList = [ ’xss’, ’BAIDU_SSP__wrapper’, ’BAIDU_DSPUI_FLOWBAR’]; /** * 重寫單個 window 窗口的 document.write 屬性 * @param {[BOM]} window [瀏覽器window對象] * @return {[type]} [description] */function resetDocumentWrite(window) { var old_write = window.document.write; window.document.write = function(string) { if (blackListMatch(keywordBlackList, string)) { console.log(’攔截可疑模塊:’, string); return; } // 調用原始接口 old_write.apply(document, arguments); }} /** * [黑名單匹配] * @param {[Array]} blackList [黑名單] * @param {[String]} value [需要驗證的字符串] * @return {[Boolean]} [false -- 驗證不通過,true -- 驗證通過] */function blackListMatch(blackList, value) { var length = blackList.length, i = 0; for (; i < length; i++) { // 建立黑名單正則 var reg = new RegExp(whiteList[i], ’i’); // 存在黑名單中,攔截 if (reg.test(value)) { return true; } } return false;}

我們可以把resetDocumentWrite放入上文的installHook方法中,就能對當前 window 及所有生成的 iframe 環境內的document.write進行重寫了。

鎖死 apply 和 call

接下來要介紹的這個是鎖住原生的 Function.prototype.apply 和 Function.prototype.call 方法,鎖住的意思就是使之無法被重寫。

這里要用到Object.defineProperty,用于鎖死 apply 和 call。

Object.defineProperty

Object.defineProperty() 方法直接在一個對象上定義一個新屬性,或者修改一個已經存在的屬性, 并返回這個對象。

Object.defineProperty(obj, prop, descriptor)

其中:

obj ? 需要定義屬性的對象 prop ? 需被定義或修改的屬性名 descriptor ? 需被定義或修改的屬性的描述符

我們可以使用如下的代碼,讓 call 和 apply 無法被重寫。

// 鎖住 callObject.defineProperty(Function.prototype, ’call’, { value: Function.prototype.call, // 當且僅當僅當該屬性的 writable 為 true 時,該屬性才能被賦值運算符改變 writable: false, // 當且僅當該屬性的 configurable 為 true 時,該屬性才能夠被改變,也能夠被刪除 configurable: false, enumerable: true});// 鎖住 applyObject.defineProperty(Function.prototype, ’apply’, { value: Function.prototype.apply, writable: false, configurable: false, enumerable: true}); 

為啥要這樣寫呢?其實還是與上文的重寫 setAttribute有關。

雖然我們將原始 Element.prototype.setAttribute 保存在了一個閉包當中,但是還有奇技淫巧可以把它從閉包中給“偷出來”。

試一下:

(function() {})( // 保存原有接口 var old_setAttribute = Element.prototype.setAttribute; // 重寫 setAttribute 接口 Element.prototype.setAttribute = function(name, value) {// 具體細節if (this.tagName == ’SCRIPT’ && /^src$/i.test(name)) {}// 調用原始接口old_setAttribute.apply(this, arguments); };)();// 重寫 applyFunction.prototype.apply = function(){ console.log(this);}// 調用 setAttributedocument.getElementsByTagName(’body’)[0].setAttribute(’data-test’,’123’); 

猜猜上面一段會輸出什么?看看:

詳解前端安全之JavaScript防http劫持與XSS

居然返回了原生 setAttribute 方法!

這是因為我們在重寫Element.prototype.setAttribute時最后有old_setAttribute.apply(this, arguments);這一句,使用到了 apply 方法,所以我們再重寫apply,輸出this,當調用被重寫后的 setAttribute 就可以從中反向拿到原生的被保存起來的old_setAttribute了。

這樣我們上面所做的嵌套 iframe 重寫 setAttribute 就毫無意義了。

使用上面的Object.defineProperty可以鎖死 apply 和 類似用法的 call 。使之無法被重寫,那么也就無法從閉包中將我們的原生接口偷出來。這個時候才算真正意義上的成功重寫了我們想重寫的屬性。

建立攔截上報

防御的手段也有一些了,接下來我們要建立一個上報系統,替換上文中的 console.log() 日志。

上報系統有什么用呢?因為我們用到了白名單,關鍵字黑名單,這些數據都需要不斷的豐富,靠的就是上報系統,將每次攔截的信息傳到服務器,不僅可以讓我們程序員第一時間得知攻擊的發生,更可以讓我們不斷收集這類相關信息以便更好的應對。

這里的示例我用nodejs搭一個十分簡易的服務器接受 http 上報請求。

先定義一個上報函數:

/** * 自定義上報 -- 替換頁面中的 console.log() * @param {[String]} name [攔截類型] * @param {[String]} value [攔截值] */function hijackReport(name, value) { var img = document.createElement(’img’), hijackName = name, hijackValue = value.toString(), curDate = new Date().getTime(); // 上報 img.src = ’http://www.reportServer.com/report/?msg=’ + hijackName + ’&value=’ + hijackValue + ’&time=’ + curDate;}

假定我們的服務器地址是www.reportServer.com這里,我們運用img.src發送一個 http 請求到服務器http://www.reportServer.com/report/,每次會帶上我們自定義的攔截類型,攔截內容以及上報時間。

用 Express 搭 nodejs 服務器并寫一個簡單的接收路由:

var express = require(’express’);var app = express(); app.get(’/report/’, function(req, res) { var queryMsg = req.query.msg,queryValue = req.query.value,queryTime = new Date(parseInt(req.query.time)); if (queryMsg) {console.log(’攔截類型:’ + queryMsg); } if (queryValue) {console.log(’攔截值:’ + queryValue); } if (queryTime) {console.log(’攔截時間:’ + req.query.time); }}); app.listen(3002, function() { console.log(’HttpHijack Server listening on port 3002!’);});

運行服務器,當有上報發生,我們將會接收到如下數據:

詳解前端安全之JavaScript防http劫持與XSS

好接下來就是數據入庫,分析,添加黑名單,使用nodejs當然攔截發生時發送郵件通知程序員等等,這些就不再做展開。

HTTPS 與 CSP

最后再簡單談談 HTTPS 與 CSP。其實防御劫持最好的方法還是從后端入手,前端能做的實在太少。而且由于源碼的暴露,攻擊者很容易繞過我們的防御手段。

CSP

CSP 即是 Content Security Policy,翻譯為內容安全策略。這個規范與內容安全有關,主要是用來定義頁面可以加載哪些資源,減少 XSS 的發生。

MDN ?CSP

HTTPS

能夠實施 HTTP 劫持的根本原因,是 HTTP 協議沒有辦法對通信對方的身份進行校驗以及對數據完整性進行校驗。如果能解決這個問題,則劫持將無法輕易發生。

HTTPS,是 HTTP over SSL 的意思。SSL 協議是 Netscape 在 1995 年首次提出的用于解決傳輸層安全問題的網絡協議,其核心是基于公鑰密碼學理論實現了對服務器身份認證、數據的私密性保護以及對數據完整性的校驗等功能。

因為與本文主要內容關聯性不大,關于更多 CSP 和 HTTPS 的內容可以自行谷歌。

以上就是詳解前端安全之JavaScript防http劫持與XSS的詳細內容,更多關于前端安全之JavaScript防http劫持與XSS的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
主站蜘蛛池模板: av色欲无码人妻中文字幕 | 国产一区二区三区四区五区vm | 91黄色影视 | 99精品视频一区 | 免费观看一区 | 日本视频一区二区三区 | 五月天丁香婷 | 久久小草亚洲综合 | 成人av无码一区二区三区 | 亚洲国产成人aⅴ毛片大全密桃 | 六姐妹在线观看免费 | 老司机免费在线视频 | 日本女人黄色 | 成人免费视频观看视频 | 黄色录像a| 亚洲国产综合无码一区 | 超碰人人超碰 | 国产在线视频网站 | 18禁超污无遮挡无码免费网站国产 | 99久久这里只有精品 | 一边添奶一边摸pp爽快视频 | 天堂va蜜桃| 中文字幕亚洲乱码熟女在线 | 图片区 小说区 区 亚洲五月 | 九九久久久久 | 国产精品久久久久影院色老大 | 国产日产久久高清欧美一区 | 亚洲精品无码成人aaa片 | 人人综合亚洲无线码另类 | 午夜啪视频 | japanese丰满少妇最高潮 | 亚洲精品av久久久久久久影院 | 成年人免费小视频 | av不卡一区二区三区 | 国产jjizz女人多水喷水 | 男女一进一出超猛烈的视频不遮挡在线观看 | 乱码人妻一区二区三区 | 久中文字幕 | 91久久精品一区二区二区 | 天天综合天天添夜夜添狠狠添 | 日本一卡二卡四卡无卡乱码视频免费 | 中文字幕日韩人妻不卡一区 | 中国真实的国产乱xxxx | 国产凸凹视频一区二区 | 免费av观看 | 明神亚贵在线免费观看 | 日本韩国欧美一区二区 | 美女毛片视频 | 女人被男人躁得好爽免费视频 | 午夜精品久久久久久不卡8050 | 日日操日日摸 | 真实的国产乱xxxx在线 | 黑人巨大精品一区二区 | 中文字幕国产专区 | 亚洲成人av一区二区 | 色欲av伊人久久大香线蕉影院 | 国产精品久久久久久一区二区三区 | 亚洲人成无码网站久久99热国产 | 国产精品一区一区 | 中文字幕在线视频第一页 | 荷兰av| 西西44rtwww国产精品 | 国产 亚洲 制服 无码 中文 | 精品久久久久久久久久久久久久久久久 | 新片速递丨最新合集bt伙计 | 日韩av一二三区 | 看全色黄大色黄大片大学生图片 | 成人一级生活片 | 亚洲精品一区二区三区丝袜 | 13女裸体慰在线观看 | 人妻熟女一区二区aⅴ林晓雪 | 奶大交一乱一乱一视一频 | 136fldh导航福利视频 | 亚洲天堂伦理 | 国产日韩一区二区 | 成人在线欧美 | 国产精品 高清 尿 小便 嘘嘘 | 在线免费av片 | 欧美成人三级在线播放 | 亚洲综合无码一区二区 | 国产成人亚洲综合无码精品 | 亚洲91网| 国模裸体无码xxxx视频 | 中文字幕女同女同女同 | 国产精品主播一区二区 | 色片在线播放 | 无人区乱码一区二区三区 | 午夜在线国产 | 日韩 在线 中文 制服一区 | 国产线播放免费人成视频播放 | 蜜臀91丨九色丨蝌蚪中文 | 黄色毛片视频校园交易 | 国产午夜精品无码一区二区 | 天天看夜夜爽 | 大胸女上下晃奶视频 | 免费一级黄色片 | 嫩草影院中文字幕 | 国产成人亚洲精品自产在线 | 求av网站| 最近中文2019字幕第二页 | 女子spa高潮呻吟抽搐 | 天天干天天射综合网 | 欧美日韩人成综合在线播放 | 午夜在线不卡 | 一本到亚洲网 | 大伊人狠狠躁夜夜躁av一区 | 亚洲自偷精品视频自拍 | 国产精品伦一区二区三级视频永妇 | 青青青手机频在线观看 | 一级片免费 | 99久久久国产精品免费蜜臀 | 国产有码在线观看 | 国产精品一区二区免费 | 四虎午夜影院 | 视频一区二区国产 | 欧美色射 | a级高清毛片| 在线国产一区二区 | 欧美一区二区在线观看视频 | 黄色成人在线免费观看 | 久久精品小视频 | 欧美日本国产欧美日本韩国99 | 一级免费大片 | 激情四虎 | 国产美女精品aⅴ在线播放 国产美女精品人人做人人爽 | 久草视频手机在线观看 | 亚洲高清网 | av手机天堂网 | 亚洲女人天堂色在线7777 | 美女极度色诱视频国产 | 夫妻性生活黄色大片 | 亚洲综合精品伊人久久 | 日韩av地址 | 亚洲日韩精品一区二区三区 | 熟妇人妻中文字幕 | 国产2 | 无码人妻精品一区二区蜜桃百度 | 成年人午夜免费视频 | 国产成人av无码精品 | 免费人成激情视频在线观看冫 | 在线观看成人免费视频 | 亚洲综合久 | 国产成人午夜精品 | 国产又粗又猛又爽又黄的视频p站 | 亚洲两性视频 | 久久99精品久久久久久 | 亚洲男同志网站 | gogogo日本免费观看电视动漫 | 久色| 亚洲精品高清国产一久久 | 日本又白又嫩水又多毛片 | 国产男女爽爽爽免费视频 | 国产区日韩区欧美区 | 99热国产在线 | 91丨九色丨黑人外教 | 日韩三区视频 | 伦人伦xxx国产对白 亚洲国产精品一区二区成人片国内 | 古风h啪肉禁欲 | 一本一道久久综合狠狠老精东影业 | 日本在线观看一区 | 精品无码国产av一区二区 | 国产舌乚八伦偷品w中 | 日本亚洲色大成网站www久久 | 疯狂做受xxxx国产 | 久久精品小视频 | 欧美一区二区三区在线观看视频 | 五月婷婷在线视频观看 | 2014亚洲天堂 | xx久久| 国产高清www| 国产成人手机在线 | 一区二区三区欧美在线 | 国产福利在线观看 | 灌满闺乖女h高h调教尿h | 丁香久久婷婷 | 午夜免费激情视频 | 天堂网国产 | 在线视频三区 | 色鬼久久 | 国产对白不带套毛片av | 国产免费观看久久黄av片 | 欧美专区在线播放 | 日韩精品视频中文字幕 | 黄色成人小视频 | 在线观看免费成人 | 一级大片视频 | 三级伊人| 久久亚洲欧美国产精品 | 亚洲欧美色图小说 | 青青伊人久久 | 国产免费一区二区视频 | 日韩av无码一区二区三区不卡 | 亚洲精品无码久久久影院相关影片 | 精品视频在线观看 | 欧美日韩在线综合 | 国产尤物av一区二区三区 | 亚洲一级黄色 | 天天干夜夜想 | 成人亚洲一区 | 99国产一区二区 | 日韩av伦理| 欧美精品高清在线观看 | 女十八毛片| 乡下农村妇女偷a毛片 | 韩国美女福利视频 | 久久久久国产精 | 国产瑟瑟视频 | 欧美黄色三级视频 | 欧美日韩在线综合 | 国产精品视频一区二区免费不卡 | 久久无码人妻热线精品 | 精品国偷自产在线视频 | 麻豆成人精品国产免费 | 久久久久亚洲精品无码网址 | 深夜久久久 | jizz欧美性23 | 一区二区影视 | 思热99re视热频这里只精品 | 成人av中文字幕 | 麻豆mv免费观看 | 久热精品视频在线播放 | 国产专区一区 | 免费特黄视频 | 么公的好大好硬好深好爽视频 | 精品国产福利在线 | 一个人看的www视频在线播放 | 国产精品区一区二区三在线播放 | 国产又爽又黄的激情精品视频 | 四虎4hu永久免费 | 伊人久久爱 | 桃色视频m3u8| 日韩一区久久 | 男男一级淫片免费播放 | 欧美亚洲一区二区三区四区 | 国产精品久久久久9999 | 91精品国产乱码麻豆白嫩 | 日本大片免a费观看视频 | y111111国产精品久久婷婷 | 在线观看污污网站 | 日韩第三页| 18禁男女爽爽爽午夜网站免费 | 91在线成人| 午夜天堂视频 | 99国产精品久久久久久久日本竹 | 少妇性俱乐部纵欲狂欢电影 | 97av.com| xxxx精品| 婷婷综合精品 | 丰满岳妇乱一区二区三区 | 在线观看欧美一区二区 | 亚洲中文字幕无码av在线 | 色偷偷亚洲 | 香蕉视频在线观看网站 | 日韩区在线观看 | 91国偷自产一区二区三区蜜臀 | 国产欧美一区二区三区在线 | 少妇激情视频 | 国产激情久久久久久熟女老人av | 午夜欧美精品久久久久久久 | 深爱五月激情五月 | 国a产久v久伊人 | 伊人焦久影院 | 一级黄色淫片 | av人摸人人人澡人人超碰下载 | 国产高清视频在线免费观看 | 粉嫩av一区二区三区在线观看 | 天天狠天天操 | 欧美人与性动交g欧美精器 狠狠躁18三区二区一区ai明星 | 色香影视 | 亚洲欧美国产双大乳头 | 男女吻胸做爰摸下身 | 天天躁日日躁狠躁欧美 | 欧美另类videos | 日韩精品在线第一页 | 黄色一几片 | 免费看欧美成人a片无码 | 成年人在线网站 | 精品无码专区毛片 | 中文字幕亚洲欧美日韩 | 夜天干天干啦天干天天爽 | 少妇扒开腿让我爽了一夜 | 国产网红主播无码精品 | 少妇裸体长淫交视频免费观看 | 国产精品视频久久久久 | 亚洲国产一区二区精品 | 久久久精品久久日韩一区综合 | 国产人与zoxxxx另类一一 | 九色porny蝌蚪视频 | 国产精品 欧美日韩 | 麻豆视频免费在线 | 少妇啊灬啊别停灬用力啊房东 | 人妻少妇中文字幕久久 | 性生交片免费无码看人 | 国产无套精品一区二区 | 夜夜高潮夜夜爽 | 色偷偷88888欧美精品久久久 | 无码少妇精品一区二区免费动态 | 日本肉体做爰猛烈高潮全免费 | 国产思思99re99在线观看 | 欧美一级免费 | 久久久成人免费 | 欧美成人在线网站 | 日本黄色生活片 | 日日躁夜夜躁aaaabbbb | 九九精品在线视频 | 欧美日韩在线免费看 | xxxxx欧美妇科医生检查 | 国产欧美一区二区精品性 | 日韩久久精品一区二区三区 | 天堂av无码av一区二区三区 | 亚洲精品中文字幕在线 | 日韩在线免费 | 天啦噜最新官网入口 | 国产精品美女久久久 | 日韩国产一区二区三区四区五区 | 日韩精品a片一区二区三区妖精 | 超碰网站在线 | 上海毛片| 国产a一级 | 国模无码视频一区二区三区 | 久久成人免费网 | av一本在线| 久久大陆| 午夜激情成人 | 国产蜜臀av在线一区尤物 | 黄色高清无遮挡 | 久久久国产精品一区 | 37p粉嫩大胆色噜噜噜 | 中文在线中文资源 | 亚洲国产精品va在线 | 中日韩精品视频在线观看 | 免费黄色av网址 | 国产精品第 | 日本高清视频在线播放 | 一级一片免费看 | 国产精品福利视频推女郎 | 久久国产热精品波多野结衣av | 亚洲精品一区二区三天美 | 色就色综合 | 性高潮久久久久久久久 | 日本美女一区二区三区 | 少妇三级全黄 | 久久久亚洲国产天美传媒修理工 | 一区二区精品在线 | 久久久ww| 成人欧美视频在线观看 | 51区成人一码二码三码是什么 | av老司机在线播放 | 最新的黄色网址 | 青青视频在线播放 | 99精品视频在线观看免费 | 亚洲精品色综合av网站 | 欧美少妇一区二区 | 99在线精品免费视频九九视 | 性生交大片免费全片 | 国产精品成人av在线观看 | 天天爽夜夜爽人人爽 | 日韩av无码精品人妻系列 | avtt在线观看 | 好男人中文资源在线观看 | 国产人妖在线视频 | 老司机精品视频一区二区三区 | 少妇人妻偷人精品无码视频新浪 | 欧美成人午夜 | 97在线视频免费人妻 | 美女狠狠干 | 色网站观看 | 欧美亚洲综合另类 | 福利在线小视频 | 中文字幕久久网 | 人妖干美女 | 亚洲最新av在线 | 6080啪啪 | 男人天堂亚洲 | 国产成人a v | 日本大片黄 | 成人字幕| 这里只有精品9 | 国产一级特黄视频 | 国产明星xxxx精品hd | 亚洲精品亚洲人成人网 | 老司机一区二区 | 99国产精品欲 | 六月婷婷综合网 | 国产成人区 | 天天干天天操天天爱 | 国产小视频在线看 | 成年女人18级毛片毛片免费 | 九九久久精品国产免费看小说 | 国产成人久久久77777 | 香港台湾日本三级大全 | 丝袜+亚洲+另类+欧美+变态 | 在线视频一区二区三区四区 | 国产66精品久久久久999小说 | 亚洲午夜剧场 | 99精品国产99久久久久久97 | av无码人妻一区二区三区牛牛 | 免费的毛片视频 | 区一区二在线观看 | 亚洲中文无码a∨在线观看 在线不卡日本v二区到六区 | 99精品成人| 美女黄色片子 | 久久高清免费视频 | 国产日韩欧美中文另类 | 蜜桃臀无码内射一区二区三区 | 日韩在线欧美在线 | 亚洲色图欧洲色图 | 日韩porn| 91成人精品国产刺激国语对白 | 中文www新版资源在线 | 粗了大了 整进去好爽视频 色偷偷亚洲男人的天堂 | 波多野结衣50连登视频 | 一道本视频在线观看 | 国产精品一级无遮挡毛片 | 亚洲人亚洲人成电影网站色 | 97精品一区二区视频在线观看 | 成人视品 | 91视频播放 | 思思久久99 | 131mm极品尤物美女无胸罩 | 成人中文网 | 国产真实乱对白精彩久久小说 | 久久精品免费观看 | 国产精品www伦之荡艳岳 | 成人啪啪10000部 | 亚洲ww中文在线 | 国产视频每日更新 | 韩国午夜三级 | av解说在线 | 日韩精品久久一区 | 一级肉体全黄毛片 | 四虎在线观看视频 | 中文无码精品a∨在线观看不卡 | 色综合久久久无码中文字幕波多 | 影音先锋资源av | 国产日韩一级片 | 日本不卡高字幕在线2019 | 精品视频成人 | 久久精品片 | 精品女同一区二区三区 | 日韩久久免费视频 | 亚洲视频入口 | 精品国产亚洲一区二区三区 | 亚洲精品无码永久中文字幕 | 激情综合色综合啪啪开心 | 国产精品国产三级国产av主播 | 四季久久免费一区二区三区四区 | 久久久久欠精品国产毛片国产毛生 | 国产片av国语在线观看 | 欧美日韩综合一区二区三区 | 国产网红福利 | 色导航在线 | 伊人国产在线观看 | 国产最露的三级 | 亚洲欧洲精品一区二区三区不卡 | 婷婷色视频 | 日韩aⅴ片| 国产精品99久久久久久久女警 | 亚洲一二三区av | √天堂资源在线 | 亚洲乱亚洲乱妇50p 亚洲va中文字幕无码久久不卡 | 久久精品人妻一区二区蜜桃 | 国产精品久久久国产偷窥 | 91精品在线视频观看 | 亚洲成av人片一区二区 | 国内精品久久久久影院男同志 | 91精品国产91久久久久游泳池 | 成人看的毛片 | 手机看片1024国产 | 久久久精品欧美一区二区 | 国产精品久久久久久久久久久杏吧 | 老鲁夜夜老鲁 | 中文字幕亚洲高清 | 久久精国产| 国产又粗又猛又爽视频 | 国产成人免费av一区二区午夜 | 激情内射亚洲一区二区三区爱妻 | 91综合中文字幕乱偷在线 | 亚洲香蕉精品 | 制服丝袜另类专区制服 | a级黄色影院 | 久草超碰 | 国产真人无码作爱视频免费 | 欧美成人手机视频 | 日本久久久久亚洲中字幕 | 中国第一毛片 | 欧美三级理论 | 国产一级特黄aa大片出来精子 | 亚洲午夜视频在线观看 | 爱爱爱免费视频 | 成人国内精品久久久久影院成.人国产9 | 欧美成人免费在线观看视频 | 三级黄色毛片 | 69视频免费在线观看 | 免费成人91| 中文字幕婷婷 | 毛片视频软件 | 欧美高清hd | 男女啪啪无遮挡免费网站 | 亚洲自拍偷拍图 | 午夜av成人| 欧美女同网站 | 国自产拍偷拍精品 | 中文字幕av无码一区二区三区电影 | 噜啦噜色姑娘综合 | 亚洲精品久久久蜜臀av站长工具 | 草逼视频免费看 | 亚洲欧美一区二区三区 | 国产高清性xxxxxxxx | 久久99精品久久久久子伦 | 精品人妻伦一二三区久久 | 另类 欧美 日韩 国产 在线 | 久久曹 | 香蕉视频网址 | 黄色成人免费视频 | 欧美精品久久久久久久久免 | 中文字幕另类 | 成人中文网| 亚洲女同性ⅹxx关女同网站 | 亚洲免费网站观看视频 | 男女啪啪免费体验区 | 成人在线国产视频 | 奇米影视888狠狠狠 奇米影视第四狠狠777 | 久久精品国产亚洲沈樵 | 五月开心激情网 | 无套内谢孕妇毛片免费看看 | 久久久久久久免费 | 亚洲成人网络 | 日本伦理一区二区三区 | 日日躁夜夜摸月月添添添 | 天天视频入口 | 亚洲人成图片小说网站 | 欧美一区二区三区免费看 | 激情视频一区二区三区 | 欧美自拍另类欧美综合图片区 | 男女做aj视频免费的网站 | 在线成人黄色 | ass大乳尤物肉体pics | 果冻传媒mv免费播放在线观看 | 国产精品高跟丝袜一区 | 成熟女人毛片www免费版在线 | 农村黄性色生活片 | 欧美一区二区三区在线看 | 国产一区二区 | 亚洲精品免费在线 | 伊人情人色综合网站 | 亚洲日韩日本中文在线 | 91精品国产综合久久婷婷香 | 国产裸体丰满白嫩大尺度尤物可乐 | 娇小激情hdxxxx学生住处 | 波多野结衣电车痴汉 | 亚洲a∨国产av综合av网站 | www.人人草 | 永久免费看啪啪的网站 | 日本无翼乌全彩j奶无遮挡漫 | 国产精品久久久久久久久久久久久久久久久 | 日韩在线激情视频 | 亚洲乱亚洲乱妇小说网 | 久久国产精品网站 | 亚洲一区二区三区四区在线 | 天天躁夜夜躁狠狠综合 | 在线精品亚洲 | 与亲女洗澡时伦了毛片 | 丁香六月av | 国产主播第一页 | 久久99亚洲精品久久99果 | 中文字幕一区二区三区精品 | 风韵丰满熟妇啪啪区老老熟妇 | 91刺激视频| 久久有精品 | 国产三级理论片 | 中文字幕亚洲欧美 | 国产乱淫av片 | 亚洲欧美色图小说 | 国内精品国产成人国产三级粉色 | 女人大p毛片女人大p毛片 | 国产一级特黄毛片在线毛片 | 在线va视频 | 毛葺葺老太做受视频 | 国产精品无码一区二区三级 | 亚洲美女精品视频 | 亚洲国产日韩欧美一区二区三区 | 欧美日韩精品乱国产 | 26uuu亚洲国产精品 | 日韩不卡的av | 国产精品女教师av久久 | 久久中字| 亚洲精品沙发午睡系列 | 精品深夜av无码一区二区老年 | av免费网址 | 亚洲中久无码永久在线观看同 | 免费一级欧美片在线播放 | 天堂中文av | 中文字幕女同女同女同 | 欧美噜噜噜 | 污网站在线观看免费 | 破了亲妺妺的处免费视频国产 | 日韩精品视频一区二区三区 | 国产三级午夜理伦三级连载时间 | 久久综合久久综合九色 | 国产高清女同学巨大乳在线观看 | 深夜福利影院 | 精品xxx| 婷婷午夜天 | 国产成人精品午夜视频免费 | 欧美3p两根一起进高清免费视频 | 日本黄色生活片 | 天天插天天色 | 久操国产在线 | 国产精品69久久久 | 欧美色偷偷 | 免费成人深夜夜国外 | 久久午夜福利电影 | 日本h在线观看 | 久草免费新视频 |