WordPress: Honeypot für Kommentare

Ich habe hier im Blog jahrelang auf das Plugin Antispam Bee zur Spamabwehr gesetzt. In den Einstellungen hatte ich die Funktion „Aus bestimmten Gründen sofort löschen“ aktiviert. Einziger ausgewählter Grund war „Honeypot“. Diese Einstellung hat hier 100% aller Spamkommentare abgefangen.

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.

Dieses Plugin ist bei mir Geschichte. Schon seit längerer Zeit setze ich auf eine kleine Funktion, die als Ersatz für dieses Plugin dient. Als Honeypot nutze ich das Formularfeld „Website“. Wie ihr auf dieser Seite sehen könnt, fehlt dieses Feld in meinem Kommentarformular. Ich habe es per CSS ausgeblendet.

.comment-form-url,
.comment-form-url label,
.comment-form-url input {
  opacity: 0;
  position: absolute;
  top: 0;
  left: 0;
  height: 0;
  width: 0;
  z-index: -1;
}

Die dazu gehörende Funktion markiert Kommentare mit ausgefülltem Feld „Website“ als Spam. Der Kommentar ist im Backend von WordPress unter „Spam“ lesbar.

function check_honeypot( $approved ) {
  return empty( $_POST['url'] ) ? $approved : 'spam';
}
add_filter('pre_comment_approved', 'check_honeypot', 9999, 1);

Das funktioniert hier perfekt. Doch eines nervt. Immer wieder muss ich den gleichen Spam-Schei… löschen. Es sind auch immer die gleichen Artikel, die zugespammt werden. Und eigentlich habe ich noch nie einen nützlichen Kommentar aus den Spams herausgefischt. Deshalb habe ich die obige Funktion gegen nachfolgende ersetzt. Auch hier wird das Feld „Website“ als Honeypot genutzt. Jedoch beendet die Funktion die Kommentarfunktion (ohne Speichern) mit einer Fehlermeldung.

function check_honeypot ( $commentdata ) {
  if ( !empty( $_POST['url'] ) ) {  
    wp_die( '<p><strong>Sorry!</strong> Dieser Kommentar wurde als Spam erkannt und wird deshalb nicht gespeichert.</p>' );
  } 
  
  return $commentdata;
}
add_filter( 'preprocess_comment', 'check_honeypot' );

Was zur perfekten „Antispam-Funktion“ noch fehlt ist die WordPress eigene Kommentar-Sperrliste, die Kommentare mit bestimmten Inhalten in den Papierkorb legt. Und da liegt das Problem. Die gehören eigentlich nach Spam. Torsten Landsiedel hat das in einem Artikel gut beschrieben und liefert auch gleich die passende Funktion dazu, die solche Kommentare anstatt in den Papierkorb nach Spam verschiebt.

function trash_to_spam ( $approved ) {
  if ( 'trash' === $approved ) {
    $approved = 'spam';
  }
	
  return $approved;
}
add_filter('pre_comment_approved', 'trash_to_spam', 10, 2);

So und jetzt hoffe ich mal, dass ich diese Art Kommentare hier nicht mehr lesen muss.