Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Coldfusion 当用户直接链接到文档时,如何强制用户登录下载文档?_Coldfusion_Download_Documents - Fatal编程技术网

Coldfusion 当用户直接链接到文档时,如何强制用户登录下载文档?

Coldfusion 当用户直接链接到文档时,如何强制用户登录下载文档?,coldfusion,download,documents,Coldfusion,Download,Documents,好的,情况是这样的。与我共事的一群人有一个他们管理的教育网站。网站的大部分内容都是可以下载的文档形式。用户登录,然后可以查看文档的类别并下载它们。页面上的下载链接是指向文档的直接链接 已发现的问题是,如果有人拥有直接链接(例如,如果有人通过电子邮件发送给他们),则无需登录即可下载文档。现在,网站上的每个页面在允许用户访问页面之前都会检查用户是否已登录,但Word和PDF文档当然没有相同的保护,因此如果有人从直接链接下载,他们就不会通过网站 有没有办法防止这些文档以这种方式下载,或者强制用户先登录

好的,情况是这样的。与我共事的一群人有一个他们管理的教育网站。网站的大部分内容都是可以下载的文档形式。用户登录,然后可以查看文档的类别并下载它们。页面上的下载链接是指向文档的直接链接

已发现的问题是,如果有人拥有直接链接(例如,如果有人通过电子邮件发送给他们),则无需登录即可下载文档。现在,网站上的每个页面在允许用户访问页面之前都会检查用户是否已登录,但Word和PDF文档当然没有相同的保护,因此如果有人从直接链接下载,他们就不会通过网站

有没有办法防止这些文档以这种方式下载,或者强制用户先登录?管理网站的人担心没有网站登录的人能够访问他们不应该访问的文档。顺便说一下,这个网站是用ColdFusion写的

编辑:好的,我正在尝试实现Steve的解决方案,如下所示:

<cfheader name="Content-Type" value="unknown">
<cfheader name="Content-Disposition" value="attachment; filename='#resourceName#'">
<cfcontent file="#resourceData.ResourcePath#" type="Application/unknown" deleteFile="no">

它适用于.jpeg和pdf,但对于其他文档类型,如Word,它会下载一个压缩文件,其中包含.xml文件(特别是名为“\u rels”、“docProps”和“Word”的子文件夹,其中包含.xml文件,还有一个名为“[Content\u types].xml”的顶级文件)。如果我将内容类型设置为Word mimetype,则可以正常下载。有什么想法吗


Edit:好的,我不知道如何使用'Application/Unknown'作为文件类型来解决问题,但是如果我使用getPageContext().getServletContext().getMimeType()来获取mimetype,我可以将其作为类型。不幸的是,我仍然有一个问题,因为这个函数无法为较新的Office文档类型检索mimetype。我们的服务员正在看。如果必须,我将设置一些逻辑来检测.docx/.pptx/.xlsx文件,并使用getPageContext().getServletContext().getMimeType()来检测其他文档的Mimetype。但是,任何关于使用“Application/Unknown”进行此操作的建议都是受欢迎的。

一旦他们获得了直接链接,他们可以做任何他们想做的事情,除非您在web服务器级别增加安全性。然而,到那时,它通常仅限于HTTP基本身份验证,而且根据用户凭据的数据库进行身份验证并不容易

首选方法是使文件不可通过web访问,并将文件服务责任转移到应用层(也称为CF):

  • 使用
    处理CF上的文件(轻载/小文件可以,请参阅steve的答案)
  • 在Apache或IIS上使用modxsendfile(通过)(推荐)
  • 将文件移动到具有随机文件名的url,并在x分钟后通过cfscheduler清理文件。(更像是一个黑客,但它已经工作了很多年)

一旦他们获得了直接链接,他们可以做任何他们想做的事情,除非您在web服务器级别增加安全性。然而,到那时,它通常仅限于HTTP基本身份验证,而且根据用户凭据的数据库进行身份验证并不容易

首选方法是使文件不可通过web访问,并将文件服务责任转移到应用层(也称为CF):

  • 使用
    处理CF上的文件(轻载/小文件可以,请参阅steve的答案)
  • 在Apache或IIS上使用modxsendfile(通过)(推荐)
  • 将文件移动到具有随机文件名的url,并在x分钟后通过cfscheduler清理文件。(更像是一个黑客,但它已经工作了很多年)

    • 以下是我使用的设置示例:

      <a href="retrieveFile.cfm?filename=#filename#">Download #filename#</a>
      
      
      
      那么retrieveFile.cfm的内容如下所示:

      <cfheader name="Content-Type" value="unknown">
      <cfheader name="Content-Disposition" value='attachment; filename="#filename#"'>
      
      <cfcontent type="Application/Unknown" file="C:\files\#filename#" deletefile="no">
      
      
      
      调整变量和路径以适合您的应用程序。您还可以传入ID号并引用数据库表,然后从数据库表中提取值

      由于retrieveFile.cfm是一个.cfm文件,因此安全性可以由application.cfc处理,并且访问权限可以限制为登录的用户


      此解决方案可以限制对pdf、.doc、.jpg等的访问…

      以下是我使用的设置示例:

      <a href="retrieveFile.cfm?filename=#filename#">Download #filename#</a>
      
      
      
      那么retrieveFile.cfm的内容如下所示:

      <cfheader name="Content-Type" value="unknown">
      <cfheader name="Content-Disposition" value='attachment; filename="#filename#"'>
      
      <cfcontent type="Application/Unknown" file="C:\files\#filename#" deletefile="no">
      
      
      
      调整变量和路径以适合您的应用程序。您还可以传入ID号并引用数据库表,然后从数据库表中提取值

      由于retrieveFile.cfm是一个.cfm文件,因此安全性可以由application.cfc处理,并且访问权限可以限制为登录的用户


      这个解决方案可以限制对pdf、.doc、.jpg等的访问…

      Ooh,我喜欢它。我想看看其他人的建议,但这似乎是一个很好的解决方案。该解决方案还允许您将文件存储在webroot路径之外的不可访问的目录中。我认为这个解决方案可能是您可能找到的最容易实现的解决方案。亨利在下面概述了其他可以通过谷歌搜索的解决方案。好吧,我遇到了一个问题。对于pdf和jpeg,它似乎工作得很好,但对于其他文件,如Word文档,它下载一个压缩文件,其中包含一堆xml文件。如果我给“type”属性一个单词mimetype,那么它将正确下载。但是这些文档都是不同的类型,所以除非我设置一些东西来检测基于扩展的mimetype(希望我不会忘记一个),否则这是行不通的。我做了一些研究,但找不到答案。想法?我不知道你为什么得到一个zip文件。应用程序/未知部分应该提示浏览器询问您想对文件做什么,因为它不知道文件是什么类型(未知)。哦,我喜欢它。我想看看什么