nidr0x/wordpress-workers-tarpit
GitHub: nidr0x/wordpress-workers-tarpit
一个部署在 Cloudflare Workers 上的反扫描器机器人陷阱,通过压缩炸弹、慢速响应和虚假页面来拦截并消耗漏洞扫描器的资源。
Stars: 0 | Forks: 0
# WordPress Workers Tarpit
此软件包会拦截并困住那些在您的 Cloudflare Workers 网站上搜索敏感端点(例如 `/wp-login.php`、`/.env` 或 `/.git/config`)的恶意机器人或漏洞扫描器。它不会快速返回 404 错误,而是通过极其缓慢地流式传输响应,或发送会导致其内存过载的压缩数据来困住它们。
## 工作原理
合法流量(包括像 Googlebot 这样被列入白名单的搜索引擎)将不受影响地通过。当请求匹配到已知的机器人路径或恶意的 user-agent 时,陷阱就会被触发:
* **GZIP 炸弹**:如果扫描器接受 gzip/deflate,我们会流式传输压缩的零字节。在机器人端,这会在内存中膨胀至 10MB 以上,通常会导致扫描器脚本崩溃或冻结其进程。
* **慢速滴水**:如果它们不接受压缩,我们会极其缓慢地流式传输响应(例如,每约 250ms 发送 3 个字节)。这会挂起连接并浪费扫描器的时间。
* **虚假面板**:访问 `/wp-admin` 会模拟一个带有无限导航循环的真实管理面板。探测 `/wp-login.php` 会伪造一个真实的 WordPress 登录页面,该页面会拦截表单提交,增加 5 到 15 秒的随机延迟,并返回随机的错误消息。
## 安装说明
安装该库软件包:
```
npm install wordpress-workers-tarpit
```
## 使用方法
在您的 Worker 的 `fetch` 处理程序顶部调用陷阱处理程序:
```
import { tarpit } from "wordpress-workers-tarpit";
export default {
async fetch(request: Request, env: any, ctx: ExecutionContext): Promise {
// Check if the request is a bot probe and trap it if so
const trap = tarpit(request, env, ctx, {
enableGzipBomb: true,
slowDripMode: "exponential"
});
if (trap) return trap;
// Your normal website logic goes here
return new Response("Hello World");
}
};
```
## 设置
您可以通过传递一个 options 对象来自定义陷阱行为:
| 选项 | 类型 | 默认值 | 描述 |
| :--- | :--- | :--- | :--- |
| `botPaths` | `string[]` | *默认列表* | 替换默认的目标路径列表。 |
| `additionalBotPaths` | `string[]` | `[]` | 将自定义路径附加到机器人列表中。 |
| `badUserAgents` | `string[]` | *默认列表* | 用于拦截已知扫描器的自定义字符串(例如 `sqlmap`)。 |
| `userAgentWhitelist` | `string[]` | *默认列表* | 永远不应被困住的 user-agent(例如 `googlebot`)。 |
| `enableUserAgentTrap` | `boolean` | `false` | 如果为 true,则在所有页面上立即拦截恶意的 user-agent。 |
| `slowDripChunkSize` | `number` | `3` | 在慢速滴水模式下一次发送的字节数。 |
| `slowDripMinDelay` | `number` | `100` | 发送数据块之间的最小延迟(毫秒)。 |
| `slowDripMaxDelay` | `number` | `500` | 发送数据块之间的最大延迟(毫秒)。 |
| `slowDripMode` | `'constant'\|'random'\|'exponential'` | `'random'` | 延迟分布('exponential' 会随着时间的推移越来越慢)。 |
| `enableGzipBomb` | `boolean` | `true` | 向接受 gzip/deflate 的机器人提供压缩炸弹。 |
| `gzipBombSizeMb` | `number` | `10` | 解压后的零字节 payload 大小(以 MB 为单位)。 |
| `d1BindingName` | `string` | `'TARPIT_DB'` | 在您的 env 中用于 D1 日志数据库的绑定名称。 |
## 遥测与日志(可选)
如果您绑定了 Cloudflare D1 数据库,tarpit 将在后台记录所有被拦截的扫描行为。
### 1. 数据库设置
创建数据库并应用 schema:
```
npx wrangler d1 create tarpit-logs
npx wrangler d1 execute tarpit-logs --remote --file=schema.sql
```
### 2. 配置 Wrangler
将绑定添加到您的 `wrangler.jsonc`(或 `wrangler.toml`)中:
```
"d1_databases": [
{
"binding": "TARPIT_DB",
"database_name": "tarpit-logs",
"database_id": ""
}
]
```
## 分析仪表板
该项目包含一个可选的、独立的分析仪表板 Worker。它会查询日志数据库,以显示被陷阱捕获的请求总数、唯一 IP、国家/地区(通过 Cloudflare 的 GeoIP 标头),以及机器人在您的虚假登录表单上尝试过的已脱敏的密码列表。
要部署它:
1. 转到 `packages/dashboard`。
2. 打开 `wrangler.jsonc` 并粘贴您的 D1 `database_id`。
3. 运行 `npx wrangler deploy`。
## 常见问题解答
#### 这会影响真实用户或搜索排名吗?
不会。该陷阱仅会在真实用户从不访问的路径(例如 `/wp-login.php` 或 `/.env`)上触发。合法的搜索爬虫(例如 Googlebot)已被列入白名单,这意味着它们不会被卡住。
#### GZIP 炸弹会占用大量服务器内存吗?
不会。我们在流式生成器中以 64KB 为增量生成零字节。Worker 几乎不占用任何 RAM,但机器人会被迫在其内存中将压缩流扩展至 10MB 以上,从而导致扫描器客户端崩溃。
#### 慢速滴水会耗尽 Worker 的 CPU 时间吗?
不会。延迟使用的是异步定时器(在可读流内部使用 `setTimeout`)。连接是在 Cloudflare 边缘节点上保持打开的,这意味着您的 Worker 在等待期间不会被计收 CPU 周期费用。
标签:CISA项目, WAF, 反爬虫, 暗色界面, 程序员工具, 网络安全, 自动化攻击, 蜜罐, 证书利用, 隐私保护