- 邀请注册与防刷ID invite_system版本 2.2.0插件制作者 cxk123售价 30 积分3207 行 / 191.3 KBHook / 路由 / 后台页用邀请码控制注册:每个邀请码有名额、有效期,随时可以撤销,每人每周期能建几个码、收费插件安装说明购买后点击“授权码”获取一次性授权码;在后台 > 插件广场点击在线安装或更新,并填写该授权码。已购买用户更新免费:每次在线安装或更新前,重新点击“授权码”获取新的一次性授权码即可,无需再次购买;也可直接下载新版后用后台“插件上传”更新。尊重并感谢他人劳动,请勿传播代码。app/plugins/invite_system/plugin.php插件预览5 张开发日志已有 4 条
此项目接受所有登录用户协助维护和提交更新。
主楼 版本 1.0.0 更新:
邀请注册与防刷 1.0.0(首次上架)
把「注册」从「谁都能来」变成「凭邀请准入 + 有账可对」。核心一行不改,未装或停用时注册路径逐字节不变。
四项能力
- 带名额的邀请码与周期配额:每个邀请码有名额(1–50)、有效期、备注,随时可撤销;
「每人每周期可建几个码 / 可发出多少名额」按自然日 / 周 / 月计,用尽时会明确告知下次可发放时间。
名额用带守卫的 CAS 抢占,多 worker 并发下永不超卖。- 双轨准入 + 防枚举:强制 / 可选 / 按时段分级三种模式;注册链接可带
?invite=CODE预填;
独立的预校验端点(POST + 令牌 + 签名 Cookie 节流 + 模糊文案)——
「不存在 / 已撤销 / 已封禁 / 已过期 / 名额已满」回的是同一句话,不给可枚举的差异。
不新增任何落地路由,注册仍然走核心的注册页。- 阶梯奖励 + 逐笔对账:奖励按「第 n 位受邀人」分档(如
1:10,5:6,99:3);
产生邀请时先记冻结,被邀请人过门槛(注册满 N 天 + 积分门槛)才解锁发放给邀请人;
发放前确认邀请人账号存在,不存在就记核销(绝不假发放)。
账本 append-only,后台实时给出三桶(冻结总额 / 已发放 / 已核销)与两条对账恒等式,
并额外与邀请关系表做一次独立对账。- 邀请树 + 防刷 + 申诉:二级只读邀请树(每层一条批查,查询数与人数无关);
同 IP / 同设备指纹 / 短时多注册累计风险分,超阈值自动停用(封)该邀请码;
邀请人与被邀请人双方都可以申诉,邀请人与管理团队可裁决,全程写审计留档。默认不改动全站积分
装上去一分都不发:积分轨默认关闭、阶梯默认空。奖励要在后台显式打开并配置阶梯,
写路径、冻结、解锁、核销与对账完全一致。IP 与设备指纹只存加盐哈希,后台可一键清空。与同类插件共存
站点若同时启用
invite_code,本插件完整让路:不渲染自己的码字段、不校验、不落账 ——
同一张注册表里只有一个码字段、只有一条校验路径(对方停用后自动恢复)。数据与兼容
6 张自有表(邀请码 / 邀请关系 / 账本 / 周期配额 / 风控 / 审计)+ 8 枚具名索引;
安装幂等、卸载连索引与运行数据一并清干净;兼容 PHP 8.1+ 与 SQLite / MySQL / PostgreSQL。验证
tools/lab_verify_invite_system.sh:322 项断言 / 0 失败(15 节,含「停用 / 未装时注册路径逐字节不变」
与「与 invite_code 同装共存探测」)。六道静态门禁全绿。查询预算实测:
注册页 +0 / 预校验端点 1(节流命中 0)/ 邀请中心 4 / 邀请树 3 / 后台 5 / 侧栏入口 0。插件质量报告
插件:
invite_systemHook 功能范围 循环 使用频率 文件读写 修改系统表 读写系统表 读写自己的表 sidebar.feature_links 首页/侧栏快捷功能 否 5 - - - - security.rate_allow 注册/登录等限流检查 否 4 - - - 写 plugin_invite_system_codes, plugin_invite_system_settle_runs;读 plugin_invite_system_grants register.form_extra 注册表单 否 3 - - - 写 plugin_invite_system_codes, plugin_invite_system_settle_runs user.after_save 用户注册/资料保存后 否 3 - - - 写 plugin_invite_system_codes, plugin_invite_system_audit, plugin_invite_system_ledger, plugin_invite_system_risk, plugin_invite_system_settle_runs;读 plugin_invite_system_grants user.before_save 用户注册/资料保存前 否 3 - - app_users 写 plugin_invite_system_codes, plugin_invite_system_settle_runs 颜色说明:黄色表示有数据读写,红色表示 Hook 在系统循环中执行,浅蓝色表示有文件写入。“列表跳过”表示回调在列表路径会提前返回,“回调内”表示操作位于回调自身或其帮助函数的循环体内。“文件批处理”表示逐个处理用户一次提交的文件,属于必要操作,不标记修正。只有操作实际处于需要优化的循环路径时,才会标记“修正❗️”。
数据字典
plugin_invite_system_settle_runs字段 类型 可空 默认值 约束 - 动态定义 - - 无法静态解析 plugin_invite_system_codes字段 类型 可空 默认值 约束 - 动态定义 - - 无法静态解析 plugin_invite_system_grants字段 类型 可空 默认值 约束 - 动态定义 - - 无法静态解析 plugin_invite_system_ledger字段 类型 可空 默认值 约束 - 动态定义 - - 无法静态解析 plugin_invite_system_quota字段 类型 可空 默认值 约束 - 动态定义 - - 无法静态解析 plugin_invite_system_risk字段 类型 可空 默认值 约束 - 动态定义 - - 无法静态解析 plugin_invite_system_audit字段 类型 可空 默认值 约束 - 动态定义 - - 无法静态解析 版本 1.0.0 更新:
【1.0.0 补图 + 文档收口】边界项收口轮- 新增第 5 张预览图:管理团队视角的邀请树 + 裁决表单 —— 同一条邀请记录由被邀请人真实申诉后进入
「申诉中」,管理团队在这一页看到「改判:回到待解锁 / 维持原判」下拉、裁决理由输入框,以及分支冻结 / 解冻入口。
原有 4 张(邀请中心 / 注册页预填与预校验 / 后台逐笔对账 / 邀请人视角邀请树)保持不变,新图排在最后。- README 新增两节清单(源码零改动,1.0.0 字节不变):
① §八「同装共存清单(invite_code)与并发 / 节流参数」:7 条共存规则(让路判据 / 只采信令牌有效的 POST /
共存期间 6 张表一行不写 / 钩子不抢名 / 停用即恢复)+ 名额 CAS 并发契约(3 worker 打 1 个名额不超卖、
输家不谎报)+ 全部节流与风控参数表(预校验签名 Cookie 节流 60 秒 / 10 次、注册频率闸默认关、
同 IP 2 分 / 同设备 3 分 / 同码短时 2 分、风险分 ≥7 自动封码、哈希可一键清空、只标注不处置)。
② 参数表逐条给出默认值、语义与超限行为(超限时预校验端点连那 1 条查询都不发)。版本 2.0.0 更新:
invite_system 2.0.0
第一次大更新:四项新能力 + 六处真缺陷修复 + 结构自愈。
新能力
- 活跃门槛:解锁除「注册满 N 天 + 被邀请人积分」外,还能要求被邀请人真的发过内容(主题 + 回帖合计 ≥ N)。
积分在本站可以白拿(签到 / 游戏 / 红包),默认门槛对僵尸号同样成立 —— 这是上一版防刷叙事里唯一的空洞。
结算回执会明确写出「还被活跃门槛(发过 N 条内容)挡着 M 笔」,奖励继续冻着,不发也不没收。- 批量签发 + CSV 导出:一次建一批码(1–20 个,共用名额 / 有效期 / 批次名),配额按整批一次扣减
(不够就一个码都不建),一条多行 INSERT 落库;
?a=invite_system_export把码与邀请链接导成 CSV
(字段按 CWE-1236 中和公式注入)。- 逐码下钻对账
?a=invite_system_code&id=N:这个码带来了谁(含风险标注)、这个码的账本逐笔
(冻结 / 发放 / 核销 / 改判回池)、本码三桶小对账与两条恒等式,恒定 4 条语句,与人数 / 笔数无关。
- 发放通知:结算发放后给邀请人一条站内通知,被邀请人注销导致核销时也通知一声(可关)。
修复的真缺陷
- 解冻分支在「冻结时没有任何可用码」时生成
IN ():SQLite 恰好接受,MySQL / PostgreSQL 是语法错误 →
PDOException → 核心会把整个插件自动停用。现在解冻不再拼动态 id 列表。
- 配额「先检查后自增」不是 CAS:实测 3 个并发建码在限 1 的情况下建出 3 个码。现在守卫与自增进同一条 UPDATE。
- 冻结标记写在有 500 字节上限的审计文案里:实测 90 个码被截成 70 个 → 解冻后 20 个码永久停用。
现在标记打在码行自己身上(新列
frozen_at),审计只写人类可读摘要。- 注册频率闸数错了行(数的是「风控记分行」,只在风险分 > 0 时才写):实测
rate_limit=1仍放行第 2 次注册。
现在数本插件真实的注册行。
- 名额抢到但邀请关系落空时名额被白烧:现在补偿回滚 + 一条
slot_leak审计。 - 覆盖文件升级(不跑 install)会因缺列被核心整插件停用:现在所有会碰库的入口先做一次结构自愈
(补列 + 补索引 + settings 标记,稳态 0 条查询),
install走同一份定义 —— 覆盖升级 / 在线更新 / 重装三条路都安全。其它
- 邀请中心与「逐码明细」页入口打通;后台新增活跃门槛、通知开关、批量上限三项配置。
- 验收套件扩到 411 项断言 / 0 失败(新增 §15 新能力、§16 缺陷回归两节,含真并发与掉列自愈的实测)。
版本 2.1.0 更新:
invite_system 2.1.0
把「并发守恒」从说法变成实测:两处真缺陷 + 三项实测 + 两项新能力。
修复的真缺陷(都是真并发/真升级跑出来的)
- 配额 CAS 的守卫是「空守卫」(2.0.0 引入,本轮实测揪出):守卫写成
codes_issued + ? <= ?这种表达式比较,
比较的两边都不是列,SQLite 的列亲和没有作用面;而绑定参数是按 TEXT 送进来的,比较退化成「数字 vs 文本」,
SQLite 的规则是「数字永远小于文本」—— 于是守卫恒真、一次都没拦人。
实测:同一进程顺序连打 3 次建码,rowCount()三次都是 1;5 个进程真并发抢 1 个配额,5/5 全部中标。
修法:守卫里的增量与上限全部写成整数字面量(不经绑参),比较回到纯数字,三种驱动行为一致。- 「行刚被别人建好」被当成「配额不足」(丢发):并发第一次建码时,插行抢输的那一路其实只是
「别人刚把行建好」,配额一分没扣,却被回了一句「本周期配额不足」。现在插入失败后再 CAS 一次再下结论。
实测(三项,都有可复核的断言)
- 名额 CAS 与批量签发的真并发守恒:单人抢 1(5 路并发建码,
quota_codes=1→ 恰好 1 个码、1 条审计,
多轮取最坏值);多人抢 1(5 路并发注册抢 1 个名额 →
slots_used=1、恰好 1 条非核销邀请关系、
注册成功的人一条邀请关系都不缺);批量签发并发(3 路各批 4 个:quota_codes=4→ 恰好 4 个且没有半批;
quota_codes=6→ 同样恰好 4 个,一批都不半建)。- 奖励账本守恒:邀请人注销(全记
void核销、全站积分一分没动、留审计)、重复结算(再跑两轮账本一行不多)、
并发结算(3 个 worker 同时跑同一段结算代码 × 3 轮:每轮 5 笔发放 + 1 笔核销不重不漏,
各 worker 的发放/核销笔数合计 = 真实笔数)。三种情况下
Σ账本 = 冻结总额 − 已发放 − 已核销都成立(含void核销路径与与邀请关系表的独立对账)。- 升级路径实测:用真 1.0.0 产物建老库并造历史(1 个码 / 3 条邀请关系 / 3 笔冻结),
删掉 2.0.0/2.1.0 的增量列、增量索引、新表与结构标记,然后只覆盖 2.1.0 文件(不点启用、不跑 install)——
一发请求即自愈:补列、补表、补索引、写回标记,插件不被核心停用;邀请关系 / 账本 / 邀请码三张表的
逐行指纹与覆盖前完全一致,老数据仍对得上三条恒等式。新能力
- 邀请码二维码分享卡
?a=invite_system_card&id=N:把邀请链接做成一张能扫码、能截图、能打印的卡 ——
邀请码、链接、剩余名额、有效期、已带来几位受邀人,外加一枚内联 SVG 二维码,恒定 2 条语句。
二维码是本插件自己实现的编码器(字节模式 / 纠错等级 M / 版本 1–10,按 ISO/IEC 18004 打分选掩码),
不请求任何第三方、不引任何 JS 库、不写临时文件(把链接发去外部二维码服务等于把邀请码交给第三方)。
正确性:套件把页面上的 SVG 还原成矩阵独立校验(静默区 / 定位图案 / 定时图案 / 格式信息 BCH 与纠错等级),
并与参考实现segno逐模块比对全等(8 种掩码里恰好 1 种命中)。- 结算运行日志(新表):每轮结算一行 —— 到期 / 发放笔数与金额 / 核销笔数与金额 / 两个门槛各挡住几笔 /
耗时 / 触发者;没有到期笔数时不落行。后台新增「结算轮次」(最近 8 轮)。
它让「Σ账本为什么变了」对得上「哪一轮结算做了多少笔」;并发结算时每个 worker 各写一行,合起来恰好覆盖 N 笔。其它
- 邀请中心每一行与逐码下钻页都加了「分享卡」入口;后台新增「结算日志保留天数」配置(默认 90 天,0 = 不清理)。
- 验收套件扩到 528 项断言 / 0 失败(新增 §18 真并发守恒、§19 账本守恒、§20 升级路径实测、§21 新能力四节)。
- 配额 CAS 的守卫是「空守卫」(2.0.0 引入,本轮实测揪出):守卫写成
版本 2.2.0 更新:
2.2.0 · 准入与裁决正确性- 修复一(强制邀请码可被绕过):共存探测里有一条「采信请求体里的邀请码字段就让路」的兜底 —— 令牌不是屏障(访客自己取一张表单令牌即可),于是任何人只要在注册时多提交一个字段,就能让本插件在注册校验处完整让路,
enforce模式的邀请准入被跳过。该兜底已删除:只认已启用插件清单。 - 修复二(裁决把状态改错):申诉审计里写的是中文标签,而裁决读取端按数字匹配 ⇒ 永远读不到「申诉前是已核销还是冻结中」,一律按「已核销」处理:
维持会把「冻结中」静默改成「已核销」却不写核销账;改判会凭空多写一笔回到冻结池的账,并绕过解锁天数门槛。现在写入端同时写数字与标签,读取端兼容历史行。
- 修复一(强制邀请码可被绕过):共存探测里有一条「采信请求体里的邀请码字段就让路」的兜底 —— 令牌不是屏障(访客自己取一张表单令牌即可),于是任何人只要在注册时多提交一个字段,就能让本插件在注册校验处完整让路,