joaocorrea081/botzero
GitHub: joaocorrea081/botzero
BotZero 通过五层不可见的防护机制,在不使用验证码或外部服务的前提下,为 WordPress Contact Form 7 拦截自动化垃圾机器人提交。
Stars: 0 | Forks: 0
# BotZero — Contact Form 7 的反垃圾评论功能
通过五层不可见的防护来阻止 Contact Form 7 的垃圾机器人。无需验证码,无需外部服务,访客无需进行任何额外操作。
## 它解决的问题
到达 Contact Form 7 的大部分垃圾信息都不是人类发送的——而且看起来也不像垃圾信息。它们带有看似合理的姓名、有效的电子邮件、真实的公司名称和一句无害的话,而这一切都是由像 Faker 这样的库生成的。像 Akismet 这样的内容过滤器会将其判定为合法信息,因为就它们所能衡量的所有指标而言,这些内容*确实*是合法的。
暴露机器人的不是内容,而是其投递方式:它从不打开你的页面。而是直接向表单的 endpoint (`/wp-json/contact-form-7/v1/contact-forms//feedback`) 发送 POST 请求,并附带一份保存好的字段列表。
BotZero 正是针对这一点进行防御。每一层都会提出一个问题,而这个问题只有真实的浏览器和真实的人类才能回答。
## 五层防护
| 层级 | 验证内容 | 拦截目标 |
|---|---|---|
| **一次性 JS Token** | 此次提交是否来自真正加载过的页面? | 直接向 endpoint 发送 POST 请求的机器人。此 Token 会在页面加载后通过 JavaScript 获取,且绝不会被重复使用。 |
| **人机交互** | 是否有人移动了鼠标、点击了屏幕、打字或滚动了页面? | 能够执行 JavaScript 但从不与页面交互的 headless 浏览器。 |
| **Honeypot** | 你是否填写了人类看不见的字段? | 读取 HTML 并填充其找到的每个字段的机器人。 |
| **来源校验** | 此请求是否从本网站发出? | 来自其他网站的提交。继续接受**完全没有** Origin/Referer 的请求,因为代理和隐私工具会合理地移除这些标头。 |
| **最短时间 + 单 IP 限制** | 这种速度是人类能做到的吗? | 来自同一地址的瞬间提交和连续高频提交。 |
被拦截的提交会直接经过 Contact Form 7 自身的 `wpcf7_spam` 机制处理:不会发送任何电子邮件,数据库插件也不会记录任何内容。Akismet 依然可以协同工作——两者解决的是不同的问题,不会产生冲突。
## 设置
在 **设置 → BotZero** 中,你可以看到过去 30 天内被拦截的机器人数量,并按拦截它们的层级进行分类。你可以一眼看出它是否在工作,以及是哪种类型的机器人来袭。每一层都可以独立开启或关闭,并且最短填写时间和单 IP 限制均可调整。
如需详细日志,请在 `wp-config.php` 中添加:
```
define( 'BOTZERO_DEBUG', true );
```
每次拦截都会连同原因 (`no-token`, `no-interaction`, `honeypot`, `too-fast`, `token-reused`, `origin`, `rate-limit`) 一起记录到 `wp-content/debug.log` 中。
## 安装
下载 zip 压缩包,然后进入 **插件 → 安装插件 → 上传插件 → 启用**。无需任何配置:所有的 Contact Form 7 表单都会立即受到保护。
要求 WordPress 6.0+,PHP 7.4+ 和 Contact Form 7。
## 需要了解的一个细节
**禁用 JavaScript 的访客将被拦截。** Contact Form 7 本身就已经依赖 JavaScript 来在不刷新页面的情况下提交表单,因此在实际中这很少见——但这是一个真实存在的影响,并非假设。如果你的受众群体受此影响较大,请关闭 Token 层并使用其他四层。
缓存插件不是问题:Token 是在页面加载后获取的,因此永远不会被存储在缓存的 HTML 中。
## English
Most Contact Form 7 spam is not written by a person, and does not look like spam. It arrives with a plausible name, a valid email address, a real-looking company and a harmless sentence — generated by a library like Faker. Content-based filters such as Akismet score it as legitimate because, by every measure they can see, it *is* legitimate.
What gives the bot away is not the content, it is the delivery: it never opens your page. It POSTs straight to the form endpoint.
BotZero is built around that. Five invisible layers — single-use JS token, human interaction signal, honeypot, origin check, timing and per-IP rate limit — each asking a question only a real browser driven by a real person can answer. Blocked submissions go through Contact Form 7's own `wpcf7_spam` pipeline, so no mail is sent and database add-ons store nothing.
**Settings → BotZero** shows 30-day block counters broken down by layer, with a switch for each protection and tunable thresholds. Native pt-BR translation included.
**Trade-off:** visitors with JavaScript disabled are blocked. Contact Form 7 already needs JavaScript to submit without a page reload, so this is rare in practice — but it is real. If it matters for your audience, turn the token layer off and rely on the other four.
## 许可证
GPL v2 或更高版本。由 [in9ti](https://in9ti.com) 制作。
标签:Bot防护, Contact Form 7, ffuf, Web安全, WordPress插件, 反垃圾, 数据可视化, 文件完整性监控, 蓝队分析, 表单保护