Googleのボットの見分け方で下記を教えてもらったのですが


http://support.google.com/webmasters/bin/answer.py?hl=ja&answer=80553

これをPHPで制御するにはどのような書き方をすればよいでしょうか?
※偽装が通じない方法をお願いいたします。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2012/01/05 04:42:59
  • 終了:2012/01/12 04:45:03

回答(2件)

id:a-kuma3 No.1

a-kuma3回答回数4365ベストアンサー獲得回数18012012/01/05 08:02:58

ポイント50pt

http://smbrown.wordpress.com/2009/04/29/verify-googlebot-forward-reverse-dns/
上記のページに期待するであろう PHP の関数のコードがあります。

tdoi さんがコメントで書かれている関数と考え方は同じですが、以下のところが違います。

  • google 以外のクローラーを考慮している
  • gethostbyaddr で引き当てたホスト名から gethostbyname で更に IP アドレスを引き当て、念のためにリクエストヘッダの IP アドレスと一致するかを確認している
id:kodairabase No.2

kodairabase回答回数661ベストアンサー獲得回数802012/01/05 10:26:38

ポイント50pt
if(eregi("Googlebot",$_SERVER['HTTP_USER_AGENT']{
    // it says it's the lovely google
    $ip = $_SERVER['REMOTE_ADDR'];
    $name = gethostbyaddr($ip);
    // Now we have the name, look up the corresponding IP address.
    $host = gethostbyname($name);
    if(eregi("Googlebot",$name){
        if ($host == $ip){
            // lovely, let it in
        }else{
            // evil, send it away
        }
    }else{
    // Liar, Liar, Pants on fire
    }
}else{
    // Continue
}

Identifing the Googlebot gethostbyname & gethostbyaddr
http://www.liamdelahunty.com/tips/php_gethostbyaddr_googlebot.php

他1件のコメントを見る
id:windofjuly

問題点はeregiだけではないですね
もっと大きな問題点として、gethostbyaddr と
gethostbyname による確認方法の最大の欠点を無視してることですね

奇しくもkodairabaseさんの前回質問への回答の中で、
その最大の欠点を暴露しているのは、何とも笑えないジョークでしょうか?
http://q.hatena.ne.jp/1325596736#a1125899

Googlebot が使用する IP アドレスは、その時々で変化します

2012/01/05 13:48:04
id:tdoi

この判定だと、指定したIPの逆引きで、
googlebot.example.com
foogooglebotbar.com
みたいのを登録しておくと、詐称できちゃいますよ。

2012/01/05 13:51:48
  • id:tdoi
    こんな感じ。動作確認してないので、コメントで。

    >|php|
    function isGoogleBot()
    {
    $addr = $_SERVER["REMOTE_ADDR"];
    $host = gethostbyaddr($addr);
    if (!preg_match('/^.*?\.googlebot\.com$/is', $host)) {
    return false;
    }

    $ip = gethostbyname($host);

    return $ip == $addr;
    }
    ||<
  • id:a-kuma3
    >もっと大きな問題点として、gethostbyaddr と
    >gethostbyname による確認方法の最大の欠点を無視してることですね
    ぼくが引っ張ってきたページも、同じような方法で、真っ当な bot かどうかを確認してます。
    一応、コードを読んで正しいと思ったので、紹介したんですが、ぼくの理解に間違いがあるでしょうか?

    ぼくの理解。
    ・User-Agent は、簡単に詐称できちゃうので、それだけで判定しない
    ・リクエストヘッダの Host についても同様
    ・IPアドレスが Google のものかどうかを DNS 逆引きで確認する
    ・DNS逆引き詐称の可能性があるので、逆引きで得られたホスト名で、DNS正引きして、
     逆引き詐称が無いことを確認する
    ・DNS へのトラフィックが増えるのは嫌な感じなので、軽い方法から試していく

    「軽い方法から試す」という意味では、逆引きで得られたホスト名のドメインを確認してから、
    正引きをして、詐称が無いことを確認する、という方が良いのかもしれません。

    というか、「逆引き→正引き」は、質問文にある support.google.com のページで書かれていることか。
    最後の最後で、
    >The best way to identify accesses by Googlebot is to use the user-agent (Googlebot).
    とか書いてあるのが意味不明ですが =)

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません