Skip to content

Instantly share code, notes, and snippets.

@sonodar
Last active April 2, 2019 06:28
Show Gist options
  • Save sonodar/6090a31778ed318304b8e67729a823a7 to your computer and use it in GitHub Desktop.
Save sonodar/6090a31778ed318304b8e67729a823a7 to your computer and use it in GitHub Desktop.
Googlebot からのアクセスかどうかを厳密にチェックする
<?php
/**
* Googlebot からのアクセスかどうかを厳密にチェックするクラス。
* 使い方: GoogleBotStrictVerifier::isGoogleBot()
*/
class GoogleBotStrictVerifier
{
/**
* User-Agent および IP の逆引きから Googlebot かどうかを判定する。
* @return boolean
*/
public static function isGoogleBot()
{
if (!self::isGoogleBotUserAgent()) {
return false;
}
return self::isGoogleIpAddr();
}
/**
* Googlebot の IP アドレスかどうかを DNS 逆引きで判定する。
* @return boolean
*/
private static function isGoogleIpAddr()
{
$ip = self::getRemoteIpAddr();
if(!filter_var($ip, FILTER_VALIDATE_IP)) {
return false;
}
$hostname = gethostbyaddr($ip);
if (!preg_match('/(?:\.googlebot|google)\.com$/i', $hostname)) {
return false;
}
$hosts = gethostbynamel($hostname);
return is_array($hosts) && in_array($ip, $hosts, true);
}
/**
* User-Agent が Googlebot かどうかを判定する。
* @return boolean
*/
private static function isGoogleBotUserAgent()
{
if (!isset($_SERVER['HTTP_USER_AGENT'])) {
return false;
}
return preg_match('/googlebot/i', $_SERVER['HTTP_USER_AGENT']);
}
/**
* クライアント IP アドレスを取得する。
* @return string
*/
private static function getRemoteIpAddr()
{
if (isset($_SERVER['HTTP_CLIENT_IP']) && !empty($_SERVER['HTTP_CLIENT_IP'])) {
return $_SERVER['HTTP_CLIENT_IP'];
}
if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && !empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ips = explode(', ', $_SERVER['HTTP_X_FORWARDED_FOR']);
return reset($ips);
}
if (isset($_SERVER['REMOTE_ADDR']) && !empty($_SERVER['REMOTE_ADDR'])) {
return $_SERVER['REMOTE_ADDR'];
}
return '127.0.0.1';
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment