【发布时间】:2024-05-19 13:45:01
【问题描述】:
我想防止从我们的某个网站自动抓取 html,同时不影响合法的爬虫(googlebot 等)。是否有已经存在的东西来实现这一点?我是否使用了正确的术语?
编辑:我主要是想阻止那些恶意这样做的人。 IE。他们不会遵守 robots.txt
EDIT2:如果检测到自动化并且流量不是来自合法(google、yahoo、msn 等)IP,则通过“使用率”来防止使用如何...即验证码以继续浏览。
【问题讨论】:
我想防止从我们的某个网站自动抓取 html,同时不影响合法的爬虫(googlebot 等)。是否有已经存在的东西来实现这一点?我是否使用了正确的术语?
编辑:我主要是想阻止那些恶意这样做的人。 IE。他们不会遵守 robots.txt
EDIT2:如果检测到自动化并且流量不是来自合法(google、yahoo、msn 等)IP,则通过“使用率”来防止使用如何...即验证码以继续浏览。
【问题讨论】:
这即使不是不可能也很困难。许多“流氓”蜘蛛/爬虫不通过用户代理字符串来识别自己,因此很难识别它们。您可以尝试通过他们的 IP 地址阻止他们,但很难跟上将新 IP 地址添加到您的阻止列表中。如果使用 IP 地址,也可以阻止合法用户,因为代理会使许多不同的客户端显示为一个 IP 地址。
在这种情况下使用 robots.txt 的问题是蜘蛛只能选择忽略它。
编辑:速率限制是一种可能性,但它会遇到一些相同的问题,即识别(和跟踪)“好”和“坏”用户代理/IP。在我们编写的用于进行一些内部页面查看/会话计数的系统中,我们根据页面查看率消除会话,但我们也不担心消除“好”蜘蛛,因为我们也不希望它们计入数据中。我们不会阻止任何客户实际查看页面。
【讨论】:
一种方法是设置一个 HTTP tar 坑;嵌入仅对自动爬虫可见的链接。该链接应该转到一个包含随机文本和自身链接的页面(但带有附加页面信息: /tarpit/foo.html 、 /tarpit/bar.html 、 /tarpit/baz.html - 但脚本位于 /tarpit / 处理结果为 200 的所有请求)。
为了让好人远离坑,如果用户代理是 google 或 yahoo,请生成一个 302 重定向到您的主页。
它并不完美,但它至少会减慢幼稚的速度。
编辑: 正如康斯坦丁所建议的,您可以在 robots.txt 中将焦油坑标记为禁区。使用遵守此协议的网络蜘蛛的好人将远离焦油坑。这可能会消除为已知的好人生成重定向的要求。
【讨论】:
如果您想保护自己免受通用爬虫的侵害,请使用蜜罐。
例如,请参阅http://www.sqlite.org/cvstrac/honeypot。好的蜘蛛不会打开这个页面,因为站点的robots.txt 明确禁止它。人类可以打开它,但不应该点击“我是蜘蛛”链接。坏蜘蛛肯定会跟随这两个链接,因此会暴露其真实身份。
如果爬虫是专门为您的网站创建的,您可以(理论上)创建一个移动蜜罐。
【讨论】:
我一般同意蜜罐方法。但是,我将蜜罐页面/资源的唯一链接放在被“/robots.txt”阻止的页面上 - 以及被此类阻止的蜜罐。这样,恶意机器人必须两次违反“禁止”规则才能禁止自己。一个典型的用户手动点击一个不可点击的链接可能只会这样做一次,并且可能找不到包含蜜罐 URL 的页面。
蜜罐资源将恶意客户端的违规 IP 地址记录到一个文件中,该文件用作 Web 服务器配置中其他地方的 IP 禁止列表。这样,一旦列出,Web 服务器就会阻止该客户端 IP 地址的所有进一步访问,直到列表被清除。其他人可能会有某种自动过期,但我只相信手动从禁止列表中删除。
除此之外:我也对垃圾邮件和我的邮件服务器做同样的事情:在我清除日志文件之前,将垃圾邮件作为第一条消息发送给我的站点将被禁止发送任何进一步的消息。虽然我在应用程序级别实现了这些禁止列表,但我也有防火墙级别的动态禁止列表。我的邮件和网络服务器也在它们之间共享被禁止的 IP 信息。对于一个不成熟的垃圾邮件发送者,我认为同一个 IP 地址可能同时托管恶意蜘蛛和垃圾邮件发送者。当然,那是 BotNet 之前的版本,但我从未将其删除。
【讨论】:
robots.txt 仅在蜘蛛尊重它时才有效。您可以创建一个 HttpModule 来过滤掉您不想抓取您网站的蜘蛛。
【讨论】:
当好的防火墙检测到恶意使用时,你应该做他们所做的事情——让他们继续运行,但不要给他们任何其他东西。如果你开始抛出 403 或 404,他们就会知道有问题。如果您返回随机数据,他们将继续他们的业务。
不过,为了检测恶意使用,请尝试在搜索结果页面(或他们用作站点地图的页面)上添加陷阱链接,并使用 CSS 将其隐藏。需要检查他们是否声称自己是有效的机器人并让他们通过。您可以存储他们的 IP 以供将来使用和快速 ARIN WHOIS 搜索。
【讨论】:
1 安装 iptables 和 tcpdump(适用于 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}++;
}
如果流量 > $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
【讨论】: