You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 12:39:02