前言¶
教育类家校通、作业通知、成绩查询一类 App,功能上线前常被问的不是「模块是否齐全」,而是备案号在哪公示、班级排行榜能否公开、依赖里为何出现广告 SDK、适龄范围是否写明、测试数据里是否出现学籍号明文、儿童个人信息保护负责人是谁。这些问题多数能在代码、配置和文档里找到线索或缺口,但人工逐项翻仓库成本高,也容易漏项。
工信部 APP/ICP 备案有专门插件可查公示;教育移动应用备案(教APP备)、备案信息表、成绩排名展示、广告 SDK、适龄提示、学籍号与儿童个人信息保护负责人,则属于教育行业那几条「硬杠杠」。@deepwhale-cn/dsh-industry-education(GitHub:feely0208/dsh-industry-education)由维护者 feely0208 发布,归类为 admin-security,在 DSH 生态里做教育行业专项静态检查:只扫仓库内的代码、配置、文档与依赖清单,本地运行、不上传内容,命中时提示确认并附法条与证据说明,不下「合规 / 不合规」结论。
这是什么、不是什么¶
下面先划清边界,避免误用。
是:教育行业专项静态检查器,共 7 条判据,每条可对应官方条款;只读仓库文件,本地执行;命中表示「哪里像、哪里缺、请确认」,不是终审。
不是:合规认证或「保证过检」;不读数据库、不登录 App、不判断线上是否实际展示榜单;监护人同意、青少年模式等归 dsh-minor-guard;工信部 APP/ICP 备案公示归 dsh-cn-filing——本插件查的是教育移动应用备案与备案信息表。条款是否适用于高校、职教、成人培训,需法务确认。
一句话:dsh-cn-filing 看「有没有 APP 备案」,本插件看「教育行业那几条硬杠杠」。
七条检查规则¶
每条规则带 when 条件:项目不具备对应行业特征时进入 notApplicable,既不报错也不假装已查。例如纯后端、无移动端入口时,不会误报「未公示教APP备号」;未出现中小学生等信号时,适龄提示规则不跑。
| 规则 ID | 查什么 | 级别 |
|---|---|---|
EDU-APP-FILING-PUBLIC |
关于页、i18n、前端资源、app.json、Info.plist 等中是否找不到 教APP备NNNNNNN号 形式 |
high |
EDU-APP-FILING-RECORD |
是否找不到教育移动应用备案信息表(如 docs/compliance/教育移动应用备案信息.md) |
medium |
EDU-SCORE-RANK-PUBLIC |
代码/前端是否出现成绩排名、名次榜单、/score/rank、高考喜报/升学率等 |
high |
EDU-AD-GAME-SDK |
依赖清单是否出现 AdMob、play-services-ads、广点通、mobads、BUAdSDK、Unity、Cocos2d 等 | high |
EDU-AGE-RANGE-NOTICE |
面向未成年人场景下,app.json、Manifest、Info.plist、关于页等是否缺少适龄/ageRating | medium |
EDU-STUDENT-ID-EXPOSURE |
是否出现 G/L + 18 位的学籍号格式 |
high |
EDU-CHILD-PI-OFFICER |
文档/配置是否找不到儿童个人信息保护负责人及联系方式(或 child_pi_officer / dpo_contact) |
medium |
依据分别对应教技厅〔2019〕3号、教育部令第50号、教技函〔2019〕55号、教基一〔2013〕7号、网信办令第4号等条款;完整出处可用 CLI 的 --list-rules 查看。
读结果时注意:EDU-SCORE-RANK-PUBLIC 里 rank 可能只是变量名;EDU-AD-GAME-SDK 仅命中依赖名不直接判违规;EDU-STUDENT-ID-EXPOSURE 为格式命中,需区分真实学籍号与占位;第 1、5、7 条 absence 类规则整组只报一次。有 high 命中时进程退出码为 1,便于 CI 卡口。
安装与启用¶
推荐从市场或 GitHub 经 DSH 安装:
dsh plugin --profile web add @deepwhale-cn/dsh-industry-education
也可仅作为 npm 开发依赖安装,自行接入组合层:
npm i -D @deepwhale-cn/dsh-industry-education
在 DSH 组合层中插入:
- insert:
- id: industry-education
name: '@deepwhale-cn/dsh-industry-education'
package.json 标明引擎要求:DSH >=0.1.0-rc.6 <0.3.0,Node >=18。当前包版本为 0.1.1,许可证 MIT。插件以当前 DSH 进程权限读取项目文件,安装前请自行核对源码与许可证。
典型用法¶
在项目根目录或指定目录执行扫描:
dsh-industry-education # 扫当前目录
dsh-industry-education --root <项目目录> # 扫指定项目
dsh-industry-education --demo # 内置样本,查看检出效果
dsh-industry-education --json # JSON 输出,供 CI 二次处理
dsh-industry-education --html report.html # 生成 HTML 报告
dsh-industry-education --list-rules # 列出判据与出处
dsh-industry-education --quiet # 只输出结论行
建议流程:先做 --demo 熟悉报告形态,再对真实仓库跑全量扫描;CI 中可用 --json 与退出码处理 high 命中。报告会说明扫描文件数、实际运行的规则数;若少于 7 条,表示部分规则因 when 不适用而未执行,不等于「全绿」。
适用场景与限制¶
适合:教育类移动应用或含教育信号的前端/混合仓库,在提测或上线前做仓库侧自查;与 dsh-cn-filing、dsh-minor-guard、dsh-data-scan 等分工配合,不替代法务意见。
已知限制(来自官方 README):不判断线上事实;文档里写「不面向未成年人」也可能被关键词 when 命中;默认跳过 dist/、build/、node_modules/ 等,.gradle 不读内容,广告 SDK 主要靠 package.json / Podfile / podspec;学籍号命中可能展示号码片段,保存报告时请自行打码。
结尾¶
dsh-industry-education 把教育 App 上线前常被问的七类静态问题做成可本地复现的规则扫描,适合开发者在改代码与改文档的环节提前对齐备案公示、备案表、排名展示、广告依赖、适龄提示、学籍号与儿童个人信息保护负责人等事项。
目录页:https://www.skillhub.cn/plugins/feely0208/dsh-industry-education
源码与说明:https://github.com/feely0208/dsh-industry-education