私は人間ではありませんでした

基盤:いつからなのか、当社サイトの reCAPTCHA が居なくなっていましたので、先程新調して再招致しました。もっとも、設定しようとしたらもともとのキーが空欄だったので、何かの手違いで私が削除してしまったのか知れません。

開発:一方でGooglebot追跡計画ですが、7/4の投稿に仕掛けた「I am a robot」フックに対する、bot発進基地 66.249 からのアクセスを見ますとこのようになっています。

開発:p=9820は当該投稿記事、m=20200704はその日の記事一覧です。このログからfeed=rss2という存在に気づきました。RSSというのはまだ健在の模様です。これはレスポンスのヘッダの中にこのように案内されています。

<link rel="alternate" type="application/rss+xml" title="株式会社 ITS more &raquo; フィード" href="https://its-more.jp/ja_jp/?feed=rss2" />

開発:注目点の一つは、bot がどのドメインからこの記事を見たかです。①bot はまずどこかのドメインでこれを見て、場合によりリバースプロキシされてこのページをフェッチします。追跡用フックにはそのフェッチの際の時間(time)とクライアントアドレス(clnt)を埋め込んでいます。リバースプロキシされた場合には、そのプロキシサーバのアドレスになります。②botはその後、このフェッチしたページのリンクをたぐります。このフックは、その際のアクセスをログに残すCGIを呼ぶようになっています。

開発:まず興味があるのは、①において bot がどのサイトのページとしてこれを見たのかです。②のアクセス時にログに残されたclntの値を見ると、最初は54.238。これは delegate.org からのリバースプロキシ。次に 18.181。これは新NSからのリバースプロキシです。そして 66.249から。これは bot が直接このターゲットサイトを参照しているということです。

開発:そういうこの記事を書き始めてすぐにまた、Googolebot からのヒットが記録されました。10分前ですね。

20200707-091655 66.249.64.170 type=ImRobot&time=1593878281&clnt=106.73.xxx.xxx&quri=https://its-more.jp/ja_jp/?p=9820

基盤:clnt=106.73 てうちのアドレスですね。うちがフェッチしたページから bot がたどった?

開発:どういう意味でしょうね。…私がそういうフックを埋め込んでしまったのか... あるいはうちがアクセスした時の内容がnginxにキャッシュされて、それが bot に返されたとか…

社長:特定時刻の特定のクライアント用に生成したページが別のクライアントに渡ってしまうのは色んな意味でよろしくないですね。

開発:WordPressのページは生成にそこそこ処理がかかっていると思いますので、キャッシュしたいという動機は理解できるのですが…

開発:時系列を推測すると、このページ(p=10343)に bot が気づいてフェッチした、その中にあった p=9820 のリンクをたぐった、さらにその中にあったImRobotフックにかかったという事かと思うので、昔のキャッシュというのはちょっと無いように思われます。このtimeって… ftime '%Y%m%d-%H%M%S' 1593878281 ... 20200705-005801 ですね。

基盤:その時刻のアクセスログ…

xso% grep 00:58:01 *0705 | grep 9820
106.73.xxx.xxx - - [05/Jul/2020:00:58:01 +0900] "GET /ja_jp/?p=9820 HTTP/2.0" 200 45233 "https://its-more.jp/ja_jp/?p=9975" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.98 Safari/537.36" "-"

基盤:実際うちのMacからのアクセスですね。ていうか、いま現在もそのキャッシュが残っているとか… ns1 からアクセスしてみます。

基盤:さすがにそういう事は無いですね。ほかからもアクセスしてみる… やはり毎回自分用のページが返ってきます。curl の代わりに DeleGate でやっても同じ。HTTPリクエスト時にキャッシュを最大限尊重するようなオプションてあるんですかね?

社長:あったような。というか、昔のキャッシュを bot が持ってて、その if-modified に対する応答に 304 で返しているとか?

基盤:304 は無いですね。botがフックをヒットした今日の 09:16までに、5回もとのページをフェッチしてます。毎回サイズが違うので、どうも同定が難しいような。。

開発:うーん。最終的に返したHTTPレスポンスのハッシュ値でも残してくれれば。というか、全体は違っても、インクルードされている記事の部分は同じだったかもという話ですか…

