前言
這陣子寫了一支 WordPress 外掛,名叫 WP Shieldon。它是基於我寫的 PHP 功能庫 Shieldon,如果你是使用 WordPress 架設網站,恭喜你,可以立即在 WordPress 官方外掛目錄中下載,搜尋 Shieldon 就可以找到。
安裝需求
- PHP 版本 > 7.1.0
- WordPress 版本 > 4.0
下載
來源 | 下載 |
---|---|
WordPress | https://wordpress.org/plugins/wp-shieldon |
GitHub | https://github.com/terrylinooo/wp-shieldon/releases |
PHP Composer | composer create-project terrylinooo/wp-shieldon wp-shieldon |
介紹
類似應用
它的任務是防砍站。比較低階 Server 端的應用模組有 Apache 的 mod_evasive 及 Nginx 內建的 ngx_http_limit_req_module,標榜防止 DOS,但它們都是生硬的限制在一定期限內達到限制就吐錯誤頁面給前端,在實務上會很困擾正常使用者。現在很多使用者會共用區網,使用同一個 IP,因此容易被封鎖。
我不用以上模組的原因在於,它會對 SEO 成效造成衝擊,因為該模組無從判斷訪客是 Google、Bing 的爬蟲,或真正帶有惡意的訪問。搜尋引擎的爬蟲常遇到被封鎖的情況,會下調對網站的評比,自然而然就是關鍵字排名往後退。
Shieldon 的防護
Shieldon 在應用程式層去判斷使用者行為,因此可以根據多種過濾方式去避免封鎖了正常用戶,而且即使封鎖了,也不打緊,使用者可以很容易地透過驗證碼 (CAPTCHA) 自行解決封鎖。
使用 WP Shieldon 的效益
WP Shieldon 在載入外掛的順序是第一位,它在封鎖了惡意的訪問後,就跳出驗證碼的頁面,中斷後續的外掛及版型載入,節省惡意訪問造成多餘流量傳輸及後續處理其它外掛功能及 WordPress 讀取文章、列表或搜尋等等行為的 CPU 開銷。
對於使用流量計費的雲端服務例如 Google GCE、Amazon EC2 等等,流量都是成本。CPU 也不會因為被惡意刷新某些 SQL 較吃重的頁面而往上飆。
運作原理
以下的驗證方式在 WP Shieldon 的設定介紹都可以找到設定,讓你自由選擇要開始那些驗證方式。
過濾器 (Filters)
你必須啟用個別的過濾器才會進行該項的檢查。每個過濾條件可以設定可容忍的額度,預設值為 5,已經可以排除掉絕多數誤判的情況。
Cookie
WP Shieldon 會產生一組會產生 cookie 的 JavaScript 程式碼插入前端頁面,藉此過濾無法執行 JavaScript 的爬蟲。但這個方法無法過濾 browser-based 的爬蟲,例如使用 Selenium 的爬蟲。
有些正常使用者沒開啟 cookie 功能你也不需要理會了,他既沒辦法登入你的網站進行購物,放在你網站上的廣告也因為沒有 cookie 可以進行喜好追蹤,收益成效不彰。
Referrer
判斷 Header 資訊沒有顯示上一頁網址的記錄。一般而言只有直接從瀏覽器網址列直接輸入網址的初次拜訪為空值,其餘都會有記錄,藉此篩選掉一些爬蟲。
組件 (Components)
Trusted Bots
這個組件為信賴的機器人,為開放一些受歡迎的搜尋引擎們例如 Google、Bing、Yahoo 等等。為必須開啟的組件。不然這些搜尋引擎的爬蟲機器人們會進入瀏覽頻率檢查。檢索網頁的頻率達到限制會被封鎖...。
啟用嚴格模式的話,會再比對一次 RDNS 和 IP 是否吻合。不吻合的情況很常見,例如百度的機器人 IP 有 RDNS,但 ping 那個 RDNS 卻沒有 IP 記錄。不過只是舉個例子。本外掛沒有把把百度放進清單中。
Header
啟用這個組件,並選擇嚴格模式,則會比對訪客有沒有一般瀏覽器訪客必帶的 Header 資訊,沒有就封鎖。
User-agent
Header 資訊沒帶來 User-agent 肯定是爬蟲初學者,直接擋了說。
Reverse DNS
Reverse DNS (RDNS) 中文為反向域名解析,也稱為 IP 反解 (IP Resolved),正常的電信用戶都會有一個 RDNS 對應一個 IP,例如中華電信的用戶的 IP: 61.216.101.55
大部分的搜尋引擎的爬蟲的 IP 也可以接析出 RDNS。無法解析出的情況,大部分就是不是正常用戶了,而是網路上的伺服器。
基本檢查 (Basic Check)
頻率檢查
一般來說,一個用戶在一個網站上一天瀏覽 10 幾頁就算黏著很高了。在 Sheldon 套件有以下頻率設定。
分別為每秒,每分鐘、每小時、每天可以容許幾次瀏覽,一旦觸及這個數字,會暫時封鎖使用者進入驗證頁面,一旦使用者順利解決了驗證,用戶的瀏覽資料會重設。
如果你只想針對每分鐘作檢查,可以將其它數字設為 9999 達不到的數字,則只有每分鐘的頻率有機會被觸發限制。
排除網頁
如果你有一些特定網頁不想被 WP Shieldon 限制,你也可以在設定裡排除。
- 符合字串開頭的網址會被排除。
WP Shieldon 預設保護登入頁、註冊頁及 XML RPC 防止暴力攻擊。如果你不想保護其中一項,可以在這裡設定。
IP 管理員
分為全站、登入頁、註冊頁、XML RPC。
應用情境 - 全站不公開
全站設定自己或公司的固定 IP,並開啟 Deny All,則只有該 IP 可以順利瀏覽。適合一些科技公司的技術部門寫自己的技術文件,但只有自己公司的 IP 或 VPN 的 IP 可瀏覽。
登入頁保護
假設你沒有固定 IP,但也想用 IP 管理員保護你的登入頁面,你可以設定 passcode。
以這個例子,我設為 test
。
我的這個網址則會避開 IP 封鎖而可以進行登入。不過這個網址是只能你知道,務必記住並不要外流。
https://terryl.in/zh/wp-login.php?test
線上工作階段控制
工作階段 (Session) 是 Google Analytics 的翻譯,在這裡的工作階段和 Google Analytics 是一樣的意思,這樣大家會比較明白這個功能實際上就是限制幾個訪客能在線上瀏覽你的網站。
你可以設定在線上有幾個訪客可以瀏覽,例如 100
,每個用戶能個瀏覽多久。例如 5
分鐘。在後台的 IP Session Table (工作階段表) 可以看即時報表。
報表
工作階段表
這個報表可以即時地觀察線上的狀況。前題是有打開線上工作階段控制
這個功能。
規則表
被過濾器及基本檢查篩選出異常的會被暫時封鎖,狀態是 CAPTCHA,意思是該 IP 正在驗證頁,該 IP 訪客或機器人要解除驗證才能繼續瀏覽。如果解決了驗證,該 IP 會被移除規則表。
預設被組件封鎖的是硬封鎖,不會有給放行的機會,所以並不會進入規格表,因為他們在組件檢查時就封鎖了,還沒到過濾器檢查。但你可以在這裡看到被 Trusted Bots 放行的搜尋引擎被列在這裡。
另外規格表有臨時封鎖個別 IP 的功能。為何說它是暫時的?因為如果你有開始重設資料週期,每天會固定重設這個表。如果你想要永遠封鎖 IP,請用 IP 管理員。
IP 日誌表
記錄本次資料週期的訪客資料。
儀表板
儀表板的日誌記錄是永遠的,不受資料週期影響。從外掛啟用之後每次訪客被 WP Shieldon 進行處理的所有資料都會記錄。
ps. 停用外掛及會清空所有資料。因為日誌檔這種東西不大重要。既然停用了或移除了,就清除囉。