java 前端页面传过来的值怎么防止篡改_反爬虫,到底是怎么回事儿?
有位被爬蟲摧殘的讀者留言問:「網站經常被外面的爬蟲程序騷擾怎么辦,有什么方法可以阻止爬蟲嗎??」
這是個好問題,自從 Python 火了起來,編寫爬蟲程序的門口越來越低,爬取別人網站數據也越來越猖獗。
阻止爬蟲也就是我們這次要說的「反爬蟲」,「反爬蟲」涉及到的技術比較綜合,說簡單也簡單,說復雜也復雜,看具體要做到哪種保護程度了。
下面我們說說常見的「反爬蟲」技術。
一、前置知識
1. 動態網頁和網頁源碼傳統的靜態網頁是指沒有數據庫和不可交互的純 HTML 網頁,它的頁面生成后,如果不修改代碼,網頁的顯示內容和顯示效果基本上不會發生變化。
傳統的動態網頁是指在不改變頁面 HTML 代碼的情況下,能夠根據不同用戶或者不同操作而顯示不同內容的網頁。動態網頁在開發、管理和交互性方面的優勢遠超靜態網頁。
在爬蟲領域中,靜態網頁與動態網頁的定義與傳統定義是完全不同的。
靜態網頁指的是網頁主體內容的渲染工作在服務器端完成,并通過響應正文返回的網頁。
動態網頁指的是主體內容或者全部內容都需要客戶端執行 JavaScript 代碼來計算或渲染的網頁。
網頁源碼,是指未經過瀏覽器解釋和 JavaScript 引擎渲染的文本,它的文本內容與 HTML 原文中的內容是相同的。
爬蟲并不是一種“所見即所得”的程序,它通過網絡請求的方式獲取資源。在得到的資源中,最
重要的就是響應正文。但是由于 Python、 Java 和 PHP等編程語言沒有 JavaScript 解釋器和渲染引擎,所以使用編程語言編寫的爬蟲程序無法渲染頁面,它們只能爬取響應正文中的內容,也就是網頁源代碼中的內容。
如果想要爬取動動態網頁中的數據,那么就需要借助 JavaScript 解釋器和渲染引擎將渲染后的網頁代碼以文本的形式傳給爬蟲。
有一些工具已經集成了渲染頁面所需的組件,并且開放 API 允許編程語言操作頁面以獲取渲染后的頁面代碼。爬蟲工程師常用的渲染工具如下。
Splash:異步的 JavaScript 渲染服務。
Selenium:自動化測試框架。
Puppeteer:一個通過 DevTools 協議控制 Chrome 的 Node js庫。
2. 爬蟲
爬蟲指的是按照一定規則自動抓取網絡信息的程序,分為通用爬蟲和聚焦爬蟲兩大類,前者的
目標是在保持一定內容質量的情況下爬取盡可能多的站點;而后者的目標則是在爬取少量站點的情況下盡可能保持精準的內容質量。
爬蟲通常從一個或多個 URL 開始,在爬取的過程中不斷將新的并且符合要求的 URL 放人待爬隊列,直到滿足程序的停止條件。
爬蟲的的爬取過程可以分為下面3個步驟。
(1)請求指定的 URL 以獲取響應正文。
(2)解析響應正文內容并從中提取所需信息。
(3)將上一步提取的信息保存到數據庫或文件中。
二、反爬蟲
爬蟲程序的訪問速率和目的與正常用戶的訪間速率和目的是不同的,大部分爬蟲會無節制地對目標應應用進行爬取,這給目標應用的服務器帶來巨大的壓力。爬蟲程序發出的網絡請求被運營者稱為“垃圾流量”。
開發者為了保證服務器的正常運轉或降低服務器的壓力與運營成本,不得不使出各種各樣的技術
手段來限制爬蟲對服務器資源的訪問。因為爬蟲和反爬蟲是綜合技術的應用,反爬蟲的現象與爬蟲工程師所用的工具和開發語言有關,甚至與爬蟲工程師的個人能力也有一定關聯,所以反爬蟲的概念非常模糊,業內并沒有明確的定義。
本文所說,限制爬蟲程序訪問服務器資源和獲取數據的行為稱為反爬蟲。限制手段包括但不限于
請求限制、拒絕響應、客戶端身份驗證、文本混淆和使用動態渲染技術。這些限制根據出發點可以分為主動型反爬蟲和被動型反爬蟲。
主動型反爬蟲:開發者有意識地使用技術手段區分正常用戶和爬蟲,并限制爬蟲對網站的訪問行為,如驗證請求頭信息、限制訪問頻率、使用驗證碼等。
被動型反爬蟲:為了提升用戶體驗或節省資源,用一些技術間接提高爬蟲訪問難度的行為,比如數據分段加載、點擊切換標簽頁、鼠標懸停預覽數據等。
除此之外,還可以從特點上對反爬蟲進行更細致的劃分,如信息校驗型反爬蟲、動態渲染型反爬蟲、文本混淆型反爬蟲、特征識別型反爬蟲等。
需要注意的是,同一種限制現象可以被歸類到不同的反爬蟲類型中,比如通過 JavaScript 生成隨機字符串并將字符串放在請求頭中發送給服務器,由服務器校驗客戶端身份的這種限制手段既可以說是信息校驗型反爬蟲,又可以說是動態渲染反爬蟲。
反爬蟲不僅要了解網站流量情況,還需要了解爬蟲工程師常用的手段,并從多個方面進行針對性的防護。
反爬蟲的方案設計、實施和測試等都需要耗費大量的時間,而且往往需要多個部門配合才能完成。從這個角度來看,除了技術難度外,時間成本也是非常高的。
三、信息校驗型爬蟲
信息校驗中的“信息”指的是客戶端發起網絡請求時的請求頭和請求正文,而“校驗”指的是服務器端通過對信息的正確性、完整性或唯一性進行驗證或判斷,從而區分正常用戶和爬蟲程序的行為。1. User-Agent 反爬蟲
User-Agent 是請求頭域之一,服務器從 User-Agent 對應的值中識別客戶端的使用信息。User-Agent 的角色就是客戶端的身份標識。服務器可以使用黑名單結合條件判斷實現針對性較強的反爬蟲。
除了 User-Agent 之外,可利用的頭域還有 Host 和 Referer。這種驗證請求頭信息中特定頭域 的方式既可以有效地屏蔽長期無人維護的爬蟲程序,也可以將一些爬蟲初學者發起的網絡請求拒之門 外,但是對于一些經驗豐富的爬蟲工程師,或許還需要更巧妙的反爬蟲手段。
2. Cookie 反爬蟲
Cookie 反爬蟲指的是服務器端通過校驗請求頭中的 Cookie 值來區分正常用戶和爬蟲程序的手段,也可以把 Cookie 和 JavaScript 結合起來實現反爬蟲,提高爬蟲難度,這種手段被廣泛應用在 Web 應用中。
例如,在 HTML 代碼中引入一個可以將瀏覽器重定向到目標頁面的 JavaScript 文件,并且在這個文件中實現隨機字符串生成和 Cookie 設置的功能,那么服務器端只需要校驗 Cookie 值的規則即可。避免了通過將 Cookie 值從瀏覽器的請求頭中復制,就可以一直使用這個簡單的方法。
User-Agent 和 Cookie 都是請求頭的默認頭域,在值的設定方面有一定的局限性,但是與JavaScript 結合后,就會變得很靈活。
相對服務器軟件來說,后端程序的校驗更為靈活且準確,但使用后端程序進行校驗所需的步驟較多,在實際應用時可以根據需求選擇合適的校驗方式。
3.?簽名驗證反爬蟲
簽名是根據數據源進行計算或加密的過程,簽名的結果是一個具有唯一性和一致性的字符串。簽名結果的特性使得它成為驗證數據來源和數據完整性的條件,可以有效避免服務器端將偽造的數據或被篡改的數據當成正常數據處理。
簽名驗證是防止惡意連接和數據被篡改的有效方式之一,也是目前后端 API 最常用的防護方式之 一。與 Cookie、User-Agent 請求頭域不同,用于簽名驗證的信息通常被放在請求正文中發送到服務器端。
簽名驗證反爬蟲利用 JavaScript 生成隨機值,與之前的隨機值不同,這次的隨機值中包含時間戳和 MD5 加密值。簽名驗證有很多種實現方式,但原理都是相同的:由客戶端生成一些隨機值和不可逆的 MD5 加密字符串,并在發起請求時將這些值發送給服務器端。服務器端使用相同的方式對隨機值進行 計算以及 MD5 加密,如果服務器端得到的 MD5 值與前端提交的 MD5 值相等,就代表是正常請求, 否則返回 403。
4. WebSocket 握手驗證反爬蟲
WebSocket 握手時使用的協議是 HTTP 協議,所有基于 HTTP 協議的反爬蟲都可以用在 WebSocket 協議上。
客戶端按照 WebSocket 規范生成握手信息并向服務器端發送握手請求,然后讀取服務器端推送的消息,最后驗證握手結果。WebSocket 協議規范只作為參考,服務器端和客戶端實際上可以不遵守這些約定。
比如服務器端可以在校驗握手信息時增加對客戶端 User-Agent 或 Referer 的驗證,如果客戶端發送的握手請求中并沒有對應的信息,則拒絕連接。想要實現這個功能,只需要 在服務器端的代碼中增加相關的信息驗證代碼即可。
5. WebSocket 消息校驗反爬蟲
如果握手驗證成功,雙端就可以開始互推消息了。WebSocket 只需要完成 1 次握手,就可以保持長期連接,在后續的消息互發階段是不需要用到 HTTP 協議的,那么如何在 WebSocket 通信過程中實現反 爬蟲呢?
其實消息互發階段也是可以對客戶端身份進行校驗的,這是因為客戶端所獲取的消息是由服務器端主動推送的,如果服務器端不主動推送,那么客戶端就無法獲取消息。我們可以在服務器端新增一個校驗邏輯:握手結束后客戶端發送特定的消息,服務器端對該消息進行校驗,校驗通過則將服務器端的數據推送給客戶端,否則不作處理。
6. WebSocket Ping 反爬蟲
WebSocket 是可以保持長期連接的。但是服務器端不可能保持所 有客戶端永久連接,這太耗費資源了,有沒有一種辦法可以檢查客戶端的狀態呢?
WebSocket 協議規范中約定,服務器端可以向客戶端發送 Ping 幀,當客戶端收到 Ping 幀時應當回復 Pong 幀。如果客戶端不回復或者回復的并不是 Pong 幀,那么服務器端就可以認為客戶端異常,主動關閉該連接。?
通常,Ping 幀和 Pong 幀的 Payload Data 中是沒有內容的,所以只要目標服務器發送 Ping 幀時,客戶端回復沒有任何內容的 Pong 幀即可。
WebSocket 協議中的規范并不強制遵守,所以開發者可以自定義 Ping 幀和 Pong 幀,這就為反爬蟲提供了條件。
假如開發者在編寫服務器端代碼時,將 Ping 幀定義為有一定內容的數據幀,同時對 Pong 幀的 Payload Data 進行校驗,就可以將不符合規則的連接關閉。
四、動態渲染反爬蟲
由 JavaScript 改變 HTML DOM 導致頁面內容發生變化的現象稱為動態渲染。很多時候開發者只是想完成某個交互功能,而不是特意區分正常用戶和爬蟲程序,但這在不經意間限制了爬蟲對數據的獲取。由于編程語言沒有像瀏覽器一樣內置JavaScript解釋器和渲染引擎,所以動態渲染是天然的反爬蟲手段。1. 自動執行的異步請求
異步請求能夠減少網絡請求的等待時間,從而提升網頁加載速度。為了追求用戶體驗、提升網站加載速度和減少用戶等待時間,開發者會將內容較多的綜合信息頁面拆分成多個部分,然后使用異步請求的方式獲取資源。
2. 點擊事件和計算
點擊事件指的是用戶在瀏覽網頁的過程中使用鼠標點擊按鈕或標簽等頁面元素的操作,這類事件通常會與一個 JavaScript 方法綁定到一起,當事件觸發時瀏覽器就會執行事件綁定的方法。
這里提到的計算是指使用 JavaScript 計算數值并將結果渲染到網頁。開發者使用 JavaScript 計算數據有可能是為了反爬蟲,也有可能是為了提高用戶體驗,因為客戶端本地的計算速度遠遠超過網絡請求的速度。
3. 下拉加載和異步請求
網頁中下拉加載實際上是一種翻頁操作,當我們點擊下一頁或指定頁碼按鈕的時候,瀏覽器會跳轉到對應頁碼,這個跳轉造成了頁面的刷新,也就是向其他頁面發起請求。
而下拉加載通過異步請求和局部渲染避免刷新整個頁面,局部渲染既避免了重復請求資源,又減少了用戶等待的時間,這對于網站來說是一件很有意義的事。
文本混淆反爬蟲
文本混淆可以有效地避免爬蟲獲取 Web 應用中重要的文字數據,使用文本混淆限制爬蟲獲取文字數據的方法稱為文本混淆反爬蟲。
反爬蟲的前提是不能影響用戶正常瀏覽網頁和閱讀文字內容,直接混淆文本很容易被看出來,所以開發者通常是利用 CSS 的特性來實現混淆。
1. 圖片偽裝反爬蟲
圖片偽裝指的是將帶有文字的圖片與正常文字混合在一起,以達到“魚目混珠”的效果。這種混淆方式并不會影響用戶閱讀,但是可以讓爬蟲程序無法獲得“所見”的文字內容。
2. CSS偏移反爬蟲
CSS 偏移反爬蟲指的是利用 CSS 樣式將亂序的文字排版為人類正常閱讀順序的行為。
例如:
HTML 文本中的文字:我的學號是 1308205,我在北京大學讀書。
瀏覽器顯示的文字:我的學號是 1380205,我在北京大學讀書。
爬蟲提取到的學號是 1308205,但用戶在瀏覽器中看到的卻是 1380205。
如果不細心觀察,爬蟲工程師很容易被爬取結果糊弄。這種混淆方法和圖片偽裝一樣,是不會影響用戶閱讀的。
3. SVG映射反爬蟲
SVG 是用于描述二維矢量圖形的一種圖形格式。它基于 XML 描述圖形,對圖形進行放大或縮小操作都不會影響圖形質量。矢量圖形的這個特點使得它被廣泛應用在 Web 網站中。
這種反爬蟲手段用矢量圖形代替具體的文字,不會影響用戶正常閱讀,但爬蟲程序卻無法像讀取文字那樣獲得 SVG 圖形中的內容。
由于 SVG 中的圖形代表的也是一個個文字,所以在使用時必須在后端或前端將真實的文字與對應的 SVG 圖形進行映射和替換,這種反爬蟲手段被稱為 SVG 映射反爬蟲。
4. 字體反爬蟲
在 CSS3 之前,Web 開發者必須使用用戶計算機上已有的字體。但是在 CSS3 時代,開發者可以使用 @font-face 為網頁指定字體,對用戶計算機字體的依賴。
開發者可將心儀的字體文件放在 Web 服務器上,并在 CSS 樣式中使用它。用戶使用瀏覽器訪問 Web 應用時,對應的字體會被瀏覽器下載到用戶的計算機上。
我們知道 CSS 的作用是修飾 HTML ,所以在頁面渲染的時候不會改變 HTML 文檔內容。
由于字體的加載和映射工作是由 CSS 完成的,所以即使我們借助 Splash、Selenium 和 Puppeteer 工具也無法獲得對應的文字內容。
字體反爬蟲正是利用了這個特點,將自定義字體應用到網頁中重要的數據上,使得爬蟲程序無法獲得正確的數據。
結尾
雖然反爬蟲措施有很多,但每一種都不是絕對安全的,爬蟲高手依舊可以繞過反爬蟲機制。在此之前也要做好一些基礎的規則,比如說 robots 協議或者用戶協議等。如果你的網站被多進行高并發的程序被惡意爬蟲時,這已經不是單純的爬蟲行為了,屬于惡意破壞網絡安全,必須要第一時間收集證據,用法律手段對抗那些非法的爬蟲行為。圈內常說「爬蟲玩的好,牢飯吃得早」,善意地提醒 Python 玩得特別六的同學,不要隨便爬取別人的隱私數據和有版權的內容,爬蟲不是法外之地,技術也不是純粹的無罪。
如果想了解更多「反爬蟲」內容,關注我們,后期將繼續更新具體案例。
21 個反爬蟲經典示例
從實戰出發
印證國內互聯網企業內部加密原理側重講解反爬蟲的原理以及繞過方法爬蟲工程師不可錯過的「武功秘籍」,內容包括但不限于 Cookie 反爬蟲、WebSocket 反爬蟲、字體反爬蟲、WebDriver 反爬蟲、App 反爬蟲、驗證碼反爬蟲。本書首先介紹了開發環境的配置,接著討論了 Web 網站的構成和頁面渲染、動態網頁和靜態網頁對爬蟲造成的影響,緊接著詳細介紹了信息校驗型反爬蟲、動態渲染反爬蟲、文本混淆反爬蟲知識、特征識別反爬蟲的原理、實現和繞過,然后概覽了 App 數據爬取的關鍵和常用的反爬蟲手段,最后介紹了常見的編碼和加密原理、JavaScript 代碼混淆知識、前端禁止事件以及與爬蟲相關的法律知識和風險點。圖靈官方小店享受正版低價折扣總結
以上是生活随笔為你收集整理的java 前端页面传过来的值怎么防止篡改_反爬虫,到底是怎么回事儿?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 喝花酒是什么意思(人们常说的“喝花酒”是
- 下一篇: c++ map初始化同时赋值_Golan