如何防止未经授权的蜘蛛侠

时间:2009-01-16 03:06:04

标签: asp.net iis

我想阻止来自我们网站的自动html抓取,同时不影响合法抓取(googlebot等)。有没有什么东西可以实现这一目标?我甚至使用了正确的术语吗?

编辑:我主要是希望阻止人们恶意这样做。即他们不会遵守robots.txt

EDIT2:如果通过“使用率”阻止使用...即如果检测到自动化并且流量不是来自合法(谷歌,雅虎,MSN等)IP,则验证码继续浏览。

7 个答案:

答案 0 :(得分:8)

即使不是不可能,也很难实现。许多“流氓”蜘蛛/爬虫不会通过用户代理字符串识别自己,因此很难识别它们。您可以尝试通过其IP地址阻止它们,但很难跟上为阻止列表添加新的IP地址。如果使用IP地址,也可以阻止合法用户,因为代理使许多不同的客户端显示为单个IP地址。

在这种情况下使用robots.txt的问题是蜘蛛可以选择忽略它。

编辑:速率限制是可能的,但它遇到了识别(并跟踪)“好”和“坏”用户代理/ IP的一些相同问题。在我们编写的系统内部页面查看/会话计数中,我们根据页面查看率消除了会话,但我们也不担心消除“好”蜘蛛,因为我们不希望它们在数据中计算。我们不会阻止任何客户实际查看页面。

答案 1 :(得分:6)

一种方法是设置HTTP tar坑;嵌入一​​个只对自动抓取工具可见的链接。链接应该转到一个填充随机文本和链接到自己的页面(但有其他页面信息:/tarpit/foo.html,/tarpit/bar.html,/tarpit/baz.html - 但脚本位于/ tarpit /处理200结果的所有请求)。

如果用户代理是谷歌或雅虎,为了让好人远离维修站,请为您的主页生成302重定向。

它并不完美,但它至少会减慢天真的速度。

编辑:根据Constantin的建议,您可以将tar pit标记为robots.txt中的限制。好人使用符合此协议的网络蜘蛛将远离焦油坑。这可能会消除为已知的好人生成重定向的要求。

答案 2 :(得分:5)

如果您想保护自己免受通用抓取工具的侵害,请使用蜜罐。

例如,请参阅http://www.sqlite.org/cvstrac/honeypot。优秀的蜘蛛不会打开此页面,因为网站robots.txt明确禁止它。人类可以打开它,但不应该点击“我是蜘蛛”链接。坏蜘蛛肯定会跟随这两个环节,因此会背叛它的真实身份。

如果专门为您的网站创建了抓取工具,您可以(理论上)创建一个移动的蜜罐。

答案 3 :(得分:2)

我一般都同意蜜罐方法。但是,我将唯一链接指向被“/robots.txt”阻止的页面上的蜜罐页面/资源 - 以及被此类阻止的蜜罐。这样,恶意机器人必须违反“禁止”规则TWICE以禁止自己。手动跟踪不可点击链接的典型用户可能只执行此操作一次,并且可能找不到包含蜜罐URL的页面。

蜜罐资源将恶意客户端的违规IP地址记录到一个文件中,该文件在Web服务器配置的其他位置用作IP禁令列表。这样,一旦列出,Web服务器就会阻止该客户端IP地址的所有进一步访问,直到列表被清除。其他人可能会有某种自动过期,但我相信只能从禁令列表中手动删除。

除此之外:我也对垃圾邮件和我的邮件服务器做了同样的事情:在我清除日志文件之前,第一封邮件被禁止发送任何进一步邮件的网站向我发送垃圾邮件。虽然我在应用程序级别实现了这些禁令列表,但我也有防火墙级动态禁止列表。我的邮件和Web服务器也在它们之间共享禁止的IP信息。对于一个不熟练的垃圾邮件发送者,我认为相同的IP地址可能同时托管恶意蜘蛛和垃圾邮件。当然,那是BotNet之前的版本,但我从未删除它。

答案 4 :(得分:1)

robots.txt仅在蜘蛛尊重它时才有效。您可以创建一个HttpModule来过滤掉您不想抓取您网站的蜘蛛。

答案 5 :(得分:0)

