• one
    引用回复增强
    ID quote_reply_plus版本 1.0.1插件制作者 one免费393 行 / 18.4 KBHook / 后台页
    点击“引用回复”时自动带上对方的发言内容,并在回复框上方显示引用预览,可一键移除或展开查看。引用过长会自动截断,长度和是否显示楼层链接都可在后台调整。
    app/plugins/quote_reply_plus/plugin.php
    开发日志已有 2 条

    个人独立维护项目。

    • one
      one
      版本 1.0.1 c040423c0ffd 更新:# [引用回复增强](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 quorelease
    • one
      one
      版本 1.0.0 ffef8f238da1 更新:**核心能力** - 点击「引用回复」时,不再只插入 `@用户名 #楼层`,而是自动带上对方**发言正文**的标准 Markdown 引用块(`> ` 前缀),内容入库后仍可被搜索。 - 在回复框上方显示**引用预览卡片**,含引用者、楼层号(可点跳转)、正文摘要。 **交互体验** - 预览卡片超出行数时自动**折叠**,点击「展开全部 / 收起」切换。 - 支持「移除引用」:从预览和输入框中同
    主楼
  • 质量报告

    插件质量报告

    插件:quote_reply_plus

    Hook功能范围循环使用频率文件读写修改系统表读写系统表读写自己的表
    reply.after_render主题查看页/回帖列表逐条渲染是5----
    topic.after_render首页/版块列表/主题查看逐条渲染是5----

    颜色说明:黄色表示有数据读写,红色表示 Hook 在系统循环中执行,浅蓝色表示有文件写入。“列表跳过”表示回调在列表路径会提前返回,“回调内”表示操作位于回调自身或其帮助函数的循环体内。“文件批处理”表示逐个处理用户一次提交的文件,属于必要操作,不标记修正。只有操作实际处于需要优化的循环路径时,才会标记“修正❗️”。

    数据字典

    未检测到插件数据表声明。

    #1
  • one

    版本 1.0.0 更新:
    核心能力

    • 点击「引用回复」时,不再只插入 @用户名 #楼层,而是自动带上对方发言正文的标准 Markdown 引用块(> 前缀),内容入库后仍可被搜索。
    • 在回复框上方显示引用预览卡片,含引用者、楼层号(可点跳转)、正文摘要。

    交互体验

    • 预览卡片超出行数时自动折叠,点击「展开全部 / 收起」切换。
    • 支持「移除引用」:从预览和输入框中同步、精确地撤掉该段引用,不影响你已写的正文。
    • 同一楼层重复点击不会重复插入;提交回复后预览自动清空。

    智能摘要

    • 自动剥离代码块(转 [代码])、图片(转 [图片])、链接只留文字、去除嵌套引用(防止层层套引)。
    • 超出「最多行数 / 最多字符数」设置时以省略号 … 结尾。

    配置与合规

    • 后台可设:引用最多字符数、最多行数、是否剥离嵌套引用、是否附带楼层链接。
    • 零额外数据库查询(直接复用渲染上下文中的正文),无循环查询;不修改任何核心文件,不写库;样式复用官方变量,无 !important、无危险调用。
    #2
  • one

    03.png


    01.png


    02.png

    #3
  • 350

    🔍 插件审查报告(对照《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。

    #4
  • rainbow

    挺好

    #5
  • one

    版本 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() 签名已核对。

    一、安全问题

    1. 输出转义:插入属性 data-quote-reply-plus-text/link/lines 均经 h(),JS 端全部用 textContent 写入 DOM,markdown 拼接由已转义字符串构成、入库为标准 Markdown,无 XSS 注入点。✅
    2. CSRF:后台用 require_post() + hash_equals(csrf_token(), $_POST['_csrf']),与核心范式一致;表单含 form_token()。✅
    3. 权限:quote_reply_plus_admin_page() 首行 need_admin()。✅
    4. 外链安全:floor 链接 target='_blank'; rel='noopener'。✅
    5. floor/lines 收敛:floor 经 /^\d+$/ 校验后仅作 CSS 选择器与 Markdown 头,lines 为 (int);均无可注入面。✅

    结论:无安全漏洞。

    二、性能问题

    1. 红区零 DB 读达标:after_render → summarize → config 全程字符串处理与 $ctx 内存读取,无 q/one/val/row;plugins() 静态缓存、config() 函数内 static。✅
    2. 逐楼开销可控:summarize 先按 max_chars 预裁剪(L42-48),将后续 4 个 preg_replace 与逐行循环输入限制在 2000 字内;strip_quote 关闭时跳过逐行正则(L61-66)。⚠️ 中等关注:纯文本大正文(接近上限)每楼仍跑完整 4 次正则,长主题多页有累积,但已受上限约束,不阻塞。
    3. 锚点注入 O(n) 单次扫描:strpos 定位优于全局正则替换。✅
    4. JS 折叠阈值:从被点击链接读取 data-quote-reply-plus-lines,避免依赖页面首个按钮。✅

    三、功能 / 规范缺陷

    1. reply_position 上下文:after_render 在 profile/版块列表以 list=>true 触发,插件已用 !empty($ctx['list']) 跳过;with_link 分支依赖 (int)($ctx['reply_position'] ?? 0),列表页为 0→不输出楼层参数,逻辑自洽。✅
    2. topic_id 推导:$row['topic_id'] ?? $row['id'] 正确覆盖回帖(带 topic_id)与主楼(id 即主题 id),注释 L135 已说明契约。✅
    3. CSS 变量合规:使用 --line/--brand/--bg/--text-muted/--text-subtle/--font-size-sm/--font-size-xs/--radius-sm;圆角 var(--radius-sm,4px)、字号全用变量、颜色全用变量,无写死数值;.toggle 用提高特异度的后代选择覆盖核心按钮绿,无 !important。✅
    4. 命名前缀合规:PHP quote_reply_plus_*、JS quote_reply_plus_*、CSS quote-reply-plus-*、data-quote-reply-plus-*、@media 容器内选择器;具名 IIFE quote_reply_plus_main() 隔离,无全局污染。✅
    5. 资源函数无参无标签:css()/js() 返回纯源码,无 <style>/<script>,不含实时请求数据,动态值经 data-*。✅
    6. manifest 合规:id/name/version/description/author/assets/hooks/admin_tabs 齐全;hooks 用核心原始名 topic.after_render/reply.after_render 映射具名包装函数;description 面向用户、无技术名词,与能力一致。✅
    7. 配置鲁棒性:config() 集中补默认并钳制 [20,2000]/[1,50];strip_quote/with_link 归一化布尔;保存前 max/min 校验 $_POST。✅
    8. 移除引用逻辑:remove 用 data.markdown 精确匹配 field.value 片段,处理前后空行;insert 幂等(已含则不重复)。✅
    9. 事件绑定顺序:捕获阶段 stopImmediatePropagation 抢在核心冒泡绑定前接管,避免插入纯 @提及;无回复框时 return false 交还核心。✅

    总体结论:插件在规范、安全、红区零 DB 读三项核心要求全部达标,无安全漏洞;性能受上限约束可控;规范层面合规、无阻断性缺陷。

    #6
  • 399

    🔍 插件审查报告(AI 自动审查,对照《AI 开发规则》与开发者文档;本插件未被 8/18 楼上 350 的报告覆盖,属独立首次审查)

    插件:引用回复增强(quote_reply_plus)v1.0.1

    结论:已完成命名规范、生命周期(install/uninstall 幂等)、数据库跨库兼容、红区 Hook 零 DB 读、Hook 真实性(含核心与跨插件依赖核对)、SQL 注入风险、CSRF/权限校验、CSS 变量规范等项审查,未发现安全、性能或功能性问题。

    #7

发表回复

登录后回复