如何防止在IIS 6.0中直接访问PDF或xls或doc文件

如何防止在IIS 6.0中直接访问PDF或xls或doc文件,pdf,asp-classic,iis-6,block,xls,Pdf,Asp Classic,Iis 6,Block,Xls,我们有一个网站(如abc.com),它是在经典ASP中构建的,托管在IIS6.0上。我们在IIS 6.0中有一个内容文件夹,它由静态文件(如PDF或XLS)组成。我们最近了解到,在各种搜索引擎中,我们的网站(www.abc.com/content/xyz.PDF)到PDF/xls的直接链接会显示在搜索结果中,任何用户都可以直接访问这些文件。由于这些文件应仅可供登录用户访问,如何防止匿名用户直接访问这些文件。我们使用cookie和数据库来验证有效用户。到目前为止,我们采取的行动是:- 1) 将ro

我们有一个网站(如abc.com),它是在经典ASP中构建的,托管在IIS6.0上。我们在IIS 6.0中有一个内容文件夹,它由静态文件(如PDF或XLS)组成。我们最近了解到,在各种搜索引擎中,我们的网站(www.abc.com/content/xyz.PDF)到PDF/xls的直接链接会显示在搜索结果中,任何用户都可以直接访问这些文件。由于这些文件应仅可供登录用户访问,如何防止匿名用户直接访问这些文件。我们使用cookie和数据库来验证有效用户。到目前为止,我们采取的行动是:-

1) 将robots.txt包含在我们的网站中,并通过各种网站管理员工具阻止搜索结果中直接链接的出现,但我们认为这不是最佳解决方案

2) 在我们的网站上有各种各样的功能,通过这些功能,直接访问PDF的链接被用来向用户展示。我们已经停止,没有向用户显示直接URL路径


问题:-当我们使用IIS6.0和经典ASP时,是否有任何方法可以在IIS级别实现任何内容,以防止直接访问PDF/XLS文件。例如,如果用户键入“www.abc.com/temp/xyz.PDF”或由.PDF/.xls组成的url,我们的asp或任何其他页面应首先拦截以进行身份验证(检查用户是否登录),并基于此允许打开。

我们公司有类似类型的网站,有很多文件,除了上传文件的用户之外,任何人都不能访问。我们是这样解决的:

  • 将所有内容文件放在网站目录之外。这意味着没有人可以访问这些文件,即使他们知道文件的完整路径
  • 授予网站对内容目录的读取权限
  • 构建一个脚本,可以根据请求交付单个文件。此文件确保用户必须登录才能下载任何文件
  • 在html页面上,不是直接链接到文件,而是有一个类似以下内容的链接
  • 下载文件代码示例

    自定义404页面示例

    <%
    dim downloadURL, url, urlPattern, arrTmpUrl, arrTmp
    dim filename, fileID
    
    ' ** Base path for downloads (new)
    downloadURL = "http://www.yourDomain.com/downloadFile.asp?fileID="
    ' ** Fetch QUERY_STRING  (this tells us which page the user tried to access)
    url = Request.ServerVariables("QUERY_STRING")
    ' ** URL pattern  (did the user try to download a content file?)
    urlPattern = "^(http://|http://www.|www.)yourDomain.(se|com):80/(ContentDir|AltContentDir)/[a-zA-Z0-9_åäöÅÄÖ .]{2,100}/?$"
    
    arrTmpUrl = split(url,"404;")
    if  1 = (UBound(arrTmpUrl) - LBound(arrTmpUrl)) then
        if RegExTest(arrTmpUrl(UBound(arrTmpUrl)), urlPattern) Then
            arrTmp = split(arrTmpUrl(UBound(arrTmpUrl)),"/")
            filename = trim(arrTmp(UBound(arrTmp)))
    
            'See if we can find the file name in database
            fileID = GetFileIDFromDatabaseByName(filename)
            if fileID > 0 then
                downloadURL = downloadURL & Cstr(fileID)
    
                'Redirect user to proper download link
                response.redirect downloadURL
            else
                'We did not find a matching file
                'Show standard 404 page
                ShowStd404Page("We did not find a matching file")
            end if
        else
            'The URL did not match the pattern
            'Show standard 404 page
            ShowStd404Page("no match")
        End if
    else
        'The queryString did not look like as expected
        'Show standard 404 page
        ShowStd404Page("unexpected queryString")
    End if
    %>
    
    0那么
    downloadURL=downloadURL&Cstr(文件ID)
    '将用户重定向到正确的下载链接
    response.redirect downloadURL
    其他的
    '我们没有找到匹配的文件
    '显示标准404页
    ShowStd404Page(“我们没有找到匹配的文件”)
    如果结束
    其他的
    'URL与模式不匹配
    '显示标准404页
    显示404页(“不匹配”)
    如果结束
    其他的
    “这个质询看起来不像预期的那样
    '显示标准404页
    显示D404页(“意外查询字符串”)
    如果结束
    %>
    
    David code位于“intFilelength\chunck”中:chunck为0。 插入一项声明:

    Dim chunck
    chunck = 2^13 '8K
    
    许多其他相关问题也说明了:

    Call Response.AddHeader("Cache-Control", "private, max-age=1")
    

    未测试,但您可以借用其他语言的思想,将
    FileSystemObject
    用于文件
    OpenAsTextStream
    ,然后将
    ReadAll
    输出给用户。但不确定IIS是否能处理大流量。这种逻辑似乎很好。。但我想知道,如何处理仍然指向同一目录的旧静态链接。如果我们移动旧目录,旧链接(已经在我们发布的内容中)将停止工作..您将必须替换这些链接,或者,如果内容文件具有公共基本路径,则有一个自定义404页,用于捕获失败的下载请求。我将用一个简短的示例片段更新我的答案。。。
    Call Response.AddHeader("Cache-Control", "private, max-age=1")