通過user-agent來源判斷阻止爬蟲訪問網站,并防止生成[ error ] NULL日志

一、TP5.0通過行為(Behavior)攔截爬蟲并避免生成 [ error ] NULL 錯誤日志

1. 創建行為類(攔截爬蟲)

在 application/common/behavior 目錄下新建BlockBot.php ,用于識別并攔截爬蟲請求:

<?php
namespace app\common\behavior;use think\Response;class BlockBot
{// 爬蟲User-Agent特征列表protected $botPatterns = ['/bot/i', '/spider/i', '/curl/i', '/wget/i', '/python/i', '/scrapy/i', '/crawl/i', '/httpclient/i',// 下面是自己添加的爬蟲'/toutiao/i','/zhanzhang.toutiao.com/i','/dataforseo/i','/dataforseo.com/i','/dataforseo-bot/i','/semrush/i','/www.semrush.com/i','/YisouSpider/i',];// 白名單(搜索引擎合法爬蟲)protected $allowPatterns = ['/googlebot/i', '/bingbot/i', '/baiduspider/i', '/Sogou web spider/i'];public function run(){$request = request();$userAgent = $request->header('user-agent', '');$path = $request->path();// 白名單放行foreach ($this->allowPatterns as $pattern) {if (preg_match($pattern, $userAgent)) {trace("放行{$pattern}爬蟲: UA={$userAgent}, Path={$path}", 'info');return;}}// 黑名單攔截foreach ($this->botPatterns as $pattern) {if (preg_match($pattern, $userAgent)) {// 靜默記錄日志(不觸發錯誤)trace("Blocked Bot: UA={$userAgent}, Path={$path}", 'info');// 靜默攔截(不記錄錯誤日志)$this->silentBlock();}}}/*** 靜默攔截邏輯*/private function silentBlock(){// 返回404頁面(或自定義響應)$response = Response::create()->code(404)->data('Access Denied')->header(['Content-Type' => 'text/plain']);// 終止后續執行throw new \think\exception\HttpResponseException($response);}}
2. 注冊行為到請求事件

在 application/tags.php 中綁定行為到 app_init事件(應用初始化):

return [// 應用初始化'app_init'     => ['app\\common\\behavior\\BlockBot',  //爬蟲攔截],
];
3. 自定義異常處理(防止錯誤日志)
(1) 創建異常處理類

在 application/common/exception 下新建 ExceptionHandler.php,覆蓋默認錯誤處理:

<?php
namespace app\common\exception;use think\exception\Handle;
use think\exception\RouteNotFoundException;
use think\exception\ValidateException;
use think\Response;class ExceptionHandler extends Handle
{public function render(\Exception $e){// 攔截路由不存在錯誤(常見于爬蟲探測)if ($e instanceof RouteNotFoundException) {return $this->silentResponse(404);}// 攔截參數驗證錯誤(如分頁參數過大)if ($e instanceof ValidateException) {return $this->silentResponse(400);}// 其他錯誤靜默記錄(可選)trace("Silent Error: " . $e->getMessage(), 'error');return parent::render($e);}/*** 靜默響應(不記錄日志)*/private function silentResponse($code){return Response::create()->code($code)->data('')->header(['Content-Type' => 'text/plain']);}
}
(2) 配置異常處理

在 application/config.php 中指定自定義異常處理器:

// 異常處理配置
'exception_handle' => 'app\common\exception\ExceptionHandler',
4. Nginx層優化(可選)

在服務器配置中攔截部分爬蟲并靜默處理:

server {listen 80;server_name yourdomain.com;# 攔截爬蟲User-Agent并靜默處理if ($http_user_agent ~* (bot|spider|python|curl|wget)) {access_log off;  # 不記錄訪問日志return 444;     # 靜默關閉連接}# 不記錄404錯誤日志error_page 404 = /404;location = /404 {internal;access_log off;}# ThinkPHP偽靜態規則location / {if (!-e $request_filename) {rewrite ^(.*)$ /index.php?s=$1 last;break;}}
}

二、TP5.1或TP6.0通過中間件(middleware)攔截爬蟲并避免生成 [ error ] NULL 錯誤日志

以TP5.1演示:

1. 創建攔截中間件(核心邏輯)

在 application/common/middleware 下新建 BlockBot.php,實現 雙重防護:

<?php
namespace app\common\middleware;use think\Response;class BlockBot
{// 爬蟲User-Agent特征列表protected $botPatterns = ['/bot/i', '/spider/i', '/curl/i', '/wget/i', '/python/i', '/scrapy/i', '/crawl/i', '/httpclient/i'];// 白名單(搜索引擎合法爬蟲)protected $allowPatterns = ['/googlebot/i', '/bingbot/i', '/baiduspider/i'];public function handle($request, \Closure $next){$userAgent = $request->header('user-agent', '');$path = $request->pathinfo();// 放行白名單爬蟲foreach ($this->allowPatterns as $pattern) {if (preg_match($pattern, $userAgent)) {return $next($request);}}// 攔截黑名單爬蟲foreach ($this->botPatterns as $pattern) {if (preg_match($pattern, $userAgent)) {// 靜默記錄日志(不觸發錯誤)trace("Blocked Bot: UA={$userAgent}, Path={$path}", 'info');// 直接返回404或403,避免后續邏輯執行return response('', 404)->header(['Content-Type' => 'text/html; charset=utf-8']);}}return $next($request);}
}
2. 注冊中間件(全局生效)

修改 application/config.php 配置,確保中間件在最優先執行:

// 中間件配置
'middleware' => ['app\common\middleware\BlockBot', // 添加此行到最前面// ...其他中間件
],
3. 防止生成 [ error ] NULL 日志
(1) 自定義錯誤處理(覆蓋ThinkPHP5默認行為)

在 application/config.php 中配置:

// 錯誤處理配置
'exception_handle'       => 'app\common\exception\ExceptionHandler',

創建 application/common/exception/ExceptionHandler.php:

<?php
namespace app\common\exception;use think\exception\Handle;
use think\exception\RouteNotFoundException;
use think\exception\ValidateException;
use think\Response;class ExceptionHandler extends Handle
{public function render(\Exception $e){// 攔截路由不存在錯誤(常見于爬蟲探測)if ($e instanceof RouteNotFoundException) {return $this->silentResponse(404);}// 攔截參數驗證錯誤(如分頁過大)if ($e instanceof ValidateException) {return $this->silentResponse(400);}// 其他錯誤按需處理(此處靜默記錄)trace("Silent Error: " . $e->getMessage(), 'error');return parent::render($e);}/*** 靜默響應(不記錄日志)*/private function silentResponse($code){return Response::create()->code($code)->data('')->header(['Content-Type' => 'text/plain']);}
}
(2) 配置日志過濾

修改 application/config.php 忽略部分錯誤類型:

// 日志配置
'log' => ['type' => 'File','level' => ['error', 'sql'],'apart_level' => ['error', 'sql'],'ignore_error' => [// 忽略路由不存在錯誤(避免生成 [ error ] NULL 日志)'think\exception\RouteNotFoundException',],
],
4. Nginx層優化(雙重防護)
server {listen 80;server_name yourdomain.com;# 攔截爬蟲User-Agent并靜默處理if ($http_user_agent ~* (bot|spider|python|curl|wget)) {access_log off;  # 不記錄訪問日志return 444;      # 靜默關閉連接}# FastAdmin偽靜態規則location / {if (!-e $request_filename) {rewrite ^(.*)$ /index.php?s=$1 last;break;}}# 不記錄404錯誤日志error_page 404 = /404.html;location = /404.html {internal;access_log off;}
}
注意:經查,網站一直寫入[ error ] NULL日志,是因為框架文件thinkphp\library\think\App.php文件代碼被惡意篡改

![在這里插入圖片描述](https://i-blog.csdnimg.cn/direct/3ad9271f561e4ce9ac4d5c9f2867de63.png
在這里插入圖片描述

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

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

相關文章

OpenHarmony平臺驅動開發(十五),SDIO

OpenHarmony平臺驅動開發&#xff08;十五&#xff09; SDIO 概述 功能簡介 SDIO&#xff08;Secure Digital Input and Output&#xff09;由SD卡發展而來&#xff0c;與SD卡統稱為MMC&#xff08;MultiMediaCard&#xff09;&#xff0c;二者使用相同的通信協議。SDIO接口…

使用FastAPI和React以及MongoDB構建全棧Web應用03 全棧開發快速入門

一、什么是全棧開發 A full-stack web application is a complete software application that encompasses both the frontend and backend components. It’s designed to interact with users through a web browser and perform actions that involve data processing and …

Coco AI 開源應用程序 - 搜索、連接、協作、您的個人 AI 搜索和助手,都在一個空間中。

一、軟件介紹 文末提供程序和源碼下載 Coco AI 是一個統一的搜索平臺&#xff0c;可將您的所有企業應用程序和數據&#xff08;Google Workspace、Dropbox、Confluent Wiki、GitHub 等&#xff09;連接到一個功能強大的搜索界面中。此存儲庫包含為桌面和移動設備構建的 Coco 應…

CSS經典布局之圣杯布局和雙飛翼布局

目標&#xff1a; 中間自適應&#xff0c;兩邊定寬&#xff0c;并且三欄布局在一行展示。 圣杯布局 實現方法&#xff1a; 通過float搭建布局margin使三列布局到一行上relative相對定位調整位置&#xff1b; 給外部容器添加padding&#xff0c;通過相對定位調整左右兩列的…

# 實時英文 OCR 文字識別:從攝像頭到 PyQt5 界面的實現

實時英文 OCR 文字識別&#xff1a;從攝像頭到 PyQt5 界面的實現 引言 在數字化時代&#xff0c;文字識別技術&#xff08;OCR&#xff09;在眾多領域中發揮著重要作用。無論是文檔掃描、車牌識別還是實時視頻流中的文字提取&#xff0c;OCR 技術都能提供高效且準確的解決方案…

<C#>log4net 的配置文件配置項詳細介紹

log4net 是一個功能強大的日志記錄工具&#xff0c;通過配置文件可以靈活地控制日志的輸出方式、格式、級別等。以下是對 log4net 配置文件常見配置項的詳細介紹&#xff1a; 根元素 <log4net> 這是 log4net 配置文件的根元素&#xff0c;所有配置項都要包含在該元素內…

編譯docker版openresty

使用alpine為基礎鏡像 # 使用Alpine作為基礎鏡像 FROM alpine:3.18# 替換為阿里云鏡像源&#xff0c;并安裝必要的依賴 RUN sed -i s|https://dl-cdn.alpinelinux.org/alpine|https://mirrors.aliyun.com/alpine|g /etc/apk/repositories && \apk add --no-cache \bui…

conda 輸出指定python環境的庫 輸出為 yaml文件

conda 輸出指定python環境的庫 輸出為 yaml文件。 有時為了項目部署&#xff0c;需要匹配之前的python環境&#xff0c;需要輸出對應的python依賴庫。 假設你的目標環境名為 myenv&#xff0c;運行以下命令&#xff1a; conda env export -n myenv > myenv_environment.ym…

[Java][Leetcode middle] 121. 買賣股票的最佳時機

暴力循環 總是以最低的價格買入&#xff0c;以最高的價格賣出: 例如第一天買入&#xff0c;去找剩下n-1天的最高價格&#xff0c;計算利潤 依次計算到n-1天買入&#xff1b; 比較上述利潤 // 運行時間超時。 o(n^2)public int maxProfit1(int[] prices) {int profit 0;for (i…

克隆虛擬機組成集群

一、克隆虛擬機 1. 準備基礎虛擬機 確保基礎虛擬機已安裝好操作系統&#xff08;如 Ubuntu&#xff09;、Java 和 Hadoop。關閉防火墻并禁用 SELinux&#xff08;如適用&#xff09;&#xff1a; bash sudo ufw disable # Ubuntu sudo systemctl disable firewalld # CentO…

記錄一次使用thinkphp使用PhpSpreadsheet擴展導出數據,解決身份證號碼等信息科學計數法問題處理

PhpSpreadsheet官網 PhpSpreadsheet安裝 composer require phpoffice/phpspreadsheet使用composer安裝時一定要下載php對應的版本&#xff0c;下載之前使用php -v檢查當前php版本 簡單使用 <?php require vendor/autoload.php;use PhpOffice\PhpSpreadsheet\Spreadshee…

前端工程化:從 Webpack 到 Vite

引言 前端工程化是現代Web開發不可或缺的一部分&#xff0c;它通過自動化流程和標準化實踐&#xff0c;提高了開發效率和代碼質量。在這個領域中&#xff0c;構建工具扮演著核心角色&#xff0c;而Webpack和Vite則是其中的兩位重要角色。本文將探討前端工程化的演進歷程&#…

Leetcode 3543. Maximum Weighted K-Edge Path

Leetcode 3543. Maximum Weighted K-Edge Path 1. 解題思路2. 代碼實現 題目鏈接&#xff1a;3543. Maximum Weighted K-Edge Path 1. 解題思路 這一題思路上就是一個遍歷的思路&#xff0c;我們只需要考察每一個節點作為起點時&#xff0c;所有長為 k k k的線段的長度&…

香橙派zero3 安卓TV12,更換桌面launcher,開機自啟動kodi

打開開發者模式&#xff0c;連擊版本號&#xff0c;基本上都是這樣。 adb連接 查找桌面包名 adb shell dumpsys activity activities | findstr mResumedActivity 禁用原桌面com.android.tv.launcher&#xff0c;已經安裝了projectivylauncher434.apk桌面。 adb shell pm …

半小時快速入門Spring AI:使用騰訊云編程助手CodeBuddy 開發簡易聊天程序

引言 隨著人工智能&#xff08;AI&#xff09;技術的飛速發展&#xff0c;越來越多的開發者開始探索如何將AI集成到自己的應用中。人工智能正在迅速改變各行各業的工作方式&#xff0c;從自動化客服到智能推薦系統&#xff0c;AI的應用幾乎無處不在。Spring AI作為一種開源框架…

【unity游戲開發——編輯器擴展】使用MenuItem自定義菜單欄拓展

免職聲明&#xff1a; 1、目前本博客分享的大部分知識產出方式是&#xff1a;學習別人知識自己實際做一遍自己的理解擴展內容自己整理、歸納、總結再分享。2、正如博客簡介所說&#xff1a;這里沒有教程&#xff0c;這里只做學習分享。所有的內容都是學習筆記&#xff0c;可以說…

數學復習筆記 7

前言 現在復習線代基礎&#xff0c;慢慢打基礎。。 轉置 方陣轉置之后行列式保持不變。我的筆記感覺主要不是整理知識點&#xff0c;主要是把我的一些理解記錄下來。這才是我自己的東西&#xff0c;那些需要記住的知識和內容記住就好了。記住轉置有四個性質&#xff0c;在講…

AIGC時代的內容安全:AI檢測技術如何應對新型風險挑戰?

在數字時代&#xff0c;互聯網內容以文本、圖像、音頻和視頻等形式呈現爆發式增長&#xff0c;深刻塑造了信息傳播的格局。然而&#xff0c;內容的快速傳播也帶來了嚴峻挑戰&#xff1a;違法信息&#xff08;如涉黃、涉政&#xff09;、虛假廣告、網絡暴力等內容不僅威脅用戶體…

PyTorch中的nn.Embedding應用詳解

PyTorch 文章目錄 PyTorch前言一、nn.Embedding的基本原理二、nn.Embedding的實際應用簡單的例子自然語言處理任務 前言 在深度學習中&#xff0c;詞嵌入&#xff08;Word Embedding&#xff09;是一種常見的技術&#xff0c;用于將離散的詞匯或符號映射到連續的向量空間。這種…

AI 檢測原創論文:技術迷思與教育本質的悖論思考

當高校將 AI 寫作檢測工具作為學術誠信的 "電子判官"&#xff0c;一場由技術理性引發的教育異化正在悄然上演。GPT-4 檢測工具將人類創作的論文誤判為 AI 生成的概率高達 23%&#xff08;斯坦福大學 2024 年研究數據&#xff09;&#xff0c;這種 "以 AI 制 AI&…