后台留言批量删除接口按参数拼接,删除范围该怎么校验

📅 2026-10-12 👁️ 1

后台留言批量删除接口按参数拼接时,删除范围该怎么校验,答案不在前端传了哪些编号,而在服务端有没有重新算一遍范围。很多后台会把列表页勾选的多条记录连同它们的编号一起提交,接口拿到编号列表后直接拼进删除条件,看似省事,实则把判断删哪些的责任推给了调用方。前端传什么是可以被改写的,服务端如果照单全收,删除范围就失去了约束。

批量接口为什么把影响面放大

单条删除接口一次只处理一条记录,越界的后果通常局限在一条数据上。批量接口把多条记录的编号打包进同一个请求,一次误判就放大成一片。列表页勾选、全选、按筛选条件删除这些交互,天然会让一个请求携带成串的编号。编号越多,参数被篡改或被误解的空间越大:只要其中一段拼接没有约束,本该删除当前栏目的语句就可能顺带命中别的栏目、别的状态区间,甚至别人名下的数据。PbootCMS 在 V3.2.18 的更新记录里就修过这一类问题——后台留言的批量删除存在参数注入风险,修复方向是严格校验要删除的 id 列表,而不是信任前端传来的编号。这里的 id 指记录在数据库里的主键编号。

编号列表要按什么校验

校验要分两层。先校验单个编号本身:类型对不对,是不是预期里的整数主键,还是一段混着符号的字符串;格式干不干净,有没有被塞进额外的条件片段;数量在不在合理区间。PbootCMS 那个修复的核心也正是这一层,把 id 列表按类型和存在性逐条核对,非法的直接拒掉。再校验整批编号:每一个都得确认落在当前操作者有权访问的数据范围内,属于同一个栏目,属于同一状态区间,而不是混进跨栏目或跨权限的编号。存在性也要查,数据库里查不到的编号说明请求和数据对不上,应当拒绝整批或剔除后再报错,而不是拼接后交给删除语句。

删除范围为什么要服务端重新算一遍

前端传来的编号只是意图,不是授权。服务端不能拿编号当范围,而要拿当前会话的身份、权限、栏目归属去重新算出这次允许删除的集合,再和编号取交集。交集之外的编号,要么拒掉要么整批失败。这样即便有人在参数里塞进越界编号,服务端重新计算的这一步也会把它挡下来。范围校验还要求删除条件不能只靠编号列表拼接,应把归属条件一起带上,让数据库层面的过滤条件天然圈住能删的行。这里的 where 指删除语句里限定命中范围的过滤子句。

删错之后靠什么兜住

即便校验做到位,误删的风险也不能说归零:勾错、理解偏差、脚本异常都可能让范围之外的记录被删。所以删除接口需要一道兜底。常见的做法是不做物理删除,而是把记录先移入一个可恢复的位置,等确认无误再彻底清理。站内做法上,AnQiCMS 删除正式文档不是物理删除,而是移入「回收站」,删错了可从回收站恢复。这一条能力就到此为止:它兜住的是误删之后的可逆性,让一次范围判断的失误不至于立刻变成不可挽回的数据损失。

常见问题

问:批量删除只要前端已经限制了勾选范围,服务端还需要再校验吗?

答:需要。前端限制只是体验层的约束,参数在传输中可被改写,服务端必须把它当成不可信输入,重新算一遍允许删除的范围。

问:编号里混进一个非法值,是整批失败还是跳过它继续删?

答:更稳妥的是整批拒绝并报错,避免一半删除一半跳过造成状态不一致;确实要跳过的前提,是明确告知调用方哪些编号被剔除了。

问:回收站能替代范围校验吗?

答:不能。回收站兜的是删错之后的可逆性,校验挡的是删除范围越界本身,两者作用在不同阶段,缺一不可。

相关文章

模板标签输出了脚本开标签,内容怎么会被当成代码执行

PbootCMS修复过站点标签输出脚本开标签的风险并增强了标签页参数过滤——当可编辑内容带着开标签进入模板引擎,数据就会被当成代码执行。本文解释数据变成代码的那一步发生在哪、标签输出位为什么要过滤、HTML、属性、脚本、URL四种上下文为什么要分别转义,以及越靠前的过滤越省事的分层收口。

2026-10-11

图片处理库被列为攻击面,站点上传环节该收哪几道门禁

图片处理库在服务端解码用户上传的二进制内容,远程代码执行往往发生在解码器层而不是业务代码。PbootCMS在V3.2.22版本记录里把危险coder门禁、输入格式白名单与资源上限一起加入安全硬化,并修复了合法图片误判。本文按这三道门禁讲清站点上传环节该收的口子,以及收得太紧为什么会误伤正常图片。

2026-10-11

公告把示例功能整段移除以修掉资源分配问题,生产站该留演示代码吗

Drupal公告SA-CONTRIB-2026-215的评级只是Less critical,处理方式却把邮件示例功能整个移除,因为示例存在没有上限的资源分配问题。生产站要不要保留演示代码,判断依据应是暴露面而不是风险评级。本文拆解示例代码带出的三类风险、部署阶段的清理清单,以及保留演示入口时的限制办法。

2026-10-11

缓存过期后先给旧内容再后台更新,这个缓存指令解决什么

Cache-Control 的 stale-while-revalidate 允许在过期后的窗口期内先复用旧内容响应、同时后台向源站重新校验,把校验延迟从用户响应里隐藏。本文按 MDN 文档说明它与请求指令 max-stale、以及 no-cache 与 must-revalidate 的分工,并给出页面文档与静态资源分开设置的建议。

2026-10-11

网站挂在代理后面,登录锁定和黑名单为什么会认错来源地址

网站挂在反向代理后面时,程序读到的连接来源往往是代理地址,而转发头里的内容又由客户端可控,把两层混为一谈会让登录锁定和黑名单认错对象。PbootCMS 在 V3.2.25 的更新记录里修过无条件信任来源转发头的问题。本文讲两层地址各自的来历、只在可信链路里取最右可信值的做法,以及限速与锁定该用哪一层。

2026-10-12

页面里嵌第三方视频,iframe 的能力授权按什么放行

页面里嵌第三方视频涉及两层限制:来源域名按白名单放行,摄像头、定位、自动播放这些能力按最小集逐项授权。PbootCMS 在 V3.2.18 的更新记录里对可信视频域名保留默认来源策略,并对 allow 属性做了 token 白名单。本文解释内嵌框架为什么同时带着脚本与媒体能力、精确域与子域通配怎么分,以及放行与授权为什么要分开配。

2026-10-12

用户退出登录后浏览器里还留着旧数据,响应头怎么要求清除

退出登录时浏览器里留着的缓存和本地存储不会自动消失。Clear-Site-Data 响应头是给客户端的清除信号,可按项清缓存、凭据、存储与执行上下文,且只在加密连接里生效:凭据清到整个注册域,存储只清当前来源。站内登录态由 JWT 承载,客户端这一层本地数据要靠它配合收尾,公共设备上尤其值得加。

2026-10-12

浏览器会标出请求来自本站还是外站,服务端怎么据此挡住跨站请求

浏览器会给请求加上标明来源关系的几个 Sec-Fetch 请求头,前端脚本改不了它们。取值区分同源、同站、跨站与无发起方,服务端按这些关系决定放行还是拒绝,就能对跨站请求伪造做出一道与写操作确认互补的防线;这组头只在可信地址的请求里发送。本文讲四个取值的含义、按上下文放行的写法,以及它与回合级操作审批各自管什么。

2026-10-12