- 出站事件总线ID webhook_hub版本 1.1.0插件制作者 cxk123售价 30 积分1762 行 / 105.2 KBHook / 路由 / 后台页1.1.0:SSRF 过滤收口 —— 修掉「IPv6 内嵌 IPv4」的十六进制写法绕过校验的缺陷收费插件安装说明购买后点击“授权码”获取一次性授权码;在后台 > 插件广场点击在线安装或更新,并填写该授权码。已购买用户更新免费:每次在线安装或更新前,重新点击“授权码”获取新的一次性授权码即可,无需再次购买;也可直接下载新版后用后台“插件上传”更新。尊重并感谢他人劳动,请勿传播代码。app/plugins/webhook_hub/plugin.php插件预览5 张开发日志已有 2 条
此项目接受所有登录用户协助维护和提交更新。
主楼 版本 1.0.0 更新:
【1.0.0 首次上架】出站事件总线 —— 把社区里发生的事,用带签名的 HTTPS 请求投递出去- 18 类事件、可配多个订阅:新主题 / 主题编辑 / 回帖 / 内容删除 / 新用户注册 / 账号变更 / 积分变动 /
安全频控 / 站内通知 / 主题浏览,以及其它插件的事件源(悬赏采纳 / 问卷提交 / 活动发布·报名·签到 / 举报处置)。
每条订阅 = 一个回调地址 + 独立密钥 + 事件白名单 + 备注 + 超时 + 最多尝试次数 + 启用开关,新建默认停用。- 页面路径只写一行:事件发生时只往队列写一条(未命中订阅则一条语句都不发),出站 HTTP 全部交给计划任务 ——
发帖那一刻零外呼(套件用假接收端实测)。
queue_key唯一 + 多行 INSERT IGNORE ⇒ 幂等不重复投递。- 计划任务批量投递:每轮 20 条 + 指数退避(60s → 5m → 30m → 2h)+ 死信 + 一键重放(单条 / 批量);
失败连续到阈值可自动暂停该订阅并在后台恢复;投递日志逐条可查(状态 / 尝试 / HTTP 码 / 错误原因 / 耗时 / 载荷字节)。
每轮语句数 ≤5 且与批次大小无关(循环体内零查库,两条多行 upsert 写回)。- HMAC-SHA256 签名与防重放:
X-BBS1-Signature: sha256=HMAC(secret, timestamp + "\n" + body)+
X-BBS1-Timestamp+X-BBS1-Idempotency-Key,README 给了接收方三行验收伪码。- SSRF 防护 fail-closed:只允许 http/https;拒绝环回 / 私网 / 链路本地 / 保留段 / 十进制与八进制 IP 混淆 /
带用户名密码的 URL;云元数据地址永不放行(即使打开「允许内网目标」);投递前再解析一次域名(防 DNS 重绑定);
不跟随重定向(3xx 按失败处理)。内网目标默认全禁,开关是给自建中台的显式选项(后台红字警告 + 审计)。- 匿名口径:内容类事件的 payload 不含任何作者身份字段(user_id / username / email / IP 都没有)——
任何内容都可能是匿名内容;账号类事件才带 user_id 与用户名,且永不带 email / IP / 密码 / 正文。
- 其它:三驱动可移植(借核心 upsert 生成器,无驱动分支 / 无窗口函数 / 无单库日期函数);
写操作 POST + 令牌;卸载清干净(3 表 + 6 索引 + 计划任务 + 全部设置);验收套件 189 项 / 0 失败;
5 张真实无头 Chromium 预览图。插件质量报告
插件:
webhook_hubHook 功能范围 循环 使用频率 文件读写 修改系统表 读写系统表 读写自己的表 app.boot 全站请求启动 否 5 - - - - topic.after_view 主题查看页完成加载 否 4 - - - - notification.after_create 通知及未读数写入后 否 3 - - - - reply.after_save 回帖保存后 否 3 - - - - security.rate_hit 注册/登录限流记录 否 3 - - - - topic.after_save 主题保存后 否 3 - - - - user.after_save 用户注册/资料保存后 否 3 - - - - user.points_changed 用户积分变动后 否 3 - - - - content.before_delete 内容删除操作 否 2 - - - - event_rsvp.after_checkin 非系统hook 否 1 - - - - event_rsvp.after_publish 非系统hook 否 1 - - - - event_rsvp.after_signup 非系统hook 否 1 - - - - qa_bounty.after_accept 非系统hook 否 1 - - - - report_center.after_dispose 非系统hook 否 1 - - - - survey_poll.after_submit 非系统hook 否 1 - - - - 颜色说明:黄色表示有数据读写,红色表示 Hook 在系统循环中执行,浅蓝色表示有文件写入。“列表跳过”表示回调在列表路径会提前返回,“回调内”表示操作位于回调自身或其帮助函数的循环体内。“文件批处理”表示逐个处理用户一次提交的文件,属于必要操作,不标记修正。只有操作实际处于需要优化的循环路径时,才会标记“修正❗️”。
数据字典
plugin_webhook_hub_endpoints字段 类型 可空 默认值 约束 - 动态定义 - - 无法静态解析 plugin_webhook_hub_deliveries字段 类型 可空 默认值 约束 - 动态定义 - - 无法静态解析 plugin_webhook_hub_audit字段 类型 可空 默认值 约束 - 动态定义 - - 无法静态解析 版本 1.1.0 更新:
1.1.0 · 出站地址体检收紧- 修复:地址过滤对 IPv6 的「内嵌 IPv4」形态识别不全 ——
[::ffff:a9fe:a9fe](=169.254.169.254)、[::ffff:7f00:1](=127.0.0.1)、[::ffff:a00:1](=10.0.0.1)、[::7f00:1]、[2002:7f00:1::](6to4)、[64:ff9b::7f00:1](NAT64)这些写法此前会被放行,与「云元数据地址永不放行」的承诺不符。
现在这些形态统一还原成 IPv4 再按同一套规则判:元数据地址与私网段照旧硬拒,
allow_private也放宽不了元数据。- 口径一致:
[::1]与[::ffff:127.0.0.1]在「允许内网目标」开关下的结果保持一致(此前会出现一个放行、一个拒绝的矛盾)。 - 正确性未受影响:正常公网 IPv6 与域名照旧放行(有负向对照断言守着)。
- 修复:地址过滤对 IPv6 的「内嵌 IPv4」形态识别不全 ——