2011-02-01 63 views
0

我们有一个安全的网站(在Windows服务器和IIS 5上运行的.NET 2.0/C#中开发),成员必须先登录,然后才能查看存储在虚拟目录中的一些PDF文件。为了防止蜘蛛抓取本网站,我们有一个robots.txt,它将禁止所有用户代理进入。但是,这不会阻止Rogue蜘蛛将PDF文件编入索引,因为它们会忽略robots.txt命令。由于文件是安全的,我不希望任何蜘蛛进入这个虚拟目录(甚至不是好的)。防止索引目录中的流氓蜘蛛

在网上阅读一些文章,并想知道程序员(而不是网站管理员)是如何在他们的应用程序中解决这个问题的,因为这似乎是一个非常普遍的问题。网络上有许多选项,但我正在寻找简单而优雅的东西。

我看到的一些选项,但似乎很弱。这里列出了他们的缺点:

  1. 创建一个蜜罐的/ Tarpit,将允许流氓蜘蛛得到,然后会列出自己的IP地址。缺点:这也会阻止来自相同IP的有效用户,需要手动维护此列表或者让成员从列表中删除自己。由于该网站在互联网上,我们没有有效成员将使用的一系列IP。

  2. 请求标头分析:然而,流氓蜘蛛使用真正的代理名称,所以这是毫无意义的。

  3. 元机器人标签:缺点:只有谷歌和其他有效的蜘蛛服从。

有一些关于使用.htaccess的说法,它假设是好的,但那只会是apache,而不是IIS。

任何建议非常感谢。

编辑:正如9000指出的,流氓蜘蛛不应该能够进入需要登录的页面。我想这个问题是'如何阻止知道链接表单的人在不登录网站的情况下请求PDF文件'。

回答

1

这是我做的(扩展到Leigh的代码)。

  1. 为PDF文件创建了一个HTTPHandler,在安全目录上创建了一个web.config,并配置了Handler来处理PDF。

  2. 在处理程序中,我检查用户是否使用由应用程序设置的会话变量登录。

  3. 如果用户有会话变量,我创建一个fileInfo对象并将其发送到响应中。注意:不要做'context.Response.End()',也不要'Content-Disposition'。

所以,现在,甚至有对安全目录PDF文件的请求时,HTTP处理程序获取请求,并检查用户是否登录,如果没有,显示错误消息,否则显示文件。

不知道自从创建fileInfo对象并发送该对象以来,是否存在性能问题,而不是发送已存在的文件。问题是你不能Server.Transfer或Response.Redirect到* .pdf文件,因为你正在创建一个无限循环,并且响应永远不会返回给用户。

3

我看到

成员之间的矛盾,必须先登录,然后他们可以查看存储在一个虚拟目录

这不会阻止某些PDF文件索引PDF文件的流氓蜘蛛

如何向这个目录发送任何未经授权的HTTP请求,并获得代码401以外的其他内容?胭脂蜘蛛当然不能提供授权cookie。如果他们可以访问目录,那么什么是'会员登录'?

可能需要通过检查授权的脚本来提供PDF文件。我认为IIS只需要一个目录访问就可以获得授权(但我不知道)。

+0

嗨9000,你是对的。蜘蛛无法抓取到需要登录的页面。我猜这个问题是,如果有人已经知道这个链接,并且试图在没有登录的情况下得到它。 – Pritika 2011-02-02 17:55:01

+0

实际上,这些页面可能对蜘蛛是安全的,但是如果该文件仍然可以在没有登录的情况下访问,它仍然是公开的。如果知道url的用户可以在没有登录的情况下查看文件,那么你应该假设蜘蛛也是如此(尽管稍微有些困难),所以网上的任何人都会这样做。您将希望完全防止未经授权的访问文件,可能在apache中。 – Kzqai 2011-06-07 17:25:46

1

我假设您的PDF链接来自已知位置。您可以检查Request.UrlReferrer以确保用户来自此内部/已知页面以访问PDF。

我肯定会强制下载通过一个脚本,您可以在允许下载之前检查用户是否实际登录到站点。

protected void getFile(string fileName) { 

/* 
    CHECK AUTH/REFERER HERE 
*/ 

    string filePath = Request.PhysicalApplicationPath + "hidden_PDF_directory/" + fileName; 

    System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath); 

    if (fileInfo.Exists) { 
     Response.Clear(); 
     Response.AddHeader("Content-Disposition", "attachment; filename=" + fileInfo.Name); 
     Response.AddHeader("Content-Length", fileInfo.Length.ToString()); 
     Response.ContentType = "application/pdf"; 
     Response.WriteFile(fileInfo.FullName); 
     Response.End(); 
    } else { 

/* 
    ERROR 
*/ 

    } 
} 

未经测试,但这应该至少给你一个想法。

我也会远离robots.txt,因为人们经常会用它来实际寻找你认为你藏起来的东西。