防止Rogue蜘蛛从索引目录

时间:2011-02-01 19:00:13

标签: security iis virtual-directory web-crawler

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

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

我见过的一些选项,但似乎很弱。在此列出他们的缺点:

  1. 创建一个Honeypot / tarpit,允许恶意蜘蛛进入,然后列出他们的IP地址。缺点:这也可以阻止来自同一IP的有效用户,需要手动维护此列表或者有一些方法让成员从列表中删除自己。我们没有一系列有效会员将使用的IP,因为该网站在互联网上。

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

  3. Meta-Robots标签:缺点:只有谷歌和其他有效的蜘蛛才能遵守。

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

    非常感谢任何建议。

    编辑:正如9000所指出的那样,流氓蜘蛛不应该进入需要登录的页面。我想问题是“如何防止知道链接表单的人请求PDF文件而不登录网站”。

3 个答案:

答案 0 :(得分:3)

我看到了

之间的矛盾
  

成员必须登录,然后他们才能查看存储在虚拟目录中的一些PDF文件

  

这不会阻止Rogue蜘蛛索引PDF文件

对于此目录的任何未经授权的HTTP请求是如何使用除代码401以外的其他内容提供的?胭脂蜘蛛当然不能提供授权cookie。如果目录可供他们访问,那么什么是“成员登录”呢?

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

答案 1 :(得分: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,因为人们经常会用它来实际寻找你认为隐藏的东西。

答案 2 :(得分:1)

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

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

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

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

  4. 现在,即使在安全目录上有PDF请求,HTTP处理程序也会获取请求并检查用户是否已登录。如果没有,则显示错误消息,否则显示该文件。

    不确定是否因为我创建fileInfo对象并发送它而导致性能下降,而不是发送已存在的文件。问题是您不能将Server.Transfer或Response.Redirect转移到* .pdf文件,因为您正在创建一个无限循环,并且响应将永远不会返回给用户。