- XF 兼容性
- 2.3.x
- 摘要
- Adds Cap, a privacy-friendly self-hosted proof-of-work CAPTCHA for XenForo websites. No images or clicks required; runs entirely in the background without sending data to third parties. Requires your own server setup and a unique site key per forum. Setup involves creating a Docker container, setting up HTTPS, and configuring the add-on within XenForo's admin panel.
创建 Docker Compose 文件
在将要运行 Cap 的服务器上,创建 docker-compose.yml:
注意 127.0.0.1:3000:3000 绑定:这会让 Cap 不暴露在公网之上,只有你的反向代理才能访问到。如果你没有把它放在反向代理后面,请使用 "3000:3000" 而不是 127.0.0.1:3000:3000,但请先阅读 HTTPS 部分。启动它:
如果您的论坛运行在HTTPS上,这一步是必不可少的。浏览器会阻止从安全页面发起不安全请求,因此一个使用https://的论坛与一个使用http://的Cap实例通信时,意味着该插件会静默加载失败,无法进行注册。
将子域名如cap.yoursite.com指向服务器,并将其代理到端口3000。例如,Nginx的配置如下:
运行Certbot对子域名进行操作,然后就完成了。Apache、Caddy和Cloudflare Tunnel都工作得很好。
3. 创建一个站点密钥
打开https://cap.yoursite.com和使用您的ADMIN_KEY登录。
创建一个新的密钥,并将其命名为将使用的论坛的名称。
复制站点密钥和秘密密钥。您现在保存后会显示一次秘密密钥。
站点密钥是公开的,会在页面源代码中出现。而秘密密钥仅用于服务器之间的验证,绝不会发送给访客。请勿分享它,并且不要将其粘贴到支持主题中。
部分3:安装插件
管理员面板 → 插件 → 从档案安装/升级,上传zip文件。
或者解压zip文件并将upload目录中的内容上传至论坛根目录,然后从插件列表中安装Cap CAPTCHA。
部分4:配置它
转至选项 → 基本设置 → 启用访客的CAPTCHA,并选择使用Cap CAPTCHA。会出现三个字段:
Cap实例URL:您的Cap服务器的基础URL,不包含尾部斜杠,例如https://cap.yoursite.com论坛的site key是你为这个论坛创建的站点密钥
secret key:属于那个site key的秘密
保存后,退出登录或打开一个新的隐私窗口加载注册页面。插件应该会显示并验证通过。
如果你选择Cap并且任何字段留空,该附加程序会在管理员面板中显示一个红色警告信息,提示没有渲染CAPTCHA,并且所有访客提交都会被接受。如果看到这个警告,你还没有受到保护。
工作原理
前端:公共模板captcha_cap_captcha渲染了一个指向{实例URL}/{站点密钥}/的<cap-widget>。在解决后,插件会在{实例URL}/{站点密钥}/siteverify上通过POST添加一个隐藏的cap-token字段到表单。
后端:token通过POST到{实例URL}/{站点密钥}/siteverify服务器验证,并且只有当Cap返回{"success": true}时,提交才会被接受。令牌是单次使用的,所以重放会失败。
这两个调用都受你的站点密钥限制,因此每个论坛的流量都会在控制面板中归因于其自己的密钥。
你应该知道的行为
它默认打开,故意如此。为了与XenForo内置的CAPTCHA提供程序匹配:
如果密钥为空,则不渲染任何内容,并且所有人都通过。
如果你的CAP服务器不可达或返回5xx错误,则所有人都通过,并记录错误信息。
这是故意这样做以防止你的CAP服务器宕机时阻止访客注册。代价是,一个无法工作的CAPTCHA看起来就像正常工作一样,这就是为什么管理员警告和错误日志的存在原因。如果一个无法工作的CAPTCHA对你来说比用户注册失败更糟糕,你应该首先改变这种行为;这只需要修改Captcha/Cap.php中的几行代码。
插件的widget脚本从jsDelivr加载。附加程序通过cdn.jsdelivr.net拉取@cap.js/widget(并锁定到特定版本)。因此,你的访客浏览器在显示CAPTCHA页面时会联系jsDelivr。如果你的司法管辖区或隐私政策对此有顾虑,请下载cap.min.js,并将其放在论坛根目录下的某个地方,然后将captcha_cap_captcha模板中的<xf:js src="...">行指向你自己的副本。其他一切都会继续工作。我公开指出这一点是因为这是自托管隐私附加程序中一个公平的反对意见。
那个URL是基于你保存的选项构建的,它告诉你论坛真正使用的实例和密钥。没有任何标签意味着选项从未保存过。如果标签存在但什么也不渲染,请打开浏览器控制台;一个被阻止的混合内容请求或被阻止的CDN在那里会显示出来。
仪表板上没有对该密钥的解决记录。确认上面提到的标签中的密钥确实是你认为的那个密钥。两个共享站点密钥的论坛会被报告为同一个站点,未使用的密钥仍然保持在零。
验证总是失败。检查设置 → 错误日志。每次验证失败都会记录具体尝试访问的端点,因此错误实例URL或站点密钥在那里是可见的。
在将要运行 Cap 的服务器上,创建 docker-compose.yml:
ADMIN_KEY 是你的 Cap 控制台的密码。让它长且随机,至少 32 个字符。拥有它的人可以创建和删除你的站点密钥。
注意 127.0.0.1:3000:3000 绑定:这会让 Cap 不暴露在公网之上,只有你的反向代理才能访问到。如果你没有把它放在反向代理后面,请使用 "3000:3000" 而不是 127.0.0.1:3000:3000,但请先阅读 HTTPS 部分。启动它:
将它放在HTTPS后面
如果您的论坛运行在HTTPS上,这一步是必不可少的。浏览器会阻止从安全页面发起不安全请求,因此一个使用https://的论坛与一个使用http://的Cap实例通信时,意味着该插件会静默加载失败,无法进行注册。
将子域名如cap.yoursite.com指向服务器,并将其代理到端口3000。例如,Nginx的配置如下:
代码:
server {
listen 443 ssl http2;
server_name cap.yoursite.com;
ssl_certificate /etc/letsencrypt/live/cap.yoursite.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/cap.yoursite.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
3. 创建一个站点密钥
打开https://cap.yoursite.com和使用您的ADMIN_KEY登录。
创建一个新的密钥,并将其命名为将使用的论坛的名称。
复制站点密钥和秘密密钥。您现在保存后会显示一次秘密密钥。
站点密钥是公开的,会在页面源代码中出现。而秘密密钥仅用于服务器之间的验证,绝不会发送给访客。请勿分享它,并且不要将其粘贴到支持主题中。
部分3:安装插件
管理员面板 → 插件 → 从档案安装/升级,上传zip文件。
或者解压zip文件并将upload目录中的内容上传至论坛根目录,然后从插件列表中安装Cap CAPTCHA。
部分4:配置它
转至选项 → 基本设置 → 启用访客的CAPTCHA,并选择使用Cap CAPTCHA。会出现三个字段:
Cap实例URL:您的Cap服务器的基础URL,不包含尾部斜杠,例如https://cap.yoursite.com论坛的site key是你为这个论坛创建的站点密钥
secret key:属于那个site key的秘密
保存后,退出登录或打开一个新的隐私窗口加载注册页面。插件应该会显示并验证通过。
如果你选择Cap并且任何字段留空,该附加程序会在管理员面板中显示一个红色警告信息,提示没有渲染CAPTCHA,并且所有访客提交都会被接受。如果看到这个警告,你还没有受到保护。
工作原理
前端:公共模板captcha_cap_captcha渲染了一个指向{实例URL}/{站点密钥}/的<cap-widget>。在解决后,插件会在{实例URL}/{站点密钥}/siteverify上通过POST添加一个隐藏的cap-token字段到表单。
后端:token通过POST到{实例URL}/{站点密钥}/siteverify服务器验证,并且只有当Cap返回{"success": true}时,提交才会被接受。令牌是单次使用的,所以重放会失败。
这两个调用都受你的站点密钥限制,因此每个论坛的流量都会在控制面板中归因于其自己的密钥。
你应该知道的行为
它默认打开,故意如此。为了与XenForo内置的CAPTCHA提供程序匹配:
如果密钥为空,则不渲染任何内容,并且所有人都通过。
如果你的CAP服务器不可达或返回5xx错误,则所有人都通过,并记录错误信息。
这是故意这样做以防止你的CAP服务器宕机时阻止访客注册。代价是,一个无法工作的CAPTCHA看起来就像正常工作一样,这就是为什么管理员警告和错误日志的存在原因。如果一个无法工作的CAPTCHA对你来说比用户注册失败更糟糕,你应该首先改变这种行为;这只需要修改Captcha/Cap.php中的几行代码。
插件的widget脚本从jsDelivr加载。附加程序通过cdn.jsdelivr.net拉取@cap.js/widget(并锁定到特定版本)。因此,你的访客浏览器在显示CAPTCHA页面时会联系jsDelivr。如果你的司法管辖区或隐私政策对此有顾虑,请下载cap.min.js,并将其放在论坛根目录下的某个地方,然后将captcha_cap_captcha模板中的<xf:js src="...">行指向你自己的副本。其他一切都会继续工作。我公开指出这一点是因为这是自托管隐私附加程序中一个公平的反对意见。
HTML:
<cap-widget data-cap-api-endpoint="https://cap.yoursite.com/<site key>/"></cap-widget>
仪表板上没有对该密钥的解决记录。确认上面提到的标签中的密钥确实是你认为的那个密钥。两个共享站点密钥的论坛会被报告为同一个站点,未使用的密钥仍然保持在零。
验证总是失败。检查设置 → 错误日志。每次验证失败都会记录具体尝试访问的端点,因此错误实例URL或站点密钥在那里是可见的。