在 mvc5 中保护和隐藏直接下载 pdf 的 url 和文件夹

secure and hide url and folder from direct download pdf in mvc5

我正在为 在线图书购买开发应用程序

我在付款后提供下载 PDF 格式的书,所以我想确保我的 PDF 不被直接下载。

问题:

1) 如何在下载 PDF 时隐藏文件夹 URL

2) 不允许用户直接访问文件夹或 PDF 的任何安全代码

3) 当点击下载时会直接下载PDF而不是在浏览器中打开然后下载

解决这个问题的方法有上百万种,所以我只是随便说说一些可能对你有帮助的想法。

推荐

首先,您不希望在应用程序中显式公开任何 文件或文件夹。让您的应用程序为您服务,如果您甚至想直接为它们服务的话。您可以考虑很多事情:

  • 电子邮件 - 不是直接在网站上提供文件,而是在用户完成付款过程后通过电子邮件向他们发送请求文件的副本。
  • 利用 GUID - 如果您确实选择对文件使用 link,请将其设为用户特定。将给定文件的所有 paid 用户存储在数据库中,并为他们分配 ID(使用 GUID),然后当用户请求该文件时,验证他们的帐户是否具有适当的ID 或对照数据库检查以确保他们有权访问它。

潜在的工作流程可能是这样的:

  • 用户选择项目 purchase/download。
  • 用户完成付款处理。
  • 验证付款后,将交易存储在数据库中(例如分配一个唯一标识符,表明用户可以访问该特定文件在用户帐户上存储一些东西指出他们可以访问您网站上的所有资源)
  • 备选方案:只需通过电子邮件向用户发送请求文件的副本(或 link 使用上一步将其下载到您的网站)

如果您确实选择 link 供用户显式下载文件,请确保您不暴露文件本身,而是提供一个端点来处理确定访问并最终提供文件,例如这个:

 // You could consider writing a custom attribute that would store which files a given 
 // user had access to (via claims, etc.) but make sure the endpoint requires authentication
 [Authorize]
 public FileResult DownloadFile(Guid fileId)
 {
       // Here you could explicitly check in your database to ensure the user had access
       // to the requested file, otherwise revoke the request
       if (CanAccessFile(context.UserId, fileId)) 
       {
             // If they can access the file, then serve it from the appropriate location
             return File(...);
       }
 }

同样,您还可以支持这样的场景,即只需访问 link 即可允许用户通过传递请求的文件以及令牌来下载文件:

// You wouldn't necessarily need authentication here because the token and 
// requested file should be enough
public FileResult DownloadFileWithToken(Guid downloadToken, Guid fileId)
{
     // Here you would just check your database to ensure that the token was
     // valid for the specific file and if so, allow the user to download it
}

您的问题

1) How could I hide folder URL at the time of download PDF?

不要直接公开文件以便用户可以访问它。

2) Any security code which not allow user directly access folder or PDF?

再次声明 - 不允许直接访问任何文件夹或文件。如果您在付款后提供这些文件,那么您没有理由在 site/application.

上明确公开它们

3) When click on download it will directly download PDF instead of open in browser then download?

您可以通过 HTML download 属性完成此行为(无论您选择如何处理此过程):

<a href="path" download>Download</a>
  1. 您可以将所有PDF文件放到一个文件夹中,该文件夹放在根路径中。
_ Your project
|_ wwwroot
|_ PDF_folder
|__ file_01.pdf
|__ file_02.pdf

通过这种方式,用户无法通过URL访问文件。

example.com/pdf_folder/file_01.pdf,此路径会响应404状态码。

  1. 因为没有用户可以直接访问的link,所以您在此操作中不需要任何安全代码。

  2. 当用户发出新请求时,您可以尝试return一个File

public ActionResult Download()
{
    // code goes here...

    return File(...);
}