首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >我的网站被OpenAI官方不断非法爬虫(千万级别),可能用于AI模型训练,为了杜绝这个我特意写了个脚本应对!

我的网站被OpenAI官方不断非法爬虫(千万级别),可能用于AI模型训练,为了杜绝这个我特意写了个脚本应对!

作者头像
程序猿的栖息地
发布2026-04-16 14:44:00
发布2026-04-16 14:44:00
1010
举报

最近发现流量剧增,(千万级别)20000000+的网络请求,,查看了一下日志发现原来我的网站被OpenAI 的官方网络爬虫(GPTBot),每天OpenAI 正在抓取我的网站内容,可能是用来训练或更新其 AI 模型(如 GPT-4、ChatGPT 等),为了杜绝这个非法请求,我特意写了个脚本!

🔧 推荐方案:利用 include 指令实现动态 IP 黑名单

这种方法通过 PHP 脚本来维护一个独立的 IP 黑名单文件,完全不影响站点主配置文件,既安全又易于管理。

1. 修改站点 Nginx 配置,引入黑名单文件

首先,需要让 Nginx 加载一个外部 IP 黑名单文件。

打开站点配置文件:在宝塔面板的【网站】页面,找到你的 ThinkPHP 站点,点击右侧的【配置文件】。

添加include指令:在server { }代码块中找一个合适的位置(通常放在所有location规则之前),添加以下代码:

代码语言:javascript
复制

引入 IP 黑名单配置include /www/wwwroot/你的站点目录/ip_blacklist.conf;

注意:请将 /www/wwwroot/你的站点目录/ 替换为你的站点实际路径,例如 /www/wwwroot/mysite.com/。确保该路径 Nginx 有读取权限。

3. 保存配置文件

2. 创建 PHP 脚本,动态管理 IP 黑名单

接下来,在你的 ThinkPHP 项目中创建一个控制器或独立 PHP 文件,用于管理ip_blacklist.conf文件。以下是一个基础示例:

代码语言:javascript
复制
<?php
/**
 * 动态管理 Nginx IP 黑名单
 * 路径: /app/controller/IpBlacklist.php 或类似位置
 */

class IpBlacklist
{
    // 黑名单文件路径,务必与 Nginx include 路径一致
    private $blacklistFile = '/www/wwwroot/你的站点目录/ip_blacklist.conf';

    /**
     * 添加 IP 到黑名单
     * @param string $ip 要封禁的 IP
     * @return bool
     */
    public function addIp($ip)
    {
        // 1. 验证 IP 格式
        if (!filter_var($ip, FILTER_VALIDATE_IP)) {
            return false;
        }

        // 2. 构建 Nginx deny 规则
        $rule = "deny {$ip};\n";

        // 3. 将规则追加到黑名单文件
        file_put_contents($this->blacklistFile, $rule, FILE_APPEND | LOCK_EX);

        // 4. 重载 Nginx 使配置生效
        return $this->reloadNginx();
    }

    /**
     * 从黑名单移除 IP(进阶功能)
     * @param string $ip 要解封的 IP
     * @return bool
     */
    public function removeIp($ip)
    {
        if (!file_exists($this->blacklistFile)) {
            return true;
        }

        // 读取所有行,移除包含该 IP 的行
        $lines = file($this->blacklistFile, FILE_IGNORE_NEW_LINES);
        $newLines = array_filter($lines, function($line) use ($ip) {
            return strpos($line, $ip) === false;
        });

        // 写回文件
        file_put_contents($this->blacklistFile, implode("\n", $newLines) . "\n", LOCK_EX);

        // 重载 Nginx
        return $this->reloadNginx();
    }

    /**
     * 重载 Nginx 服务
     * @return bool
     */
    private function reloadNginx()
    {
        // 执行 nginx -s reload 命令
        exec('/usr/sbin/nginx -s reload 2>&1', $output, $returnCode);
        return $returnCode === 0;
    }
}

3. 调用脚本实现动态封禁

在需要封禁 IP 的地方(如后台管理或防攻击逻辑中),调用上述方法即可:

代码语言:javascript
复制
// 示例:在控制器中封禁当前访问者 IP
$ipBlocker = new IpBlacklist();
$visitorIp = $_SERVER['REMOTE_ADDR'];
if ($ipBlocker->addIp($visitorIp)) {
    echo "IP {$visitorIp} 已被成功封禁。";
} else {
    echo "封禁失败,请检查。";
}

⚠️ 重要注意事项

文件权限:确保 Web 用户(通常是www)对站点目录有写入权限,否则 PHP 无法创建或修改ip_blacklist.conf文件。

Nginx 重载命令:代码中的重载命令/usr/sbin/nginx -s reload适用于大多数宝塔环境。如果不行,可以尝试service nginx reload或systemctl reload nginx。

安全性:为防止 IP 黑名单文件被恶意访问,建议在 Nginx 中禁止直接访问*.conf文件。可以在站点配置中添加:

代码语言:javascript
复制
location ~ \.conf$ {
    deny all;
}

考虑使用 CDN/防火墙:如果你的站点使用了 Cloudflare 等 CDN 服务,获取真实 IP 的配置会更复杂。同时,对于大规模或自动化的 IP 封禁需求,使用宝塔面板自带的Nginx 防火墙插件是更省力的选择。

这种方法将业务逻辑(PHP)和服务器配置(Nginx)很好地分离,既满足了动态管理的需求,也保持了系统的稳定和可维护性。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-04-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序猿的栖息地 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🔧 推荐方案:利用 include 指令实现动态 IP 黑名单
  • 1. 修改站点 Nginx 配置,引入黑名单文件
  • 2. 创建 PHP 脚本,动态管理 IP 黑名单
  • 3. 调用脚本实现动态封禁
  • ⚠️ 重要注意事项
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档