1

好的,情况就是这样。与我一起工作的一群人有一个他们管理的教育网站。大多数网站内容都是可以下载的文档形式。用户登录后,就可以查看文档的分类,并进行下载。页面上的下载链接是文档的直接链接。

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

有什么办法可以保护这些文件不被这种方式下载,或者强制用户先登录?管理站点的人担心没有登录站点的人能够访问他们不应该访问的文档。顺便说一句,该站点是用 ColdFusion 编写的。

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

<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 文件的压缩文件(特别是名为“_rels”、“docProps”和“word”的子文件夹,其中包含 .xml 文件,以及一个名为“[Content_Types].xml”的附加顶级文件)。如果我将内容类型设置为 Word mimetype,它可以正常下载。有任何想法吗?

编辑:好的,我不知道如何使用“应用程序/未知”作为文件类型来解决问题,但是如果我使用 getPageContext().getServletContext().getMimeType() 获得 mimetype,我可以将其放入类型。不幸的是,我仍然遇到一个问题,即此功能无法为较新的 Office 文档类型检索 mimetypes。我们的服务员正在查看。如果必须,我将设置一些逻辑来检测 .docx/.pptx/.xlsx 文件并使用 getPageContext().getServletContext().getMimeType() 来检测其他文档的 mimetypes。但是任何关于使用“应用程序/未知”进行这项工作的建议都将受到欢迎。

4

2 回答 2

4

这是我使用的设置示例:

<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 等的访问......

于 2013-05-31T20:01:46.883 回答
3

一旦他们获得了直接链接,他们就可以为所欲为,除非您在 Web 服务器级别添加安全性。但是到那时,它通常仅限于 HTTP Basic Authenticate,并且针对您的用户凭据数据库进行身份验证并不容易。

首选方法是使文件无法通过 Web 访问,并将文件服务责任转移到应用层(即 CF):

  • 处理在 CF 上服务的文件<cfcontent>(可以使用轻负载/小文件,请参阅史蒂夫的回答)
  • 在 Apache 或 IIS 上使用 mod_xsendfile(通过Apache Emulator)(推荐)
  • 将文件移动到具有随机文件名的 url,并在 x 分钟后通过 cfscheduler 清理文件。(更像是一个 hack,但它对许多人都有效)
于 2013-05-31T19:57:40.500 回答