googlebotをはじめとして、サイトには日々クローラーが大量に訪問していますが、中には少々怪しい動きをするbotのようなクローラーもたくさん存在します。

そんなbotの一つが、ディレクトリの登録サイトのクリックカウント用に設置をしているPHPに対して、大量のGETアクセスを直接投げ付けていたようで、プログラム側にbot対策も全く用意していなかったこともあり、リファラ無しのデータがクリックカウントログのテーブルに大量に残されてしまっていることに気が付きました。

そのデータを使っている「dtnのクリックランキング」の結果もめちゃくちゃな状態になってしまっていたので、急ぎプログラムの修正をやってみることにしました。

そこで、この記事では、原因となったタチの悪いbotや、クリックカウントプログラム見直しの流れなどについてご紹介したいと思います。

クリックランキングで異常値発生

Pagespeed APIでスクリーンショットを取得の記事でも、クリックランキングでディレクトリ型検索エンジンdtnのクリック数だけ異常値になっているとご紹介をしましたが、まだ現象が続いていたので、しっかり調べてみることにしました。

ほかのサイトが1クリックとかばかりなのに、dtnだけ788とか異常値がでてしまっています。さすがにあり得ない感じです。

dtn.jpの登録サイトクリックランキングで1サイトだけ数値が異常になる
同じ集計期間でdtnディレクトリだけ800弱に!?

クリックカウントログデータの確認

dtnのカテゴリに登録されているリンクがクリックされた際には、クリックされたサイトのIDだけでなく、リファラ、ホスト名などのブラウザから取得可能な値も一緒に保存はしていました。

そのクリックカウントログのテーブルを見てみると、リファラ・エージェントなどの値がNULLのデータが連続して大量に入っている瞬間があることがわかりました。

カウントされたサイトのIDを見るとdtnのIDでしたので、これが異常値発生の原因のようです。

パラメータが取得できない大量のログイメージ
リファラがNULLのデータが連続して発生

クリックカウント用プログラムを再確認

数年前に大きく作り直した、登録サイトのクリックカウント処理が原因となっていることは明らかなので、改めてクリックカウントプログラムを書き直すことにしました。

改修前のリンククリックカウント方式

今の方式に変える前のリンククリックカウントは、登録サイトのID・URLをGETのパラメータとしてリンクに付けるという、昔ながらのカウント方法にしていました。↓みたいな感じです。

<a href="https://www.dtn.jp/search/rank.php?MODE=OUT&LINK_ID=98&LINK_URL=https://www.dtn.jp/">ディレクトリ型検索エンジンdtn</a>

dtnのカテゴリに登録された全サイトのaタグでは、「//www.dtn.jp/search/rank.php?MODE=OUT&LINK_ID=」というURLを持たせていたので、まだおバカちゃんだったgoogleさんが、rank.phpのページランク(ページランク(PageRank)は、Googleが開発したウェブサイトのランキングアルゴリズムの一つです。今はもうない指標ですが。)を超高く評価するといった珍事もあったりしました。

rank.php側では、取得したリンクIDのカウントを取った後で、header()を使って登録リンクに301リダイレクトをかけて飛ばしていましたが、idを元にURLをDBから引っ張るというのもできていなかったので、GETパラメータにURLを仕込むといったショボい作りのままやってしまってました。

もちろん、301リダイレクト自体は問題なくできていましたが、カテゴリに登録されたサイトの<a>タグリンクが上記のような内部URLとなるため、被リンクの形式としても宜しくないとは思ったので、ディレクトリをリニューアルしたタイミングで今の方式に変えました。

改修後のjQueryを使ったリンククリックカウント方式

見直し後は、<a>タグには登録サイトのリンクをきちんと設定しつつ、jQueryでカウントアップを別途取得するという方式に変えることにしました。

覚えている人はもういないと思いますが、かつて存在したYahoo!のディレクトリでも利用されていたリンクのクリックカウント方式もこれでした。被リンク元としての価値はさておき、<a>タグのリンクとして問題ない形にすることはできます。

<a href="https://www.dtn.jp/" class="click-count" id="98" d_code="98">ディレクトリ型検索エンジンdtn</a>

カウントアップ用PHP側の考慮不足

クリックカウントの方式を変えた際、フロントのHTML・js側はこの作りに変えていたのですが、取得したIDを受け取ってDBにINSERTをかけるPHPは以前のものをそのまま流用してしまっていたため、先ほどご紹介をしたGETパラメータ付きのURL「//www.dtn.jp/search/rank.php?MODE=OUT&LINK_ID=」にアクセスすると、すんなりカウントアップをしてしまっておりました。

ほんと申し訳ございません。

jQuery経由でしかデータがこないだろうと安易に考えてしまい、DB更新前に入れていたチェックもごっそり省いてしまっていて、そんなところに、botが取得したURLでGETアクセスを定期的に連続投入していたようです。なんでこんな過疎サイトに大量botを飛ばしていたのかはよくわかりませんが、、、

そのあたりの不具合をまとめて修正し、無事dtnディレクトリのランキングを正常化させることができました。

dtn.jpトップページ下部にある最新クリックサイトのデータも正常になる
無事ディレクトリdtnが常に出てこなくなりました

怪しいbotのアクセス

先ほどのログに残っていた、リファラが取れなかったり、ホスト名が取れなかった大量のbotアクセスですが、何故かそのサイトはID=98(ディレクトリ型検索エンジンdtn)のURLを持ってアクセスしていたようです。

MJ12bot

SEO解析系のクローラーがこの動きをしているようでしたが、中でも突出して訪問数が多かったものがMJ12botというホスト名を持つクローラーでした。印象深い名前のbotで、昔からお行儀悪い印象があるbotだったので知っている人も多いと思いますが、こんな過疎サイトまで収集にやたら訪れていたというのも凄い話です。

ちなみに、MJ12のサイトを見ると、クローラーが集めたデータをSite Explorer(有料)というもので見れるようですが、無料お試しができるというので見てみると、被リンクの増減を過去/現在で見れるとかでした。どれだけ世界中のリンクデータを収集して回っているのやらとは思ってしまいます。

最近では、MJ12の名前を使ったウイルスbotもあるらしいので、全部が全部本物というわけでもなさそうですが、皆さんもご注意ください。

SEO解析サイトのMJ12によるdtn.jpの分析結果イメージ
有料の会員プランに加入していないと見れないものばかり

おわりに:MJ12の語源

MJ12は、あのMajestic12(マジェスティック12)から付けてるのでしょうが、お陰で昔TVでやっていた矢追純一のUFOスペシャルを久々に思い出してしまいました。心霊番組以上に怖かった記憶があります。

以上、いかがでしたでしょうか。最新のクリックランキングはこちらで確認できますので、ぜひご参照ください。