在客户端呈现PDF文件而不会暴露原始路径以防止下载

时间:2019-01-27 12:02:02

标签: c# jquery asp.net-mvc

限制对文件的直接访问的当前可能方法是放置在App_Data文件夹中。但是,如果我使用app_data文件夹,它将阻止直接浏览器访问以及HTML渲染。我想允许App_Data中的文件以编程方式通过某种授权在客户端呈现即会话价值

现在,如果将文件上传到其他文件夹并以html格式呈现,则可以使用,但它也可以直接访问不需要的文件,在我的情况下,这是一个安全漏洞。

到目前为止我尝试过的 1.我已经实现了通过直接URL限制文件下载。使用FileResult方法。但是我仍然无法在客户端(Jquery)中呈现文件。

2 个答案:

答案 0 :(得分:1)

我也遇到过同样的情况,经过搜索,我从这个答案中得出了这个解决方案。

https://stackoverflow.com/a/10604182/5934624

使用此答案,我只需要创建一个 IHTTPHANDLER ,以拦截所有发送到App_Data或要保护的文件夹的请求。

IHTTPHANDLER

    public class PdfHandler : IHttpHandler
    {
        public bool IsReusable
        {
            get { return false; }
        }
        public void ProcessRequest(HttpContext context)
        {
            /*
                Validate Requests here and then return your PDF File
            */
            var requestFilePath = context.Requests.AppRelativeCurrentExecutionFilePath;
            context.Response.ContentType = "application/pdf";
            string filePath = HttpContext.Current.Server.MapPath(path);
            context.Response.TransmitFile(filePath);
        }
    }

还可以在 Web.Config

中添加参考
<system.webServer>
  <handlers>
    <add name="cplFiles" verb="*" path="*.pdf" type="YourProject.Models.PdfHandler , YourProject" resourceType="File" />
  </handlers>
</system.webServer>

答案 1 :(得分:0)

一种方法是将文件作为字节[](或任何其他格式)返回,然后在客户端从此再见[]重建或重新创建文件

u还可以创建一个可供客户端访问的临时位置,将文件复制到该位置并从那里提供,在提供文件后删除该文件(当然,在性能方面,这不是最佳实践,但是它具有很好的安全性)明智的做法是,特定的网址将无法正常工作两次)