- 引用回复增强ID quote_reply_plus版本 1.0.1插件制作者 one免费393 行 / 18.4 KBHook / 后台页点击“引用回复”时自动带上对方的发言内容,并在回复框上方显示引用预览,可一键移除或展开查看。引用过长会自动截断,长度和是否显示楼层链接都可在后台调整。app/plugins/quote_reply_plus/plugin.php开发日志已有 2 条
个人独立维护项目。
主楼 插件质量报告
插件:
quote_reply_plusHook 功能范围 循环 使用频率 文件读写 修改系统表 读写系统表 读写自己的表 reply.after_render 主题查看页/回帖列表逐条渲染 是 5 - - - - topic.after_render 首页/版块列表/主题查看逐条渲染 是 5 - - - - 颜色说明:黄色表示有数据读写,红色表示 Hook 在系统循环中执行,浅蓝色表示有文件写入。“列表跳过”表示回调在列表路径会提前返回,“回调内”表示操作位于回调自身或其帮助函数的循环体内。“文件批处理”表示逐个处理用户一次提交的文件,属于必要操作,不标记修正。只有操作实际处于需要优化的循环路径时,才会标记“修正❗️”。
数据字典
未检测到插件数据表声明。
版本 1.0.0 更新:
核心能力- 点击「引用回复」时,不再只插入
@用户名 #楼层,而是自动带上对方发言正文的标准 Markdown 引用块(>前缀),内容入库后仍可被搜索。 - 在回复框上方显示引用预览卡片,含引用者、楼层号(可点跳转)、正文摘要。
交互体验
- 预览卡片超出行数时自动折叠,点击「展开全部 / 收起」切换。
- 支持「移除引用」:从预览和输入框中同步、精确地撤掉该段引用,不影响你已写的正文。
- 同一楼层重复点击不会重复插入;提交回复后预览自动清空。
智能摘要
- 自动剥离代码块(转
[代码])、图片(转[图片])、链接只留文字、去除嵌套引用(防止层层套引)。 - 超出「最多行数 / 最多字符数」设置时以省略号
…结尾。
配置与合规
- 后台可设:引用最多字符数、最多行数、是否剥离嵌套引用、是否附带楼层链接。
- 零额外数据库查询(直接复用渲染上下文中的正文),无循环查询;不修改任何核心文件,不写库;样式复用官方变量,无
!important、无危险调用。
- 点击「引用回复」时,不再只插入
🔍 插件审查报告(对照《AI 开发规则》与开发者文档)
🔒 安全问题
未发现明显问题。红区钩子 quote_reply_plus_after_render()(plugin.php:93-129)只读 $ctx['body']/$ctx['row'],全程无 q()/one()/外部请求;data-* 属性已转义(119 h($summary)、121 h($link)、120 (int)),无属性注入;JS 全部 createElement+textContent(190/194/210),无 innerHTML 拼接用户数据;正则处理输入为未渲染 Markdown、输出经 h(),去代码块/图片/链接只产出占位文本,无 XSS;admin POST 手动 hash_equals(csrf_token())(325)叠加核心全局 check();无 SQL、无越权——仅增强当前用户已可见帖子的引用按钮。
⚡ 性能问题
未发现明显问题。无 N+1、无循环查询;config static 缓存(13);钩子内零 DB、零网络。
🐛 功能/规范缺陷
- 健壮性(重点):plugin.php:124-128 用字符串 $needle='<a class="icon-action icon-quote quote-reply"' + strpos 把属性硬插进核心 quote_reply_action()(index.php:1904)的 HTML。默认 markdown_html 走 h() 转义不会误伤正文,但核心一旦改版按钮 class/结构即失效;若有 markdown.render 插件输出原始 HTML 则可能误插属性。建议改为通过 hook/ctx 传锚点而非拼接字符串。
- data.user 未校验(276):用户名含换行/特殊字符会使引用头 Markdown 畸形(仅文本,无安全风险),建议白名单或转义换行。
- 折叠口径不一致(轻微):CSS max-height:7.2em(142,约 4.5 行)与 JS 阈值 clip_lines(默认 6,158/216)不匹配。
- 硬编码间距/断点:margin/padding/gap 写死(136-146)、@media(max-width:520px)(148)。颜色/字号已用变量,建议收敛为变量。
- 小问题:admin 保存未 set_flash(332);is_post_request()+require_post() 冗余(323-324)。
- 规范项均达标:前缀正确、hook 真实存在且两参签名、assets 无参返回源码、description 用户可感知、author 一致。
✅ 修复优先级
无高危问题。① 将 124-128 的字符串 needle 注入改为更稳的锚点(或核心提供属性注入点);② 校验 data.user;③ 统一折叠口径与清理硬编码间距;④ 补 set_flash。
挺好
版本 1.0.1 更新:
[引用回复增强](1.0.1)审查报告 · 2026-08-19
依据
.ai-rules.md与开发者文档.md,对app/plugins/quote_reply_plus/plugin.php(393 行,v1.0.1)执行全量审查。对照核心契约:quote_reply_action()输出<a class="icon-action icon-quote quote-reply" href="#reply" data-username=… data-floor=…>;topic.after_render/reply.after_render为红区 Hook(调用链零 DB 读);topic_post_row()仅在主题页传入reply_position,列表/档案页仅带list=>true;route_url()/h()/form_token()/need_admin()签名已核对。一、安全问题
- 输出转义:插入属性
data-quote-reply-plus-text/link/lines均经h(),JS 端全部用textContent写入 DOM,markdown拼接由已转义字符串构成、入库为标准 Markdown,无 XSS 注入点。✅ - CSRF:后台用
require_post()+hash_equals(csrf_token(), $_POST['_csrf']),与核心范式一致;表单含form_token()。✅ - 权限:
quote_reply_plus_admin_page()首行need_admin()。✅ - 外链安全:
floor链接target='_blank'; rel='noopener'。✅ floor/lines收敛:floor经/^\d+$/校验后仅作 CSS 选择器与 Markdown 头,lines为(int);均无可注入面。✅
结论:无安全漏洞。
二、性能问题
- 红区零 DB 读达标:
after_render→summarize→config全程字符串处理与$ctx内存读取,无q/one/val/row;plugins()静态缓存、config()函数内static。✅ - 逐楼开销可控:
summarize先按max_chars预裁剪(L42-48),将后续 4 个preg_replace与逐行循环输入限制在 2000 字内;strip_quote关闭时跳过逐行正则(L61-66)。⚠️ 中等关注:纯文本大正文(接近上限)每楼仍跑完整 4 次正则,长主题多页有累积,但已受上限约束,不阻塞。 - 锚点注入 O(n) 单次扫描:
strpos定位优于全局正则替换。✅ - JS 折叠阈值:从被点击链接读取
data-quote-reply-plus-lines,避免依赖页面首个按钮。✅
三、功能 / 规范缺陷
reply_position上下文:after_render在 profile/版块列表以list=>true触发,插件已用!empty($ctx['list'])跳过;with_link分支依赖(int)($ctx['reply_position'] ?? 0),列表页为 0→不输出楼层参数,逻辑自洽。✅topic_id推导:$row['topic_id'] ?? $row['id']正确覆盖回帖(带topic_id)与主楼(id即主题 id),注释 L135 已说明契约。✅- CSS 变量合规:使用
--line/--brand/--bg/--text-muted/--text-subtle/--font-size-sm/--font-size-xs/--radius-sm;圆角var(--radius-sm,4px)、字号全用变量、颜色全用变量,无写死数值;.toggle用提高特异度的后代选择覆盖核心按钮绿,无!important。✅ - 命名前缀合规:PHP
quote_reply_plus_*、JSquote_reply_plus_*、CSSquote-reply-plus-*、data-quote-reply-plus-*、@media容器内选择器;具名 IIFEquote_reply_plus_main()隔离,无全局污染。✅ - 资源函数无参无标签:
css()/js()返回纯源码,无<style>/<script>,不含实时请求数据,动态值经data-*。✅ - manifest 合规:
id/name/version/description/author/assets/hooks/admin_tabs齐全;hooks用核心原始名topic.after_render/reply.after_render映射具名包装函数;description面向用户、无技术名词,与能力一致。✅ - 配置鲁棒性:
config()集中补默认并钳制[20,2000]/[1,50];strip_quote/with_link归一化布尔;保存前max/min校验$_POST。✅ - 移除引用逻辑:
remove用data.markdown精确匹配field.value片段,处理前后空行;insert幂等(已含则不重复)。✅ - 事件绑定顺序:捕获阶段
stopImmediatePropagation抢在核心冒泡绑定前接管,避免插入纯 @提及;无回复框时return false交还核心。✅
总体结论:插件在规范、安全、红区零 DB 读三项核心要求全部达标,无安全漏洞;性能受上限约束可控;规范层面合规、无阻断性缺陷。
- 输出转义:插入属性
🔍 插件审查报告(AI 自动审查,对照《AI 开发规则》与开发者文档;本插件未被 8/18 楼上 350 的报告覆盖,属独立首次审查)
插件:引用回复增强(quote_reply_plus)v1.0.1
结论:已完成命名规范、生命周期(install/uninstall 幂等)、数据库跨库兼容、红区 Hook 零 DB 读、Hook 真实性(含核心与跨插件依赖核对)、SQL 注入风险、CSRF/权限校验、CSS 变量规范等项审查,未发现安全、性能或功能性问题。


