• cxk123
    出站事件总线
    ID webhook_hub版本 1.1.0插件制作者 cxk123售价 30 积分1762 行 / 105.2 KBHook / 路由 / 后台页
    1.1.0:SSRF 过滤收口 —— 修掉「IPv6 内嵌 IPv4」的十六进制写法绕过校验的缺陷
    收费插件安装说明购买后点击“授权码”获取一次性授权码;在后台 > 插件广场点击在线安装或更新,并填写该授权码。已购买用户更新免费:每次在线安装或更新前,重新点击“授权码”获取新的一次性授权码即可,无需再次购买;也可直接下载新版后用后台“插件上传”更新。尊重并感谢他人劳动,请勿传播代码。
    app/plugins/webhook_hub/plugin.php
    开发日志已有 2 条

    此项目接受所有登录用户协助维护和提交更新。

    • cxk123
      cxk123
      版本 1.1.0 28fdce380093 更新:**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:release
    • cxk123
      cxk123
      版本 1.0.0 7267083e1050 更新:【1.0.0 首次上架】出站事件总线 —— 把社区里发生的事,用带签名的 HTTPS 请求投递出去 - **18 类事件、可配多个订阅**:新主题 / 主题编辑 / 回帖 / 内容删除 / 新用户注册 / 账号变更 / 积分变动 / 安全频控 / 站内通知 / 主题浏览,以及其它插件的事件源(悬赏采纳 / 问卷提交 / 活动发布·报名·签到 / 举报处置)。 每条订阅 = 一个回调地址 + 独立密
    主楼
  • cxk123

    版本 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 预览图。

    #1
  • 质量报告

    插件质量报告

    插件:webhook_hub

    Hook功能范围循环使用频率文件读写修改系统表读写系统表读写自己的表
    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

    字段类型可空默认值约束
    -动态定义--无法静态解析
    #2
  • cxk123

    版本 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 与域名照旧放行(有负向对照断言守着)。
    #3

发表回复

登录后回复