Ausgabe mehrfacher Spammer

Nach längerer Zeit wieder ein kleiner WordPress-Codeschnipsel von mir, diesmal nicht für eure Besucher, sondern für diejenigen von euch, die ein Spam­erkennungs­plugin wie Akismet einsetzen und im Backend immer wieder mal auf die Liste der aufgelaufenen Spams schauen (um zu sehen, ob nicht doch ein false positive, ein falsch erkannter echter Kommentar dabei ist) – und dabei Muster erkennen wollen, etwa ob besonders viele Spams von einem bestimmten Server oder für eine bestimmte Site kommen und dafür ggf. besondere Maßnahmen ergreifen wollen: z.B. bestimmte Server gleich per .htaccess sperren oder die Blacklist von WordPress zu füllen. Oder einfach neugierig sind.

Dieser Codeschnipsel gibt über der Spam-Tabelle eine zusätzliche Tabelle aus, in der mehrfache IPs, Namen, Emails und URLs aufgelistet werden:

Spam-Statistik

Wobei ein Klick auf jeden Eintrag die Suchfunktion startet, also alle zugehörigen Spam-Kommentare anzeigt.

Der folgende Code kann z.B. in ein eigenes kleines Plugin geschrieben werden (ich hab für solche Kleinigkeiten ein eigenes Sammel-Plugin); die functions.php des Themes geht genauso. (Auf jeden Fall, wie üblich, innerhalb von <?php?>.)

//Infos auf Kommentar/Spam-Seite
$ag_comment_page_counter = 0;

function ag_comment_page ($comment_status) {
    global $wpdb,$ag_comment_page_counter;
    if (!is_admin()) return;
    if ($ag_comment_page_counter>0) return;
    $ag_comment_page_counter++;
    if ($comment_status=='spam') {
        echo '<div id="ag-comment-stats">';
        echo '<table class="widefat" cellspacing="0"><thead><tr><th>Mehrfache IPs</th><th>Mehrfache Namen</th><th>Mehrfache Emails</th><th>Mehrfache URLs</th></tr></thead>'."\n<tbody><tr>";
        foreach (array('comment_author_IP','comment_author','comment_author_email','comment_author_url') as $item) {
            $stuffs = $wpdb->get_results("
                SELECT * FROM (
                    SELECT $item AS stuff,COUNT(*) AS count
                    FROM $wpdb->comments
                    WHERE comment_approved='spam'
                    GROUP BY stuff
                    ORDER BY count DESC, stuff ASC) AS allspam
                WHERE count>1");
            echo "<td>";
            if (count($stuffs)==0) echo "-"; else
            foreach ($stuffs as $stuff) {
                if ($item=='comment_author_url') $stuff->stuff=esc_url($stuff->stuff);
                if ($stuff->stuff!='')
                    echo '<a href="edit-comments.php?s='.htmlentities($stuff->stuff).'&mode=detail&comment_status=spam">'.
                        htmlentities($stuff->stuff)."</a> (".$stuff->count.")<br/>";
            }
            echo "</td>";
        }

        echo '</tr></tbody></table></div>'."\n";
        echo '<script type="text/javascript">
            jQuery(\'.search-box\').after(jQuery(\'#ag-comment-stats\'));
            </script>';
        //echo '</div></a>'."\n";
    }
}
add_action ('manage_comments_nav',ag_comment_page);

Eingebunden wird das ganze über die Aktion manage_comments_nav, die anscheinend die einzige Möglichkeit ist, einfach etwas in die Kommentar-Seiten einzubinden; da die Aktion für die Navigation sowohl vor als auch nach der Liste aufgerufen wird, verwende ich einen kleinen Zähler, um die Daten nur einmal auszugeben. Und das auch nur dann, wenn es sich um die Ansicht der Spam-Kommentare handelt (if ($comment_status=='spam')) und nicht um die anderer Kommentare.

Es wird dann erstmal der Tabellenkopf ausgegeben, bevor eine Schleife über die vier interessanten Punkte diese dann jeweils aus der Tabelle wp_comments liest (innere SELECT-Abfrage, aus der die äußere dann die nur 1x vorkommenden verwirft) und ausgibt. Am Schluss kommt noch ein bisschen JavaScript, um die Tabelle an eine schönere Stelle als zwischen Buttons und Seitenzahlen zu verschieben.

Nun, ich weiß nicht, wie nützlich dieser Code im Endeffekt wirklich ist, aber zumindest die Statistikverliebten werden ein paar Minuten damit unterhalten werden.^^

Dieser Code funktioniert übrigens nicht nur mit Akismet, sondern auch mit anderen Antispamplugins, die die Spams abspeichern und nicht sofort löschen/blockieren – Antispam Bee mit entsprechender Einstellung etwa. Und ich werde künftig wohl auch auf die Biene setzen – sie summt schon testweise in meiner Esoterik-Shop-Satire, und das Kommentar­vorschau­plugin hab ich auch schon schnell angepasst (mehr dazu ein anderes Mal) – und Akismet in Rente schicken. Es macht seine Arbeit an sich nicht schlecht, von wenigen false positives und false negatives pro Monat abgesehen (von Datenschutzbedenken will ich hier gar nicht anfangen), aber mit den zusätzlichen Informationen, die Version 2.5 eingeführt hat, begann Akismet auch, die wp_commentmeta-Tabelle mit Statistik-/History-Einträgen (akismet_as_submitted, akismet_history, akismet_result) zuzumüllen, die anscheinend auch für schon lange gelöschte Kommentare (noch?) nicht bereinigt werden.

Schreib einen Kommentar

Alle Angaben sind freiwillig. Die E-Mail-Adresse wird nicht veröffentlicht oder weitergegeben.

  • Moderation: Wer zum ersten Mal kommentiert, dessen Kommentar muss manuell von mir freigeschaltet werden.
  • Benimm dich! Keine Beleidigungen, keine rechtswidrigen Inhalte u.s.w.! Sollte eigentlich selbst­verständlich sein, oder...?
  • Webseite: Nichts gegen Blogs mit Werbung, aber rein kommerzielle Links sind unerwünscht und werden gelöscht. Reine Spam-Kommentare natürlich auch.
  • Erlaubte HTML-Tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <sub> <sup> <big> <small> <u>