你应该做好防火墙在检测到恶意使用时所做的事情 - 让他们继续前进,但不要给他们任何其他东西。如果你开始投掷403或404,他们就会知道出了什么问题。如果您返回随机数据,他们将继续开展业务。

要检测恶意使用,请尝试在搜索结果页面(或用作站点地图的页面)上添加陷阱链接,并使用CSS隐藏它。需要检查他们是否声称自己是一个有效的机器人并让他们通过。您可以存储他们的IP以供将来使用和快速ARIN WHOIS搜索。

答案 6 :(得分:0)

1 安装 iptables 和 tcpdump (for linux) 2 检测和自动化良好的流量,例如 googlebot 在perl中

$auth="no";
 $host=`host $ip`;
 if ($host=~/.googlebot.com\.$/){$auth="si";}
 if ($host=~/.google.com\.$/){$auth="si";}
 if ($host=~/.yandex.com\.$/){$auth="si";}
 if ($host=~/.aspiegel.com\.$/){$auth="si";}
 if ($host=~/.msn.com\.$/){$auth="si";}

注意:主机 googlebot 是 55.66.249.66.in-addr.arpa 域名指针 crawl-66-249-66-55.googlebot.com。

3 创建计划或服务捕获流量并按主机计数数据包并插入数据库或在您的站点中插入 sql 查询插入 ip 以计算 ip 流量 例如在 perl

$ip="$ENV{'REMOTE_ADDR'}";
    use DBI;
    if ($ip !~/^66\.249\./){
    my $dbh = DBI->connect('DBI:mysql:database:localhost','user','password') or die print "non connesso:";
    my $sth = $dbh->prepare("UPDATE `ip` SET totale=totale+1, oggi=oggi+1, dataUltimo=NOW() WHERE ip ='$ip'");
          $sth ->execute;
          $rv = $sth->rows;
          if ($rv < 1){
          my $sth = $dbh->prepare("INSERT INTO `ip` VALUES (NULL, '$ip', 'host', '1', '1', 'no', 'no', 'no', NOW(), 'inelenco.com', oggi+1)");
          $sth ->execute;
          }
    $dbh->disconnect();
    }

或者通过服务嗅探流量,例如在 perl 中

$tout=10;
    $totpk=3000;
        $tr= `timeout $tout tcpdump port $porta -nn -c $totpk`;
        @trSplit=split(/\n/,$tr);
        undef %contaUltimo;
        foreach $trSplit (@trSplit){
        if ($trSplit=~/IP (.+?)\.(.+?)\.(.+?)\.(.+?)\.(.+?) > (.+?)\.(.*?)\.(.+?)\.(.+?)\.(.+?): Flags/){
        
        $ipA="$1.$2.$3.$4";
        $ipB="$6.$7.$8.$9";
        if ($ipA eq "<SERVER_IP>"){$ipA="127.0.0.1";}
        if ($ipB eq "<SERVER_IP>"){$ipB="127.0.0.1";}
        $conta{$ipA}++;
        $conta{$ipB}++;
        }

4 如果流量大于 $max_traffic,则阻止主机 例如在 perl

if ($conta->{$ip} > $maxxDay){block($conta->{$ip});}
sub block{
my $ipX=shift;
if ($ipX =~/\:/){
   $tr= `ip6tables -A INPUT -s $ipX -j DROP`;
   $tr= `ip6tables -A OUTPUT -s $ipX -j DROP`;
   print "Ipv6  $ipX blocked\n";
   print $tr."\n";
   }
   else{
   $tr= `iptables -A INPUT -s $ipX -j DROP`;
   $tr= `iptables -A OUTPUT -s $ipX -j DROP`;
   print "iptables -A INPUT -s $ipX -j DROP";
   print "Ipv4  $ipX blocked\n";
   print $tr."\n";
   }
}

另一种方法是读取日志流量服务器。 例如在 linux /var/log/apache2/*error.log 包含所有查询错误 /var/log/apache2/*access.log 包含所有网络流量 创建一个 Bash 脚本读取日志并阻止坏蜘蛛。 对于块攻击读取所有日志,例如对于块 ssh 攻击读取日志 ssh 错误和块 ip。 iptables -A INPUT -s $ip -j DROP