WordPress: Neue Variante Honeypot für Kommentare

Schon vor einiger Zeit hatte ich hier zwei kleine Funktionen vorgestellt, die Spam-Kommentare mit Hilfe eines Honeypots erkennen. Hier an dieser Stelle möchte ich meine neue Version dieses „Honeypots Plugins“ für WordPress vorstellen.

Das neue Skript erfüllt zwei grundsätzliche Funktionen. Zum einen bricht es die Kommentarfunktion ab sobald des Kommentarfeld „Website“ ausgefüllt ist und zum anderen zählt es die Anzahl Spam-Kommentare.

Ein „Honeypot“ ist schnell erklärt. Man nehme ein zusätzliches Kommentarfeld und verstecke es per CSS vor dem Leser. Der Leser, der das Feld nicht sieht, wird es nicht ausfüllen. Der Spambot dagegen schon. Denn der sieht die Seite anders. Fehlt nur noch eine einfache Abfrage die klärt ob das versteckte Feld ausgefüllt ist und den Kommentar dann als Spam behandelt.

Die Honeypot-Funktion, aus dem alten Artikel, wurde um das Zählen der Spam erweitert. Ich nutze dazu die Möglichkeit Transienten in der WordPress Datenbank anzulegen. Dieser Transient mit dem Namen check_honeypot_spamcounter erhält eine Ablaufzeit von 7 Tagen. Das bedeutet dass falls 7 Tage kein Spam reinkommt der Transient gelöscht wird. Hier sollte das nie passieren.

Update 15.06.2020: Ich habe die Funktion nochmal überarbeitet. In den Kommentaren kann man lesen dass Transienten nicht der richtige Weg sind solche Werte zu speichern. Die Funktionen speichern jetzt den Wert in der Option honeypot. Das hat auch den Vorteil dass es hier keine Ablaufzeit gibt.

WordPress Dashboard
WordPress Dashboard Widget auf einen Blick

Neu ist die Funktion zum Auslesen dieses Wertes und zur Darstellung im WordPress Dasboard im Widget „auf einen Blick“. Dieser Wert wird nur angezeigt wenn er größer null ist. Ansonsten wird er ausgeblendet.

 //Spam blockieren und zählen
 function check_honeypot ( $commentdata ) {
  if ( !empty($_POST['url'] ) ) { 
    if ( false === ( $spamcounter = get_option( 'honeypot' ) ) ) {    
      $spamcounter = 0;
      add_option( 'honeypot', $spamcounter, '', 'yes' );
  
    } else {
      $spamcounter = get_option( 'honeypot' );
    }

    $spamcounter++;
    update_option( 'honeypot', $spamcounter ); 
    
    wp_die( '<p><strong>Fehler:</strong> Die Kommentarfunktion wurde abgebrochen.</p><p><a href="javascript:history.back()">&laquo; Zurück</a></p>' );
  } 
  
  return $commentdata;
}
add_filter( 'preprocess_comment', 'check_honeypot' );

// Anzahl Spams im Dasboard- Widget 'auf einen Blick' anzeigen
function display_spamcounter( $items = array() ) {
  if ( false === ( $spamcounter = get_option( 'honeypot' ) ) ) {
    $spamcounter = 0;
    $hidden = " hidden";
    
  } else {
    $spamcounter = get_option( 'honeypot' );
  }
 
  $items[] = '<span class="spamcounter' . $hidden . '">' . sprintf( '%s Kommentare blockiert', $spamcounter ) . '</span>';
  
  return $items;
}
add_filter( 'dashboard_glance_items', 'display_spamcounter', 10, 1 );

Das alles lässt sich als Plugin in WordPress installieren. Ich habe die Zeilen in die functions.php meines Child-Themes kopiert.