botの大量GETアクセスをきちんとクリックカウン用PHPが処理していたため、リファラ無しの不正なログデータがカウントテーブルに大量に残されてしまっておりました。

これにより、「ディレクトリ型検索エンジンdtnのクリックランキング」が異常な状態になってしまっていたので修正を致しました。

この記事では異常値発生の原因となったbotのご紹介やクリックカウント方式について再度確認をした内容をご紹介したいと思います。

ランキングで異常値発生

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

今日の時点で見ても、まだ異常値がでてしまっておりましたので、しっかり調べてみることにしました。

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

ログデータの確認

クリックランキングのデータ取得時には、リファラ、ホスト名なども一緒に保存していたのですが、リファラがNULLの大量データが連続して入っている時間があることに気が付きました。多分これが異常値が発生する原因のようです。

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

クリックカウント処理を再確認

ログに不正なデータがINSERTされるということは、数年前にも一度見直しをした登録サイトのクリックカウント処理が原因となっているはずなので、プログラムを見直してみました。

改修前の登録サイトのリンクカウント方式

クリックカウント方式見直し前のクリックカウントは、登録サイトのIDをパラメータとして付けたURLをGETパラメータ付きのリンクにして、カウント用PHPでこのパラメータを読み込むことで、カウント処理を行っておりました。

このため、dtn登録サイトのリンクは、全てアフェリエイトのリンクのように「?」と「&」でパラメータを渡すリンク形式となってしまっておりました。

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

経由するrank.php側では、取得したリンクIDのカウントを取った後で、header()を使って登録リンクに301リダイレクトをかけて飛ばしておりました。

PHPでの値取得、リンク先への転送も特に問題はありませんでしたが、カテゴリに登録されたサイトのリンク<a>タグが上記のような内部URLとなるため、被リンクの形式としてあまり好ましくないので、ディレクトリをリニューアルしたタイミングで新方式に変えておりました。

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

見直し後の形式は、<a>タグでは登録サイトへの直リンクを貼りつつ、jQueryでカウントアップを別途取得するという仕様に変えておりました。覚えている方はもう少ないと思いますが、かつて存在したYahoo!のディレクトリでも利用されていたリンク方式で、これだと被リンク元としてきちんと機能はする形になります。

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

ランクアップ用PHPのバグ

フロントのHTML出力はこの形に変えていたのですが、jQueryで取得したIDを受け取り、裏のDBにINSERTをかけるPHPは以前のものをそのまま流用してしまっておりましたので、旧方式の「https://www.dtn.jp/search/rank.php?MODE=OUT&LINK_ID=98&LINK_URL=https://www.dtn.jp/」このようなURLでアクセスすると、すんなりカウントアップをしてしまっておりました。

セキュリティ的にも結構ダメなパターンで、失礼いたしました。

jQueryからしかデータがこないだろうと安易に考え、DB更新前に入れていたチェックもごっそり省いてしまっており、そんなところに、botが取得したURLでGETアクセスを定期的に投げてきていたようです。

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

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

botのアクセス

ところで、先ほどのログに残っていた、リファラが取れなかったり、ホスト名が取れなかった大量のbotアクセスですが、クリックカウントに反映されていることからGETのデータを持たせてあるようですが、何故かそのサイトはID=98(ディレクトリ型検索エンジンdtn)を持ってアクセスしてきていたようです。

MJ12bot

SEO解析系のクローラーがこの動きをしておりましたが、中でも突出して多かったものがMJ12botというホスト名を持つクローラーでした。名前が印象深いbotで、昔からお行儀悪い印象がある気がしていましたが、こんな過疎サイトまで収集にやたら訪れるというのも凄い話です。MJ12の名前を使ったウイルスbotもあるらしいので、全部が全部本物というわけでもなさそうですが。

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

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

おわりに:MJ12の語源

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

ランキング集計をするSQLのINTERVALは一週間程度ですので、異常値分はそのうち消えると思います。最新のクリックランキングはこちらで確認できます。