基盤:うーん。timeの値とclntのアドレスはセットなので、その時間にそのクライアントがアクセスした時に生成されたデータである、とうことは同定できてると思うんですよね。だから、うちがその時にアクセスした時に出来たページ(ImRobotフック)をbotが見ている。なぜなのか。

社長:nginx のキャッシュ説なら簡単なんですが、curl や DeleGateでやった限りでは、アクセス毎に生成されているように見える。

基盤:User-Agent を見て、生成の振る舞いが変わるとか、キャッシュが違うとか。

開発:そうか、User-Agent ごとにキャッシュが違うとか?

基盤:直接キャッシュファイルを見れればいいんですけどね。サーバ系は xso の手中にあり…

開発:おっとまた Googlebot さん来ました。

20200707-104016 66.249.64.172 type=ImRobot&time=20200707-103813&clnt=18.181.38.61&quri=https://its-more.jp/ja_jp/?m=20200704

基盤:ns1 経由で07/04のページをフェッチして、その中のImRobotフックを2分後に手繰ったと。

開発:うーん。わからん。これは一丁、p=9820 を更新してもう一度振る舞いを追跡してみますか。更新して、たとえばAzureからアクセスしてページを生成して、その後 bot が何を手繰ってくるか見る。あるいは新しい記事に新しいフックをかける。

基盤:そうですね。とにかく bot にもう一度、ページ本体をロードしてもらって。

開発:速攻でおいでなすったけど、これは自分でns1経由でロードしたページの中のを叩いてますね。なかなか直にはxsoまで来てくれない。

基盤:ていうか、フックのURLの中の query 部分を適当に変えて乱打してくるロボットが居ますけど、なんですかねこれ?

開発:そもそも WordPress自体が、何のためなのかページ変更後に3発打ってくるんですが、これも意味がわからない。2つ目の&以降を削除している。これはページ内のリンクが正常か確認しに来てるのかな?

基盤:queryじゃないパスの形にしたらいいんじゃないですかね。

開発:では、こんな感じで。

基盤:おや?今回はWordPress側からの速攻pingが来ないですね。

開発:なんですかね?まさかquery付のアンカーだけ探ってるとか。ちょっと嫌な感じですね・・・ もいっかいクリック。

基盤:おっと来ました。query がという話では無いですね。最初にだれかがそれを踏んだ時に来る?

開発:しかも今度は最初の / の後を切断して来ました。じゃあもう & も / もやめて。, ではどうでしょう。Googlebot、3分くらいで来ますね。WordPress なんでも最初で切るのか?

<a href=http://ns1.its-more.jp/glogre/ImRobot2.0[htreqInfo]>

開発:ああ、単にHTMLの中に書いてある部分だけ使っているということですね。しかしこの3回のアクセスは何のつもりなのか?

基盤:HTTPサーバ側のログを見ると、同じ URL に対して、HEAD, GET, HEAD してます。

基盤:おや、今度は6回アクセスして来るようになりましたね。

開発:PHPで生成した時にだけ来るんですかね。これではどうかな?

開発:そうきましたか。ではもう一丁追加。

開発:ということで現象をまとめると、WordPress では投稿ページを更新するたびに、そのページ内にある参照URLのリクエストを3回発生します。HEAD、GET、HEAD というメソッドの順序です。

社長:ピンバックが何とかいうのと関係しているんですかね?

基盤:せきこみおばさん、今日はさらにひどいですね。あ、くしゃみした。

開発:うーん、メソッドが POSTでないですし、Referer フィールドも適切に設定されていないし。なにか適切に情報を伝えてる感じが無いですね。

社長:どのWordPressからですということだけは伝えていると。

広報:ご発注の「私は人間ではありませんボタン」を3案作ってみました。

開発:うーむ、真ん中のは人間様の目に触れるとすごく不快感を与えてしまいますね。

基盤:3番目はやや不安感を与えます。

開発:ではとりあえず、1番目のやつを使いましょう。

基盤:やはりHREFよりFORMにするとロボットの気をひきますかね。

開発:そうしましょう。それを人様の目には触れないようにdetailsで隠すと。

開発:details を開くとこうなります。

基盤:これをクリックする人は確かに人間では無さそうですね。

開発:今後も折を見てこの ImRobot2 を改訂しましょう。

社長:今日はどちらかというと WordPress が自動でリンク先の調査?に行くというところが興味深かったですね。

開発:そうですね。どういうことなのか調査したいと思います。

-- 2020-0707 SatoxITS

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です