Security 防止流氓爬行器索引目录

Security 防止流氓爬行器索引目录,security,iis,virtual-directory,web-crawler,Security,Iis,Virtual Directory,Web Crawler,我们有一个安全的网站(在运行Windows server和IIS 5的.NET 2.0/C#中开发),会员必须登录该网站,然后才能查看存储在虚拟目录中的一些PDF文件。为了防止蜘蛛在这个网站上爬行,我们有一个robots.txt,它将禁止所有用户代理进入。但是,这不会阻止流氓爬行器索引PDF文件,因为它们会忽略robots.txt命令。因为文档是安全的,所以我不希望任何爬行器进入这个虚拟目录(即使是好的也不希望) 在网上读几篇文章,想知道程序员(而不是网络管理员)是如何在他们的应用程序中解决这个

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

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

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

  • 创建一个允许流氓蜘蛛进入的蜜罐/陷阱,然后列出它们的IP地址。缺点:这也会阻止来自同一IP的有效用户,需要手动维护此列表,或者有一些方法让成员从列表中删除自己。我们没有一个有效的会员将使用的IP范围,因为该网站是在互联网上

  • 请求头分析:然而,流氓爬行器使用真实的代理名称,因此这是毫无意义的

  • metarobots标签:Cons:只有谷歌和其他有效的蜘蛛才会遵守

  • 有人谈论过使用.htaccess,这应该是好的,但这只适用于apache,而不是IIS

    非常感谢您的任何建议


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

    我发现两者之间存在矛盾

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

    这不会阻止流氓爬行器索引PDF文件

    为什么对这个目录的任何未经授权的HTTP请求都会得到代码401以外的服务?胭脂蜘蛛当然不能提供授权cookie。如果他们可以访问该目录,那么什么是“会员登录”


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

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

    这不会阻止流氓爬行器索引PDF文件

    为什么对这个目录的任何未经授权的HTTP请求都会得到代码401以外的服务?胭脂蜘蛛当然不能提供授权cookie。如果他们可以访问该目录,那么什么是“会员登录”


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

    我假设您指向PDF的链接来自已知位置。您可以检查
    Request.urlReferer
    ,以确保用户来自此内部/已知页面以访问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,因为人们经常使用它来寻找你认为你隐藏的东西。

    我假设你的PDF链接来自已知位置。您可以检查
    Request.urlReferer
    ,以确保用户来自此内部/已知页面以访问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,因为人们经常使用它来寻找你认为你隐藏的东西。

    以下是我所做的(扩展Leigh的代码)

  • 为PDF文件创建了HTTPHandler,在安全目录上创建了web.config,并将处理程序配置为处理PDF文件

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

  • 如果用户有session变量,我将创建一个fileInfo对象并在响应中发送它。注意:不要执行“context.Response.End()”,同时“内容处置”也已过时

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

    由于我正在创建并发送fileInfo对象,而不是发送已经存在的文件,因此不确定是否会影响性能。问题是,您无法将Server.Transfer或Response.Redirect重定向到*.pdf文件,因为您正在创建一个无限循环,并且响应永远不会返回给用户

    以下是我所做的(扩展Leigh的代码)

  • 为PDF文件创建了HTTPHandler,在安全目录上创建了web.config,并将处理程序配置为处理PDF文件

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

  • 如果用户有session变量,我将创建一个fileInfo对象并在响应中发送它。注意:不要执行“context.Response.End()”,同时“内容处置”也已过时