按班级隔离
公开教程 · 无需登录

按班级隔离

列表查询携带会话中的班级条件;按标识打开详情时,先取出对应数据行,再校验其是否属于本班。跨班级访问与记录不存在两种情况,对外均返回同构的 404 响应。

1详情先取行再校验

GET /materials/17 A 班教师,猜测 B 班材料标识 按标识取行 fetch 记录存在 且 属会话班级? 校验:两项均满足方可放行 是 200 返回详情 正常路径 否(任一不满足) 同构 404 标识不存在 与 跨班级 响应完全一致 服务端日志 记录真实原因 用于区分越权探测与误输入
图:对象路径的「先取行再校验」。知道 ID 不等于有权访问;对外只有 200 与同构 404 两种结果,越权试探不泄露资源是否存在。

文件下载沿用同一套校验,不得仅凭掌握存储路径即可获取文件。学生调用上传接口应被拒绝,且该拒绝发生在服务端,不依赖于页面是否渲染了相应按钮。

2列表过滤与详情校验是两类不同机制

认证模块已将班级写入本次请求上下文。材料模块后续存在两条不同路径,二者不可混为一谈。

列表 GET /api/materials 查询条件带上班级 其他班级的记录不会出现在结果集中 200,仅返回本班材料标题 空结果集同样返回 200 详情 / 下载 URL 中携带材料标识 先取行,再比对班级 下载须在读取文件之前完成该校验 校验通过方才返回 200 不匹配或不存在:均返回同一 404
列表是「仅检索本班记录」;详情是「标识可能对应真实记录,但必须进一步证明其属于本班」。二者均使用会话中的班级,不使用请求中另行声明的班级。

为何下载不能绕过材料模块

文件存放于上传目录中。若 Nginx 将该目录以静态资源方式公开,则知悉文件名即可直接下载,此前的 404 校验将失去意义。因此该目录仅挂载到 api 容器,下载请求仍须先经过认证模块与班级归属校验,通过后才由 Go 将文件字节写回响应体。