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();
$stmt2 = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($stmt2 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トラップを設置している旨を記載しておくことをおすすめします。