要正确验证访问者是否来自搜索引擎,您需要的不仅仅是检查容易被欺骗的 User-Agent。
正确的方法是查找 IP 的主机名并快速检查它是否与我们知道搜索引擎爬虫使用的任何主机名匹配。
如果主机名与已知爬虫之一匹配,那么您查找主机名的 IP 并查看两者是否匹配。如果其中一个步骤失败,则您有一个虚假的搜索引擎爬虫正在访问。
以下函数接受 IP 并遵循前面提到的步骤。它识别百度、必应、谷歌、雅虎和 Yandex。
/**
* Validate a crawlers IP against the hostname
* Warning - str_ends_with() requires PHP 8
*
* @param mixed $ip
* @return boolean
*/
function validate_crawler_ip( $testip ) {
$hostname = strtolower( gethostbyaddr( $testip ) );
$valid_host_names = array(
'.crawl.baidu.com',
'.crawl.baidu.jp',
'.google.com',
'.googlebot.com',
'.crawl.yahoo.net',
'.yandex.ru',
'.yandex.net',
'.yandex.com',
'.search.msn.com',
);
$valid_ip = false;
foreach ( $valid_host_names as $valid_host ) {
// Using string_ends_with() to make sure the match is in the -end- of the hostname (to prevent fake matches)
if ( str_ends_with( $hostname, $valid_host ) ) { // PHP 8 function
$returned_ip = gethostbyname( $hostname );
if ( $returned_ip === $testip ) {
// The looked up IP from the host matches the incoming IP - we have validated!
return true;
}
}
}
// No match - not valid crawler
return false;
}