doudonn WEB制作やサーバーの話とかいろいろ

DokuWikiのbot対策(botに勝手に編集されないようにする)

doudonn 更新日:
DokuWikiのbot対策(botに勝手に編集されないようにする)

DokuWikiはbotが天敵

前回はbotにかなり苦しめられました。
対策等の話をしたい。

1、なぜDokuWikiはbotが天敵なのか?

あらゆるリンクをクリックしていく=勝手に編集される。

「元に戻す」などのリンクも全てクリックします。
そのため、全ページロールバックしたりする。
DokuWikiというより、Wiki全般はbot対策が必須です。

Googlebotは「nofollow」や「robots.txt」を守ってくれるので問題無いのですが、
その他のやりたい放題botが問題です。

2、Dokuwikiのbot対策

<!--
危険!
危険!
-->
<!--botトラップのリンクです。絶対にクリックしないでください。永遠にアクセス拒否されます-->
<a style="display:none;" rel="nofollow" href="https://danmakuwiki.com/mitaradame/abon.php">あ</a>
<a style="display:none;" rel="nofollow" href="https://danmakuwiki.com/mitaradame/abon.php">あ</a>
<!--botトラップのリンクです。絶対にクリックしないでください。永遠にアクセス拒否されます-->
<!--
危険!
危険!
-->

これを「/lib/tpl/dokuwiki/main.php」の「body」タグの直後・直前に入れます。

botのリンクを辿る動作は、一番上か一番下からです。
そのため、最初か最後にbotトラップとなるリンクを設置する。
訪問者には見えないように「display:none」を指定してください。
「robots.txt」でもクロールしないよう指定を。

そして、次にbotに動作させるPHPファイルの中身を。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8" />

<?php
require_once '/home/xxxxx';//DBのパスワード類

//日付
date_default_timezone_set('Asia/Tokyo');
$date = date("Y/m/d H:i:s");

//IP
$botip = $_SERVER["REMOTE_ADDR"] ;

//ユーザーエージェント
$useragent = $_SERVER['HTTP_USER_AGENT'];

//リファラー取得
$referer = $_SERVER['HTTP_REFERER'];

try{

$pdo = new PDO($dsn, $user, $password);

$stmt = $pdo->prepare( "INSERT INTO bot(botip,useragent,referer ,date) VALUES (:botip,:useragent,:referer ,:date)");
$stmt->bindParam(':botip',$botip,PDO::PARAM_STR);
$stmt->bindParam(':useragent',$useragent,PDO::PARAM_STR);
$stmt->bindParam(':referer ',$referer,PDO::PARAM_STR);
$stmt->bindParam(':date',$date,PDO::PARAM_STR);
$stmt->execute();
}

//接続に失敗した際のエラー処理
catch (PDOException $e){
print('エラーが発生しました。:'.$e->getMessage());
die();
}

?>
</head>
<body>
botとみなし当サイトへのアクセスを永遠に拒否しました。
</body>
</html>

あのリンクを踏んだbotのIPアドレスなどをデータベースへ登録します。

で、あとは訪問者全員をそのIPアドレスと照合して、
合致すればbot=アクセス拒否という処理をします。

<?php

$userip = $_SERVER["REMOTE_ADDR"] ;

require_once '/home/xxxxxxxxxx';//DBのパスワード類

try{

$pdo = new PDO($dsn, $user, $password);
$stmt = $pdo->prepare( "SELECT ip FROM `bot` WHERE ip = :ip LIMIT 1");
$stmt->bindParam(':ip',$userip,PDO::PARAM_STR);
$stmt->execute();

foreach ($stmt as $row) {
$ipcount = $row['ip'];
}

if(!empty($ipcount)){
http_response_code( 403 ) ;
exit;
}

}

catch (PDOException $e){
print('エラーが発生しました。:'.$e->getMessage());
die();
}
?>

これを「/lib/tpl/dokuwiki/main.php」の一番上に入れてください。

もちろん、DBを使っていますがこの程度ならテキストファイルでも十分です。
htaccessに追記するような形でもいいですね。

Googlebotまで拒否してしまいそうで心配であれば、
googlebotのIPアドレスを調べてそれで判断するのが良い。
ユーザーエージェントでの判断は偽装可能なのでダメです。

3、以上です

これでbotがどんどん引っかかる。

日に日に増えていく感じで、botの多さにびっくりします。
「悪質なbotリスト」としても使えるので、他のサイトでも適用したり。
Wikiもbotに荒らされることなく平和になりました。

ユーザーも引っかかる可能性はゼロではないので、
botトラップを設置している旨を記載しておくことをおすすめします。

--

DokuWikiの関連記事

記事一覧はこちら:DokuWiki

管理人について
doudonn
名前:doudonn(どうどん)
ひたすらWEB制作な人。
一応社長です。音ゲー好き

<Twitterはこちら>
ゲーム垢
WEB制作垢
お知らせ

2022年11月30日に全記事削除しました。
まだ再開に向け作りかけ。


無駄にページ表示速度にこだわってます。

役立ちサイト
wiki
© 2022-2023 doudonn All Rights Reserved.