[nb_avatar]NB头像生成热
- NB头像生成ID nb_avatar版本 2.2.0插件制作者 NB免费2302 行 / 154.8 KBHook / 路由 / 后台页统一使用 NB 生成头像,支持会员选择候选头像,管理员可批量接管、修复或重新生成会员头像。app/plugins/nb_avatar/plugin.php开发日志已有 2 条
个人独立维护项目。
主楼 插件质量报告
插件:
nb_avatarHook 功能范围 循环 使用频率 文件读写 修改系统表 读写系统表 读写自己的表 avatar.url 头像 URL 生成 是 4 读 修正❗️ - - - user.after_save 用户注册/资料保存后 否 3 读写 app_users app_users - user.before_save 用户注册/资料保存前 否 3 读 - - - avatar.picker 用户资料头像选择器 否 2 读 - - - content.before_delete 内容删除操作 回调内 2 读写 修正❗️ - - - site.closed_allow 站点关闭访问豁免检查 否 2 - - - - admin.tabs 后台管理页标签栏(展示位置:后台Tab) 否 1 - - - - 颜色说明:黄色表示有数据读写,红色表示 Hook 在系统循环中执行,浅蓝色表示有文件写入。“列表跳过”表示回调在列表路径会提前返回,“回调内”表示操作位于回调自身或其帮助函数的循环体内。“文件批处理”表示逐个处理用户一次提交的文件,属于必要操作,不标记修正。只有操作实际处于需要优化的循环路径时,才会标记“修正❗️”。
数据字典
未检测到插件数据表声明。
灵感源自:https://github.com/wave-charts/avatar-gen
内置到插件,注册时启用项目生成一张随机图给用户作为头像,风格与 ns 默认头像应该是一致的。点赞与点评1bbs1org投币2026-08-18
看起来不错
🔍 插件审查报告(对照《AI 开发规则》与开发者文档)
🔒 安全问题
未发现明显问题。鉴权/CSRF:nb_avatar_action(plugin.php:1863-1888) need_login+require_post;nb_avatar_admin_action(1890-1906) need_admin+require_post;均经核心 check() 的 _csrf 校验,只操作 uid(),无 IDOR。头像路由 nb_avatar_avatar(1777-1818):v 限 ^[0-9a-f]{20}$ 且 hash_equals 文件 SHA256 前 20 位(1781-1794);落盘解密校验 magic/nonce/secretbox(1312-1326);响应头 CSP sandbox+nosniff+X-Frame-Options DENY(1803-1808)。路径不可穿越:目录/文件名由 int uid 经 sha256+2 位分片生成(1281-1295)。SVG 白名单消毒(1478-1499)、颜色校验(1454)、禁外部引用;动态输出全部 h()。site.closed_allow 仅放行 nb_avatar_avatar(1820-1823),范围合理。小瑕疵:content.before_delete(1853-1861) 在核心 tx() 内删文件,unlink 失败会连带回滚用户删除(index.php:2571-2585)。
⚡ 性能问题
- 注册同步生成头像(1833):每次约 10 次 DOM 解析+gzdecode+sodium+落盘,拖慢注册。
- avatar.url 每次渲染首调 hash_file 全文件取版本(1328-1350),请求内缓存但无跨请求缓存,多用户列表页重复读文件;无 DB 查询/N+1。
- backfill 限量 50/批、游标单查询无 N+1(46、1623-1626),但单次 POST 同步生成 50 个(1642)可能超时。
🐛 功能/规范缺陷
- 标记碰撞:marker_seed 仅 dylan 的 1..48(1352-1360),核心把空 style/seed 归一化为 dylan+uid 派生 seed(index.php:1745-1746),故「标记」对所有默认用户恒真,仅靠文件存在区分,脆弱。
- 覆盖自选头像:backfill(1620-1660)与注册(1829-1837)只查文件(1637),不查已有 avatar_style/seed,mark_user(1592-1596)会把自选像素风等改成 dylan+标记。
- 跨插件 function_exists('avatar_upload_profile_html')(1910) 依赖另一插件,违反「插件间不互相调用」。
- 76 个素材以 base64+gzip var_export 内联(1167-1248),无再生成脚本,上游更新维护成本高。
- 删除/卸载只清文件,遗留空分片目录(1712-1721)。
(授权完整:MIT 全文 5-27、CC BY 4.0 署名+链接 29-33、commit 35、credits 路由 1925-1932、SVG metadata 1543;前缀/两参签名/assets/description/version 均合规。)
✅ 修复优先级
P1:生成/补生成前检查已有自选头像,避免覆盖(1620-1660、1829-1837);改用不可碰撞标记。P2:注册改懒生成/队列(1833);版本改 mtime+size 或 sidecar 缓存(1339)。P3:移除跨插件 function_exists 守卫(1910);补素材再生成脚本;按需调小 backfill 批次。
点下载显示插件版本未识别
个人设置直接接管原生头像选择器,只显示 48 个 NB头像,系统头像不可再选。
删除 credits 页面及相关入口。
后台增加使用规则、批量扫描、异常修复、单会员接管和重新生成。
增加损坏头像、缺失/非法变体文件的自动修复。
增加服务端查询长度校验,收紧头像预览脚本选择器。
重建 BBS1 插件 CSS/JS 资源。🔍 插件审查报告(AI 自动审查,对照《AI 开发规则》与开发者文档;本插件未被 8/18 楼上 350 的报告覆盖,属独立首次审查)
插件:NB头像生成(nb_avatar)v2.2.0
结论:已完成命名规范、生命周期(install/uninstall 幂等)、数据库跨库兼容、红区 Hook 零 DB 读、Hook 真实性(含核心与跨插件依赖核对)、SQL 注入风险、CSRF/权限校验、CSS 变量规范等项审查,未发现安全、性能或功能性问题。