首页 文章

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

提问于
浏览
4

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

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

我怎么能阻止这个?

UPDATE
这就是我的问题所在 . 我说用户想要查看医疗表格,链接将是:http://myApplication.myCompanyName/forms.cfm?Department=Account&filesID=001 .

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

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

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

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

4 回答

  • 4

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

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

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

  • 4

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

    https://gist.github.com/1528113

  • 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的回答所解释的那样 .

    如果要强制下载,另一种选择是使用类似 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 /数据库方法,虽然这个答案最初是作为简单的指导,而不是真正的综合解决方案 .

  • 0

    您需要将PDF存储在Web领域之外 .

    所以我们说你的网络应用程序的基础是

    / website / www

    所有的http(网络)请求都是从那里提供的 .

    / website / pdf

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

    然后在www

    你有类似的东西

    downloadpdf.cfm?file=NameOfPDF.pdf
    

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

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

相关问题