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

时间:2011-12-28 07:14:12

标签: security coldfusion

我建立了一个在线系统,允许用户使用ColdFusion下载PDF文件。用户必须先登录才能下载文件(PDF和Microsoft Office文档)。 (此应用程序仅适用于我们公司的员工。)

但是,直到今天我才发现任何有网络访问权限的人都可以查看这些文件。只有某些关键字,例如Google搜索中的“医疗表单myCompanyName”,他们就可以使用浏览器查看PDF文件。

我该如何防止这种情况?

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

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

但是,如果没有网址,其他互联网用户只能通过在网上搜索来查看pdf文件,搜索引擎会提供一个指向文件夹本身的链接,而无需登录。

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

我们在此文件夹中有大量PDF文件,其中大部分都是保密的,仅供内部查看。在php中,我们可以通过使用.htaccess来禁用它。我想知道冷冻是否有这样的东西?

4 个答案:

答案 0 :(得分:5)

您可以使用单行代码发送文件:

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

ColdFusion FTW,对。

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

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

<强> UPD

您希望将此代码放入文件(例如file.cfm)并将其用于PDF链接。像这样:

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

file.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 /数据库方法,虽然这个答案最初是作为简单的指导,而不是真正的综合解决方案。

答案 1 :(得分:4)

您需要将PDF存储在网络领域之外。

因此,假设您的网络应用的基础是

  

/网站/网络

从那里提供所有http(网络)请求。

  

/ website / pdf

可以是存储所有PDF的路径。此路径无法通过URL访问,因为它不是由您的Web服务器提供的。

然后在www

你有类似

的东西
downloadpdf.cfm?file=NameOfPDF.pdf

您的检查是为了确保其适当的用户,如果是,请提供文件

<cfcontent type="application/pdf" file="/website/pdf/#url.file#" />

答案 2 :(得分:4)

使用cfcontent,pre cf8,是一个非常糟糕的主意,因为它在传输之前将整个文件加载到内存中。 CF8及更高版本实际上将从磁盘流中解析内存问题。但是,如果您有大文件,慢速连接和/或大量下载的用户,您仍然需要担心线程不足。每次下载cfcontent都会在下载期间占用一个线程。

根据您的Web服务器,您可以使用x-sendfile扩展来绕过此路由器。这允许您发送一个http标头,其中包含Web根目录之外的文件路径,并让您的Web服务器处理发送文件,从而释放cf以进行进一步的工作。

以下是Ben Nadel关于在apache,http://www.bennadel.com/blog/2170-Streaming-Secure-Files-Efficiently-With-ColdFusion-And-MOD-XSendFile.htm上使用mod_xsendfile的文章,这里是一个等效的IIS7 XSendFile插件https://github.com/stakach/IIS-X-Sendfile-plugin

答案 3 :(得分:0)

您可以查看CFWheels SendFile()助手标记http://cfwheels.org/docs/1-1/function/sendfile的代码片段

https://gist.github.com/1528113