2025/10/26 12:03 Trap Bots on Your Server

ロボ子、今日はウェブサイトにクローラーの罠を仕掛けてボットを捕獲するお話じゃ。

クローラーの罠ですか、博士。それは一体どういう仕組みなのでしょうか?

ふむ、マルコフ連鎖を使って生成した無意味なテキスト、つまりgarbageをクローラーにクロールさせるのじゃ!

マルコフ連鎖で生成されたテキストですか。なんだか難しそうですね。

難しくないぞ! 要は、それっぽいけど意味のない文章を大量に作って、クローラーを迷わせるってことじゃ。

なるほど。それで、どうやってクローラーを罠にかけるのですか?

メインのウェブサイトからそのgarbageへのリンクを設置するのじゃ。そうすると、クローラーのキューがgarbageで埋め尽くされる!

まるでアリ地獄みたいですね。でも、それだと検索結果からサイトが消えてしまいませんか?

そこがミソじゃ! garbageのURLを`/robots.txt`で除外するから、検索結果からは消えないのじゃ!

なるほど、賢いですね! ユーザーエージェントによるフィルタリングやリンクを隠すことも推奨されているみたいですね。

そうじゃ、そうじゃ。さらに、テキストプリプロセッサ`process.py`やgarbageサーバー`babble.c`、マルコフ連鎖の学習用テキストファイルが必要になるぞ。

`book1.txt`、`book2.txt`、`book3.txt`ですね。1000~50000語程度のテキストデータを使うんですね。

その通り! そして、生成されたテキストの断片を含む`chainX.txt`ファイルも必要じゃ。

`process.py`の`context_length`変数を調整するんですね。テキストが短い場合は1、長い場合は2と。

よく覚えておるな、ロボ子! ウェブサーバーの設定も重要じゃ。未使用のパスへのリクエストを`localhost:[未使用ポート]`に転送するのじゃ。

`babble.c`で`PORT`と`URL_PREFIX`を設定するんですね。

ページ生成は50-200マイクロ秒/スレッド、RAM使用量は100KB~5MB程度じゃな。レスポンスサイズは約1KB(gzip圧縮時)じゃ。

Pythonスクリプトがテキストを単語ペアまたはトリプレットに分割して、サーバーがそれらを繋ぎ合わせるんですね。リクエストされたパスに基づいてテキストが生成されるとは、面白い仕組みです。

`chainX.txt`ファイルには、特定の単語で始まる単語ペアが格納されておる。`context_length`が2の場合は、ハイフンで区切られた単語ペアが逆順で格納されるんじゃ。

リクエストごとに課金されるクラウドサービスを使用している場合は注意が必要ですね。5XXエラーが発生した場合は、ウェブサーバーの設定を確認する必要がある、と。

ページはロードされるがリンクが壊れている場合は、`URL_PREFIX`を確認してコードを再コンパイルじゃ!

なんだか色々と設定が大変そうですが、効果はありそうですね。

そうじゃな。でも、一番の罠は、この説明を聞いて実際に試してみようと思う人がいることかもしれんぞ。ふぉっふぉっふぉ。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。