iframe 的同源限制與反爬機制的沖突

一、事件背景

A域名接入了動態防護(Bot 防護、反爬蟲機制),同時第三方業務B域名通過內嵌iframe的方式調用了A域名下的一個鏈接。

二、動態防護介紹:

動態防護(也稱為 Bot 防護、反爬蟲機制)是網站為了防止自動化程序(如爬蟲、惡意腳本)大規模訪問而采取的一種安全措施。通過先返回一段 JS 代碼到客戶端執行,然后生成 Cookie就是其中一種非常典型的 客戶端驗證機制


🔍 原理詳解:為什么需要執行 JS 來生成 Cookie?

🧠 核心思想:

服務器通過檢測客戶端是否具備完整的瀏覽器環境來判斷是否為真人或自動化工具(如爬蟲、Selenium 等)。如果直接請求頁面,沒有執行 JS,就說明不是真正的瀏覽器行為,可能是機器。


? 典型流程如下:

  1. 首次請求

    • 客戶端(比如瀏覽器或爬蟲)向服務器發送 HTTP 請求。
    • 服務器識別到這不是一個具有完整 JavaScript 執行能力的瀏覽器(比如沒有 session 或者 cookie),于是不返回真實內容。
  2. 返回一段 JS 代碼

    • 服務器返回一個 HTML 頁面,里面包含一小段 JavaScript 腳本,這段腳本通常會:
      • 計算一些隨機值
      • 設置?document.cookie
      • 或者重定向到某個帶 token 的 URL
  3. JS 在瀏覽器中執行

    • 瀏覽器執行這段 JS,生成特定的 Cookie(例如?_cf_bm,?__cfduid,?challenge?類似的 cookie)
    • 然后自動發起一個新的請求(可能通過?location.href?或?form.submit()
  4. 第二次請求

    • 新請求帶上剛才生成的 Cookie,服務器驗證這個 Cookie 是否合法。
    • 如果合法,則放行,返回正常網頁內容;否則繼續攔截。

🧪 示例:Cloudflare 的挑戰機制

以 Cloudflare 的典型 bot 防護為例:

  • 當你第一次訪問被保護的網站時,它會返回如下內容:
<html>
<head><title>請等待...</title></head>
<body><script>// 這里是一段混淆過的 JS 代碼var s,t,o,p,b,r,e,a,f,i,n, c = document;// ... 一系列復雜計算 ...document.cookie = "cf_clearance=xxx; path=/; expires=...; Secure";location.reload(); // 刷新頁面</script>
</body>
</html>
  • 這個 JS 會設置一個叫?cf_clearance?的 Cookie,它是基于時間戳、隨機數和哈希算法生成的。
  • 下次請求帶上這個 Cookie,服務器驗證通過后才允許訪問真實內容。

?? 對爬蟲的影響

這種機制對傳統爬蟲(如 requests、urllib)來說是一個重大障礙,因為它們無法執行 JavaScript,也就無法生成所需的 Cookie。

解決方案包括:

方法描述優缺點
使用 Selenium / Playwright模擬真實瀏覽器可繞過大多數 JS 驗證,但資源消耗大
使用 PuppeteerNode.js 控制 Chrome功能強大,但速度慢
逆向工程 JS 邏輯手動提取 JS 生成 Cookie 的邏輯,用 Python 實現效率高,但開發成本高且容易失效
使用第三方服務如 Anti-Captcha、2Captcha、ScraperAPI 等成本較高,但省事

🛡? 舉個小例子(簡化版原理)

假設服務器下發以下 JS:

let t = Date.now();
let hash = btoa(t + Math.random());
document.cookie = `my_challenge=${hash}; path=/`;
location.href = '/real-content';

這段 JS 的作用是:

  • 獲取當前時間戳
  • 生成一個 base64 編碼的 hash
  • 設置成 Cookie
  • 自動跳轉到真實頁面

服務器收到 /real-content 請求時,檢查是否有這個 Cookie,并驗證其格式、時效等,如果沒問題就放行。


? 總結:為什么要執行 JS 來生成 Cookie?

目的說明
區分瀏覽器和爬蟲瀏覽器能執行 JS,爬蟲不能(除非模擬)
防止濫用減少機器人刷接口、刷票、DDoS 攻擊等行為
增加爬取成本增加攻擊者的逆向難度和維護成本
提升安全性可結合瀏覽器指紋、TLS 指紋等多維度識別

三、業務適配問題

如果 <iframe> 加載的是不同源的內容,瀏覽器會實施 同源策略,阻止以下行為:

  • 父頁面訪問?<iframe>?的 DOM 或執行其中的 JavaScript。
  • <iframe>?訪問或修改父頁面的內容。

這就導致第三方域名下內嵌的iframe 無法加載動態防護的JS完成檢驗。

四、解決方案

調整動態防護策略

對來自特定來源的請求放寬限制,如加白調用的IP(IP是固定的)、加白被第三方域名調用的url、放行調用請求的某個特征(如UA、refer 等)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/88243.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/88243.shtml
英文地址,請注明出處:http://en.pswp.cn/web/88243.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Rust 的 Copy 語義:深入淺出指南

在 Rust 中&#xff0c;Copy 是一個關鍵的特性&#xff0c;它定義了類型的復制行為。理解 Copy 語義對于掌握 Rust 的所有權系統和編寫高效代碼至關重要。一、核心概念&#xff1a;Copy vs Move特性Copy 類型非 Copy 類型 (Move)賦值行為按位復制 (bitwise copy)所有權轉移 (ow…

Qt的信號與槽(二)

Qt的信號與槽&#xff08;二&#xff09;1.自定義槽2.通過圖形化界面來生成自定義槽3.自定義信號3.信號和槽帶參數4.參數數量5.connect函數的設計&#x1f31f;hello&#xff0c;各位讀者大大們你們好呀&#x1f31f;&#x1f31f; &#x1f680;&#x1f680;系列專欄&#xf…

Java研學-MongoDB(三)

三 文檔相關 7 文檔統計查詢① 語法&#xff1a; // 精確統計文檔數 慢 準 dahuang> db.xiaohuang.countDocuments({條件}) 4 // 粗略統計文檔數 快 大致準 dahuang> db.xiaohuang.estimatedDocumentCount({條件}) 4② 例子&#xff1a; // 精確統計文檔數 name為奔波兒灞…

TCP協議格式與連接釋放

TCP報文段格式 TCP雖然是面向字節流的&#xff0c;但TCP傳送帶數據單元確是報文段。TCP報文段分為首部和數據段部分&#xff0c;而TCP的全部功能體現在它在首部中各字段的作用。因此&#xff0c;只有弄清TCP首部各字段的作用才能掌握TCP的工作原理。 TCP報文段首部的前20字節是…

CSS05:結構偽類選擇器和屬性選擇器

結構偽類選擇器 /*ul的第一個子元素*/ ul li:first-child{background: #0af6f6; }/*ul的最后一個子元素*/ ul li:last-child{background: #d27bf3; } /*選中p1&#xff1a;定位到父元素&#xff0c;選擇當前的第一個元素 選擇當前p元素的父級元素&#xff0c;選中父級元素的第…

使用策略模式 + 自動注冊機制來構建旅游點評系統的搜索模塊

? 目標&#xff1a; 搜索模塊支持不同內容類型&#xff08;攻略、達人、游記等&#xff09;每種搜索邏輯用一個策略類表示自動注冊&#xff08;基于注解 Spring 容器&#xff09;新增搜索類型時&#xff0c;只需添加一個類 一個注解&#xff0c;無需改工廠、注冊表等&#x…

第八十九篇 大數據開發中的數據算法:貪心策略 - 生活中的“精打細算”藝術

在資源有限的世界里&#xff0c;貪心算法教會我們&#xff1a;局部最優的累積&#xff0c;往往是通往全局最高效的捷徑。本文通過3個生活化場景原創圖表&#xff0c;揭示大數據開發中最實用的優化策略。目錄一、貪心算法核心思想&#xff1a;當下即最優二、三大核心應用場景詳解…

【論文閱讀】Dynamic Few-Shot Visual Learning without Forgetting

系統概述如下: (a) 一個基于卷積神經網絡(ConvNet)的識別模型,該模型包含特征提取器和分類器; (b) 一個少樣本分類權重生成器。這兩個組件都是在一組基礎類別上訓練的,我們為這些類別準備了大量訓練數據。在測試階段,權重生成器會接收少量新類別的訓練數據以及基礎類別的…

HTML應用指南:利用GET請求獲取全國山姆門店位置信息

山姆會員店作為全球知名的零售品牌&#xff0c;自進入中國市場以來&#xff0c;始終致力于為消費者提供高品質商品與便捷的購物體驗。隨著新零售業態的快速發展&#xff0c;門店位置信息的獲取變得愈發重要。品牌通過不斷拓展門店網絡&#xff0c;目前已覆蓋多個一、二線城市&a…

java ThreadLocal源碼分析

寫個demo測試下&#xff1a;private static void testThreadLocal() {ThreadLocal<Integer> threadLocal new ThreadLocal<>();new Thread(){Overridepublic void run() {threadLocal.set(9527);System.out.println("curr thread: " Thread.currentThr…

后端Web實戰(項目管理)

Restful風格 我們的案例是基于當前最為主流的前后端分離模式進行開發 在前后端分離的開發模式中&#xff0c;前后端開發人員都需要根據提前定義好的接口文檔&#xff0c;來進行前后端功能的開發。 后端開發人員&#xff1a;必須嚴格遵守提供的接口文檔進行后端功能開發&#…

Leetcode 3604. Minimum Time to Reach Destination in Directed Graph

Leetcode 3604. Minimum Time to Reach Destination in Directed Graph 1. 解題思路2. 代碼實現 題目鏈接&#xff1a;3604. Minimum Time to Reach Destination in Directed Graph 1. 解題思路 這一題思路上就是一個廣度優先遍歷&#xff0c;我們不斷考察當前時間點以及位置…

OpenXR Runtime切換工具-OpenXR-Runtime-Switcher

在開發VR時&#xff0c;有時有多個設備&#xff0c;大家可能也會選擇不同的串流工具&#xff0c;OpenXR類似于默認瀏覽器&#xff0c;如果設置錯誤可能導致游戲無法串流。 推薦一個工具&#xff0c;可以設置默認的OpenXR工具。 OpenXR-Runtime-Switcher 對于沒有的設備&#…

Opencv探索之旅:從像素變化到世界輪廓的奧秘

在你已經能熟練地為圖像施展“降噪”、“縮放”等魔法之后&#xff0c;你的探索之旅來到了一個全新的領域。你可能會好奇&#xff1a;我們人類能輕易地識別出照片中杯子的邊緣、建筑的輪廓&#xff0c;那計算機是如何“看見”這些邊界的呢&#xff1f;僅僅依靠濾波和顏色變換&a…

Ubuntu 22.04 + MySQL 8 無密碼登錄問題與 root 密碼重置指南

背景場景 在 Ubuntu 系統中使用 apt 或 deb 包方式安裝 MySQL 8 時&#xff1a; 初次安裝后會自動初始化數據庫&#xff1b;但 沒有提示 root 初始密碼&#xff1b;導致 mysql -u root -p 無法登錄。 為了解決該問題&#xff0c;通常我們使用 --skip-grant-tables 方式跳過權限…

題解:P13017 [GESP202506 七級] 線圖

首先明白定義&#xff1a; 線圖 L(G)L(G)L(G) 的頂點對應原圖 GGG 的邊&#xff0c;當且僅當原圖中的兩條邊有公共頂點時&#xff0c;對應的線圖頂點之間有一條邊。 不難想到&#xff0c;對于原圖中的每個頂點 vvv&#xff0c;其度數 d(v)d(v)d(v) 對應的邊集可以形成 (d(v)2)\…

c++ duiLib環境集成2

繼續上一篇&#xff0c;現在需要把控制臺隱藏&#xff0c;只顯示調用duiLib框架顯示的窗口。右鍵項目 → 屬性 → 鏈接器 → 系統 → ?子系統?改為 窗口(/SUBSYSTEM:WINDOWS)。原來是這樣&#xff1a;修改為&#xff1a;運行報錯&#xff1a;需要修改入口函數為WinMain。如下…

常見的網絡攻擊方式及防御措施

常見的網絡攻擊方式及防御措施&#xff1a;全面解析網絡安全威脅 前言肝文不易&#xff0c;點個免費的贊和關注&#xff0c;有錯誤的地方請指出&#xff0c;看個人主頁有驚喜。 作者&#xff1a;神的孩子都在歌唱在信息化高速發展的今天&#xff0c;網絡安全威脅無處不在&#…

JavaScript 中導入模塊時,確實不需要顯式地寫 node_modules 路徑。

1. 正確的導入語法在 Webpack、Vite 等打包工具中&#xff0c;node_modules 目錄是默認的模塊搜索路徑&#xff0c;因此直接寫包名即可&#xff1a;// ? 正確&#xff1a;直接使用包名import nprogress/nprogress.css;// ? 錯誤&#xff1a;不需要顯式寫 node_modules 路徑im…

ELK Stack技術棧

文章目錄一、日志收集所解決的問題二、Elastic Stack 組件介紹2.1 Elasticsearch2.2 Logstash2.3 Kibana2.4 Filebeat beats三、ELK Stack集群安裝3.1 安裝JAVA環境&#xff08;所有ES節點&#xff09;3.2 安裝ES集群3.2.1 ES單節點部署3.2.2 ES JAVA調優&#xff1a;堆(heap)內…