MVC应用如何阻止未登录用户通过粘贴直链访问、篡改文档资源
解决方案
你遇到的两个漏洞分别对应「未登录身份校验缺失」和「垂直越权校验缺失」,按以下两步修改即可修复:
1. 限制接口仅允许已登录用户访问
给Documents控制器下的CertificatePDF动作方法添加[Authorize]特性,ASP.NET MVC原生会自动拦截未登录请求,解决用户登出后仍能通过链接直接访问的问题。
示例代码:
// .NET Core版本引用命名空间:using Microsoft.AspNetCore.Authorization; // .NET Framework版本引用命名空间:using System.Web.Mvc; public class DocumentsController : Controller { [Authorize] // 新增该行,要求访问该接口必须携带合法的登录态 public ActionResult CertificatePDF(long wo_nbr) { // 原有业务逻辑 } }
如果整个Documents控制器的所有接口都需要登录访问,可直接将[Authorize]加在控制器类上,无需给每个Action单独添加
2. 新增权限校验,禁止越权访问其他用户文档
登录校验只能挡住未登录用户,你还需要在接口内部做归属权限校验:拿到请求参数wo_nbr后,先查询该工单/文档关联的所属用户ID,和当前登录的用户ID做比对,校验不通过直接拒绝访问。
示例代码:
[Authorize] public ActionResult CertificatePDF(long wo_nbr) { // 1. 获取当前登录用户的唯一标识,根据你项目的授权逻辑调整取值方式 var currentUserId = User.FindFirstValue(ClaimTypes.NameIdentifier); // 低版本也可以用 User.Identity.Name 读取登录账号 // 2. 校验当前用户是否有权限访问该wo_nbr对应的文档 bool hasPermission = _dbContext.WorkOrders.Any(w => w.id == wo_nbr && w.OwnerUserId == currentUserId); if (!hasPermission) { // .NET Core 写法:返回403禁止访问,也可以返回404隐藏文档存在性 return Forbid(); // .NET Framework写法:return new HttpStatusCodeResult(403); } // 3. 校验通过后再执行原有返回PDF文档的逻辑 // ... 原有业务代码 }
可选安全优化
- 可将明文自增的
wo_nbr替换为不可预测的随机字符串(如GUID)作为文档唯一标识,避免攻击者遍历参数批量爬取文档 - 给生成的链接添加签名和过期时间,后台校验签名合法且未过期才允许访问,避免用户保存的链接长期有效
内容的提问来源于stack exchange,提问作者TLamb
相关产品推荐
相关产品推荐

