未发布文章下面的留言,匿名访客能不能读到

📅 2026-10-09 👁️ 0

未发布文章下面的留言能不能被匿名访客读到,不看这篇文章有没有发布,而看读取留言的那个接口有没有单独判过一次可见性。常见的误解是「正文对外不可见,评论自然也不可见」——恰恰相反,正文和它挂载的评论、留言是两层各自独立的数据,父对象不可见并不自动让子对象不可见。一款主流程序在 2026 年 10 月的安全版本里专门修复了一条「私有与未发布文章的评论被未授权读取」的问题,就是这一层漏判的典型样本。

这类问题为什么出现在评论而不是正文

正文的可见性最容易做对:列表查询天然按状态过滤,草稿和待发布根本不会出现在对外列表里,直接访问未发布的正文地址也通常被拦在状态校验之外。麻烦在于评论是一套独立的记录,它们有各自的列表接口和详情接口。列表接口往往带着「只要已发布正文下的评论」这一层过滤,而详情接口常常只按评论自身的 ID 取数,不回查它所属的那篇文章此刻是什么状态。匿名访客只要拿到一个评论 ID,就可能绕过正文那道门。

父对象不可见时子对象该跟谁

原则只有一句:子对象不继承父对象的可见性,它要在被读取的那一刻重新查一次父对象的状态。落到判断顺序上,读一条留言应当先定位它属于哪篇文档,再看那篇文档是草稿、待发布、正式还是回收站,只有正文对外可见时,留言内容才随之返回。把这条顺序写反,就会出现「正文 403、留言 200」这种自相矛盾的结果。

只在校验列表漏掉校验详情会发生什么

列表和详情是两条代码路径,漏洞几乎总在被后写的那条上。

读取路径 是否回查正文状态 匿名可见 后果
评论列表(挂在已发布文章下) 是 仅已发布 符合预期
单条评论详情(按 ID) 常被漏 可能读到未发布正文下的留言 越权读取
待审核留言 是 + 审核态 否 需再过内容审核
草稿正文的预览 带预览参数 授权会话内 预览参数不传给留言接口

关键一行是第二行:详情接口只认评论 ID、不回查父文档状态时,未发布文章下的留言就成了公开的旁路。同一次修复里还包含评论管理页经待审评论触发的存储型 XSS,这提醒另一件事——留言不仅会被读到,还可能被写回管理界面执行,所以内容审核与敏感词过滤要在写入侧就生效。

站内的文档状态模型怎么表达可见性

安企CMS 把文档分成正式文档、草稿、待发布、回收站四种状态,草稿链接带预览参数可在授权会话里预览,删除正式文档是移入回收站而非物理删除。这套状态本身就是可见性判断的依据:任何读接口在返回内容前,都应把目标文档的当前状态作为前置条件,而不是假定调用方只会从对外列表点进来。

留言与评论接口该按哪三层收口

对照 API 调用面,留言和评论这类接口要过三道:第一道是父文档状态(是否正式、是否对外可见),第二道是子记录自身状态(是否已过审核、是否被标为垃圾),第三道是角色与权限(未登录能看已通过的,作者能看自己相关的,待审只给审核角色)。三层里最容易被省掉的是第二、三层对详情接口的复用。

自查三步

先造一篇待发布文档,在它下面留一条已通过审核的留言;再用未登录会话直接请求该留言的详情接口,看是空结果还是完整内容;最后核对同一接口对回收站、对未过审留言是否同样拒读。三步里只要第二步返回了内容,就是可见性判定漏在了详情这条路径上。

常见问题

问:把草稿正文地址藏起来不就行了吗? 答:不够。留言有独立的读取入口,即便没人知道正文地址,评论 ID 被枚举到就会暴露,收口要落在接口的状态校验上。

问:预览参数带上不就能看留言了? 答:预览参数服务的是正文预览,留言接口不认这个参数才是要检查的点——它认了反而扩大面,不认才符合「按文档状态判定」。

