Last active
April 2, 2019 06:28
-
-
Save sonodar/6090a31778ed318304b8e67729a823a7 to your computer and use it in GitHub Desktop.
Googlebot からのアクセスかどうかを厳密にチェックする
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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