dsh-data-lifecycle:静态检查数据留存期限与过期清理路径

前言

业务系统里常见三类「数据只进不出」:库表、日志、上传目录一直在涨,文档里却说不清留多久;配置里写了 expireAfterDays: 3650 这类超长期限;代码里全是 INSERT 和落盘,找不到 purge、过期删除或定时清理。合规讨论里,dsh-cn-log-retention 关心的是日志是否满足法定下限(例如是否留够 6 个月);另一类问题是「各类数据留多久、到期有没有人删」——这正是数据生命周期检查要看的空白。

下面介绍 DSH 插件 @deepwhale-cn/dsh-data-lifecycle(仓库 feely0208/dsh-data-lifecycle)。它在项目源码与配置上做静态扫描,描述事实并给出规则命中位置,不下「违规」结论,也不替你删数据。

这是什么

维护者:feely0208。npm 包名 @deepwhale-cn/dsh-data-lifecycle,当前版本 0.1.0,许可证 MIT。分类属于 admin-security(管理与安全向检查)。

是:针对「数据留存」三处空白做静态检查——① 有数据落地却找不到成文留存期限;② 期限写成 3 年以上(1095 天 / 36 个月,expireAfterDays: 3650 等也算);③ 有写入路径却找不到清理 / 过期删除实现。另有弱信号:定时任务里没有清理项、表结构缺少 expires_at / deleted_at 等字段。

不是:运行时清理工具;数据分类分级(见 dsh-data-classify);专查「日志是否留够 6 个月」(见 dsh-cn-log-retention);用户行使删除权(见 dsh-data-rights)。一句话分界:dsh-cn-log-retention 查「留够没」,本插件查「留太久 / 该删没删」。

纯前端、纯工具库、没有数据库 / 日志 / 上传等落地痕迹时,带「适用前提」的前几条规则不会误报。

核心功能:五条规则

每条命中会给出文件、行号、该行内容,以及依据的法条来源(可自行核对原文条款)。

规则 ID 查什么 级别
LIFE-NO-RETENTION-POLICY 有数据落地,却找不到任何成文的留存期限规定 高
LIFE-RETENTION-TOO-LONG 留存期限写成 3 年以上 / 1095 天以上 高
LIFE-WRITE-NO-PURGE 有写入路径,整份代码里找不到清理 / 过期删除实现 高
LIFE-SCHEDULE-NO-CLEANUP 有定时任务,但任务里没有一个是清理 中
LIFE-SCHEMA-NO-EXPIRY-FIELD 建表 / 模型里没有 expires_at / deleted_at 等字段 低(弱信号)

README 中与个保法、网络安全法等相关的对照关系(摘录自官方文档,便于和兄弟插件分工):

dsh-cn-log-retention  = 日志留存够不够 6 个月(法定下限,网络安全法第 21 条)
dsh-data-lifecycle    = 各类数据留多久、到期有没有人删(个保法第 19 / 47 条)
dsh-data-classify     = 数据分没分级、有没有台账
dsh-data-rights       = 用户来要求删除时,删不删得掉
dsh-pipia             = 影响评估报告本身要不要留三年(个保法第 56 条)

安装与启用

需要 Node.js >= 18,DSH 引擎 >=0.1.0-rc.6 <0.3.0。官方安装命令如下:

dsh plugin --profile web add @deepwhale-cn/dsh-data-lifecycle

插件以当前 DSH 进程权限读取你指定的项目目录。安装前请自行查看 GitHub 仓库 源码与 MIT 许可证,确认符合你的安全与合规流程。

典型用法

安装后通过命令 dsh-data-lifecycle 调用(见 package.json 的 bin 配置)。

1、扫当前工作目录下的项目:

dsh-data-lifecycle

2、扫指定根目录:

dsh-data-lifecycle --root /path/to/project

3、查看内置演示(「只往库里写、从不删、也没写留存期限」的会员中心样例):

dsh-data-lifecycle --demo

4、列出规则与依据:

dsh-data-lifecycle --list-rules

5、生成 HTML 报告:

dsh-data-lifecycle --root /path/to/project --html report.html

演示样例里会看到什么

--demo 中的会员中心有 package.json、表结构、上传接口、日志和每日定时任务,但缺少「让数据消失」的设计。README 记载的命中形态包括:多处找不到写明留存期限;src/media/expiry.js 中 expireAfterDays: 3650;有写入却无 purge;jobs/nightly-report.js 的 cron 做日报而非清理;迁移 SQL 建表无 expires_at / deleted_at。

对照通过样本在 tests/fixtures/pass/clean-project/:README 有留存期限表,config/retention.yml 写 180 / 90 天,jobs/purge-expired.js 每日 03:00 清理,表含 expires_at——预期 0 命中。

适用场景与注意

适合:在改架构或补合规文档前,对后端 / 全栈仓库做一次「留存策略有没有写、删没删的路径有没有」的快速摸底;与 dsh-cn-log-retention、dsh-data-classify、dsh-data-rights 等同系列插件搭配,覆盖链式安全问题。

边界(README 明确说明):

  • 只做静态检查。清理若在对象存储生命周期、数据库分区、DBA 脚本等部署层完成,扫描看不见,仍可能提示你人工确认。
  • 主要识别 retention / expire / purge / cleanup 等常见命名;自创函数名可能漏检。
  • 不看运行时:数据是否真删、备份是否仍保留,需你自己的运维与流程保证。
  • 命中结果是提示确认,不是判定违规;依法需长期保存的情形应在文档中写明依据。

链接

DSH 生态强调「一切皆插件」;社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。本插件属深鲸网安守护系列中的「数据与凭据」方向之一,可与同维护者其他 guard 插件组合使用。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