security - 如何防止外部用户查看文档文件

标签 security coldfusion

我构建了一个在线系统,允许用户使用 ColdFusion 下载 PDF 文件。用户必须登录才能下载文件(PDF 和 Microsoft Office 文档)。 (此申请仅供本公司员工使用。)

但是,直到今天我才发现任何可以访问互联网的人都可以查看这些文件。只需在 Google 搜索中输入某些关键字(例如“医疗表格 myCompanyName”),他们就可以使用浏览器查看 PDF 文件。

如何防止这种情况发生?

更新
这就是我的问题所在。我已经为所有 PDF 文件创建了一个文件夹。每个文件都使用数据库中的 ID 进行调用。如果假设用户想要查看医疗表格,链接将为:http://myApplication.myCompanyName/forms.cfm?Department=Account&filesID=001

如果用户复制此网址并从系统注销,他/她将无法查看此文件。(将显示登录页面)

但是,如果没有 URL,其他互联网用户仍然可以通过在网上搜索来查看 pdf 文件,并且搜索引擎将提供一个链接,将其定向到文件夹本身,而无需登录。

示例: Medical Form 的 pdf 文件存储在名为 Document 的文件夹中。当互联网用户搜索医疗表格时,搜索引擎会将其链接到:http://myApplication.myCompanyName/Document/Medical%20Form.pdf

此文件夹中有大量 PDF 文件,其中大部分都是 secret 文件,仅供内部查看。在 php 中,我们可以使用 .htaccess 禁用此功能。我想知道冷聚变有没有类似的东西?

最佳答案

您可以通过单行代码发送文件,如下所示:

<cfif isAuthorized>
    <cfcontent file="/path/to/files/outside/of/web/root/Form.pdf" type="application/pdf" reset="true" />
</cfif>

ColdFusion FTW,对。

请注意,处理大文件(例如 100MB 以上)可能会导致一些问题,因为文件在发送之前会被推送到 RAM。 看起来这不再正确,正如 Mike 的回答所解释的那样。

如果您想强制下载,另一种选择是使用 x-application 等内容类型。

UPD

您想要将此代码放入文件(假设为 file.cfm)中并将其用于 PDF 链接。像这样的事情:

<a href="file.cfm?filename=Xyz.pdf">Download file Xyz.pdf</a>

文件.cfm:

<!--- with trailing slash --->
<cfset basePath = "/path/to/files/outside/of/web/root/" />

<cfif isAuthorized AND StructKeyExists(url, "filename") 
      AND FileExists(basePath & url.filename) 
      AND isFile(basePath & url.filename) 
      AND GetDirectoryFromPath(basePath & url.filename) EQ basePath>
    <cfcontent file="#basePath##url.filename#" type="application/pdf" reset="true" />
<cfelse>
    <cfoutput>File not found, or you are not authorized to see it</cfoutput>
</cfif>

UPD2

添加了 GetDirectoryFromPath(basePath & url.filename) EQ basePath,以轻松快速地防止提到的安全问题。

我个人通常使用 ID/数据库方法,尽管这个答案最初只是作为简单的指导,而不是真正全面的解决方案。

关于security - 如何防止外部用户查看文档文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8652981/

相关文章:

c# - Coldfusion OpenXml 错误 : Could not load file or assembly 'DocumentFormat.OpenXml'

coldfusion - 文件上传过大

mysql - 在表单上显示自动增量 ID 的方法?

ios - Objective-C : Unable to fetch SecKeyRef from PEM private key

mysql - 多个 MySQL 数据库连接的优点和缺点

windows - 使用进程间通信时验证客户端

command-line - 从命令行启动 ColdFusion

sql - 查询2个日期之间的记录

security - 当 XSS 取消 CSRF 时,为什么将 API token 存储在建议用于 SPA 的 cookie 中

javascript - Firebase JavaScript : Securely store a password inside the database