问:内容审核能挡住这类越权吗? 答:审核管的是留言内容能不能对外,越权管的是它属于的文章能不能对外,两件事要分别判,不能靠审核一道兜底。

相关文章

访问日志能记哪些字段,客户端传来的内容怎么写进去才安全

访问日志的字段是格式指令拼出来的,不是固定表结构。来源地址、请求行、状态码、耗时来自服务器侧,来路与客户端标识由请求方提供、可被伪造。写入客户端可控字段必须依赖转义:默认转义会处理双引号、反斜杠与控制字符,取不到值的变量记为连字符。日志按整站还是按路径配置,决定多站点场景能否分清责任。

2026-10-09

换了新域名之后,提交给搜索引擎的验证文件要不要重新放

要重新放。密钥与验证文件的作用是证明当前域名与主机的归属,绑定的是「现在这个站点」,不是当初上传的那台机器。换域名后应在新域名根目录或同一主机上可公开访问的文件夹重新放置并重新校验,同时把旧域名到新域名的 301 跳转、站点地图、站内链接推送队列分别重排——跳转关系和提交通道是两件事。

2026-10-09

多语言站点是整页翻译还是逐字段填,维护量差多少

整页翻译一次生成完整页面,人力省在初次生成,代价在后续要跟源页变更;逐字段人工填写更可控,人力花在每一处改动上。判断依据不是哪种更先进,而是改版频率与站点数量:源内容频繁变动的栏目适合逐字段,长尾文章与品牌站扩展适合整页生成后再校对,多站点共用一套后台时要先划清维护边界。

2026-10-09

找回密码的验证码,强度和错误锁定该怎么配

找回密码验证码、登录验证码和表单防机器人验证码要配的不是同一件事:找回类要的是随机来源足够、有效期短、错误次数锁定绑定同一入口;表单类要的是挡住批量提交,可交给 reCAPTCHA 这类交互验证。同行 CMS 在近版本更新里也按这个方向加固,把验证码改为 6 位安全随机生成并补上过期时间与错误次数锁定。

2026-10-09

给大模型的站点说明文件里,每条链接后面那句说明该写什么

面向大模型的站点说明文件里,整份只有项目名称那一处是必需的,其余段落按约定组织。每个链接条目的写法是方括号名称加圆括号地址,之后可选地跟一个冒号和一句说明。这句说明不该重复标题,而要写这页回答什么问题、给谁看、更新到哪一天;站点地图与关键词库负责另一半线索。

2026-10-09

AI 引擎要整站内容清单时,站点地图和模型说明文件各自给什么

站点地图和面向大模型的说明文件回答的不是同一个问题。站点地图是地址清单,给出 URL、最近修改时间与优先级,面向通用爬虫;模型说明文件是语义清单,用分组和每条摘要说明这页讲什么、给谁看,面向语言模型。两者都由系统自动生成,人工维护的是入口与摘要。

2026-10-09

编辑类账号能不能改动首页展示位,角色权限该按什么收口

作者或编辑能不能改首页展示位,按「能力影响范围」收口而不是按人头。影响全站展示的动作不该给投稿类角色。一款主流程序在 2026 年 10 月的安全版本里,把「作者角色可执行置顶文章」列为弱点修复。站内按用户组与分组权限设置可访问范围,高危全站级接口默认不对外开放。

2026-10-09

后台前端依赖库版本升级,算不算一项安全维护动作

后台自带的脚本库与上传组件也在攻击面上,判断一次依赖升级是不是安全动作,看它是否与漏洞修复写在同一次发版里、是否覆盖了已知漏洞区间。一款同行程序在 2026 年 9 月的版本里,就把后台 jQuery 与上传组件升级和「修复旧版本已知安全漏洞」写在同一则公告中。升级前先备份,升级后核对版本号与行为。

2026-10-09