banner
DIYgod

Hi, DIYgod

写代码是热爱,写到世界充满爱!
github
twitter
follow
bilibili
telegram
email
steam
playstation
nintendo switch

WordPress 反スパムコメント大作戦

WordPress のスパムコメントは常に非常に多くて非常に迷惑なものです。有効なブロック方法がない場合、ウェブサイトは毎日何百ものスパムコメントで埋め尽くされてしまいます。

WordPress サイトでは避けられない問題なので、皆がそれぞれの方法を試して解決策を見つけています。以下に、各方法の特徴と利点をまとめました:

スパムコメントの識別#

Akismet プラグインを例に挙げると、コメントの内容やコメント投稿者の情報に基づいてコメントがスパムコメントかどうかを判断し、ブロックするかどうかを決定します。この方法を有効にすると、ほぼすべてのスパムコメントをブロックできますが、最大の欠点は誤判定です。以前、当サイトでは Akismet プラグインを使用していましたが、誤判定の確率はかなり高く、スパムボックスを頻繁に確認しても、たまに正常なコメントと一緒に大量のスパムコメントが混ざっていて見落とされることがよくありました。また、コメントの投稿速度が遅くなることもあります。なぜなら、すべてのコメントがまず Akismet の海外サーバーに送信されて識別される必要があるからです。

 

非中文コメントの禁止#

スパムコメントの 90%以上は海外から来るため、この方法で 90%以上のスパムコメントをブロックできますが、欠点は純粋な絵文字や「2333」、「Thanks」といった正常なコメントもブロックされてしまうことです。また、中文のスパムコメントもブロックできません。

 

コメント投稿先のアドレスの変更#

この方法は少し自己欺瞞的に見えますが、効果は驚くほど良いです。なぜなら、ほとんどのスパムコメントが、ウェブサイトのルートディレクトリの wp-comments-post.php を経由して投稿されるという、知能がないような方法で投稿されるからです。少し手間がかかるのは、WordPress をアップグレードするたびに再度変更する必要があることです。

 

人間の検証プラグイン#

スライド解除、パズル、キャプチャなど、効果は良いですが、ユーザーエクスペリエンスが犠牲になり、小さなサイトには必要ありません。

 

トークンの設定#

当サイトでは現在、この方法を使用しています。原理は、ページをリロードするたびに、バックエンドがページに異なるトークンを返し、適切なタイミングで JavaScript を使用してトークンを隠し input に埋め込むことです。コメントを投稿する際には、隠し input の値(通常はトークン)を一緒に送信し、バックエンドはその値が正当かどうかを判断してコメントが通常の方法で投稿されたものかどうかを判断します。この方法も破解可能ですが、破解の難易度は明らかに高くなり、さらに重要なのは、トークンのアルゴリズムと隠し input の構造を簡単に変更できるため、簡単な修正でも破解が無効になります。

使用方法も非常に簡単で、以下のコードをテーマの functions.php に追加するだけです。コードは以下の通りです:

$leonax_magic_lower = 328;  // トークンの最小値、自由に変更してください
$leonax_magic_upper = 3450709;  // トークンの最大値、自由に変更してください
function leonax_anti_spam_form($fields){
    global $leonax_magic_lower, $leonax_magic_upper;
    $leonax_magic = mt_rand($leonax_magic_lower, $leonax_magic_upper);  // ページに埋め込むトークンの値、ランダムな数値で毎回異なる
    $fields['leonax_magic'] = <<<EOT
        <input type="hidden" id="leonax-magic" name="leonax-magic" value="0">  // 隠しinput
        <script>
            $(function() {
                $("#comment-content").on("keyup", function() {  // jsがkeyup、click、またはtouchイベントを検出したときにトークンを埋め込む
                    $("#leonax-magic").val("$leonax_magic");
                });
                $('body').on('click touch', function () {
                    $("#leonax-magic").val("$leonax_magic");
                });
            })
        </script>
EOT;
    return $fields;
}
add_filter('comment_form_default_fields', 'leonax_anti_spam_form');

function leonax_anit_spam_caught() {
    wp_die('<strong>コメントが失敗しました</strong>: スパムコメントなんて消えてしまえ!');
}

function leonax_anti_spam_check( $commentdata ) {
    $comment_type = '';
    if ( isset($commentdata['comment_type']) ) {
        $comment_type = trim($commentdata['comment_type']);
    }

    if ( ($comment_type == 'pingback') || ($comment_type == 'trackback') ) {
        return $commentdata;
    }
    $content = '';
    if ( isset($commentdata['comment_content']) ) {
        $content = trim($commentdata['comment_content']);
    }
    if (!strlen($content)) {
        leonax_anit_spam_caught();
    }

    global $leonax_magic_lower, $leonax_magic_upper;

    if ( isset($commentdata['user_ID']) && $commentdata['user_ID'] ) { // ログインユーザーは判定しない
        return $commentdata;
    }

    if ( !isset($_POST['leonax-magic']) ) {
        leonax_anit_spam_caught();
    }
    $magic = intval($_POST['leonax-magic']);
    if ($magic < $leonax_magic_lower || $magic > $leonax_magic_upper) {  // トークンの値が設定した最小値と最大値の間である場合にのみ正当と判断
        leonax_anit_spam_caught();
    }
    return $commentdata;
}

add_filter( 'preprocess_comment' , 'leonax_anti_spam_check' );

上記のコードはLEONA+JustYY.comから取得しました。

 

現在、これらの方法しか見つかっていませんが、追加情報を歓迎します。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。