WordPress Kommentare – Spam erfolgreich verhindern

Eine aktive Community ist etwas tolles und du machst dir viel Mühe mit deinen Blog-Beiträgen. Doch Spam Kommentare in WordPress können auch für nicht so hochfrequentierte Webseiten zu einem echten Problem werden.

Vielleicht ist es bei dir auch schon vorgekommen, dass du Spam Kommentare erhalten hast, obwohl sich auf deiner Webseite gar keine Kommentarformulare befinden. Wie ist das möglich?

Das klären wir in diesem Beitrag und ich zeige dir wann, wie und was du mit den WordPress-eigenen Funktionen dagegen tun kannst und wie du in Zukunft keine Spam Kommentare mehr erhältst, dabei deine echten Besucher nicht nervst und auch noch vollständig DSGVO-konform bleibst. 🙂

So funktioniert der Kommentar Spam in WordPress

Dir ist natürlich bewusst, dass kein Spammer tatsächlich selbst deine Webseite aufruft und in mühsamer Handarbeit seine hirnlosen Kommentare hinterlässt.

Aber wie ist es dann möglich einen Beitrag in WordPress zu kommentieren, ohne den Beitrag tatsächlich zu besuchen?

Dazu müssen wir zuerst verstehen wie WordPress alle Kommentare verarbeitet.

WordPress Kommentar Funktion verstehen

Sobald jemand deinen Kommentar verfasst hat und diesen abschickt, werden alle Daten aus dem Formular an die Datei /wp-comments-post.php gesendet.

Das kann und wird auch von einem externen Server gemacht. Das heißt, deine Webseite muss gar nicht besucht werden, um einen Kommentar zu hinterlassen.

Jeder, der ein wenig Programmierkenntnisse hat, kann sich diese Datei ansehen und verstehen was der Code darin genau macht.

So machen es die Kommentar Spammer

Versetzen wir uns jetzt gemeinsam in die Lage eines Spammers und sehen und kurz die Datei an. Keine Sorge, du musst nichts vom Programmieren verstehen, um mir weiter folgen zu können. Versprochen! 🤝

wp-comments-post.php
<?php
/**
 * Handles Comment Post to WordPress and prevents duplicate comment posting.
 *
 * @package WordPress
 */

if ( 'POST' !== $_SERVER['REQUEST_METHOD'] ) {
	$protocol = $_SERVER['SERVER_PROTOCOL'];
	if ( ! in_array( $protocol, array( 'HTTP/1.1', 'HTTP/2', 'HTTP/2.0', 'HTTP/3' ), true ) ) {
		$protocol = 'HTTP/1.0';
	}

	header( 'Allow: POST' );
	header( "$protocol 405 Method Not Allowed" );
	header( 'Content-Type: text/plain' );
	exit;
}

/** Sets up the WordPress Environment. */
require __DIR__ . '/wp-load.php';

nocache_headers();

$comment = wp_handle_comment_submission( wp_unslash( $_POST ) );
if ( is_wp_error( $comment ) ) {
	$data = (int) $comment->get_error_data();
	if ( ! empty( $data ) ) {
		wp_die(
			'<p>' . $comment->get_error_message() . '</p>',
			__( 'Comment Submission Failure' ),
			array(
				'response'  => $data,
				'back_link' => true,
			)
		);
	} else {
		exit;
	}
}

$user            = wp_get_current_user();
$cookies_consent = ( isset( $_POST['wp-comment-cookies-consent'] ) );

/**
 * Perform other actions when comment cookies are set.
 *
 * @since 3.4.0
 * @since 4.9.6 The `$cookies_consent` parameter was added.
 *
 * @param WP_Comment $comment         Comment object.
 * @param WP_User    $user            Comment author's user object. The user may not exist.
 * @param bool       $cookies_consent Comment author's consent to store cookies.
 */
do_action( 'set_comment_cookies', $comment, $user, $cookies_consent );

$location = empty( $_POST['redirect_to'] ) ? get_comment_link( $comment ) : $_POST['redirect_to'] . '#comment-' . $comment->comment_ID;

// If user didn't consent to cookies, add specific query arguments to display the awaiting moderation message.
if ( ! $cookies_consent && 'unapproved' === wp_get_comment_status( $comment ) && ! empty( $comment->comment_author_email ) ) {
	$location = add_query_arg(
		array(
			'unapproved'      => $comment->comment_ID,
			'moderation-hash' => wp_hash( $comment->comment_date_gmt ),
		),
		$location
	);
}

/**
 * Filters the location URI to send the commenter after posting.
 *
 * @since 2.0.5
 *
 * @param string     $location The 'redirect_to' URI sent via $_POST.
 * @param WP_Comment $comment  Comment object.
 */
$location = apply_filters( 'comment_post_redirect', $location, $comment );

wp_safe_redirect( $location );
exit;

Du siehst, dass ich für dich die Zeile 25 hervorgehoben habe. Das ist letztendlich für uns die interessanteste Zeile. Denn hier bekommen wir zum einen die Information, dass die wp-comments-post.php die Daten (wie der Name der Datei bereits vermuten lässt) über eine HTTP POST Methode erwartet. Diese Methode muss verwendet werden, um Kommentare an WordPress zu senden.

Es befinden sich alle gesendeten Kommentardaten in der $_POST Variable.

Nun wissen wir hier noch nicht genau welche Daten WordPress genau erwartet und wie diese strukturiert sein müssen, damit ein Kommentar auch tatsächlich korrekt verarbeitet werden kann.

Auch das können wir über dieselbe Zeile herausfinden. Hier ist die Funktion wp_handle_comment_submission sehr interessant. In der WordPress Entwickler Dokumentation erfahren wir welche Daten diese Funktion genau erwartet und wie diese aussehen müssen.

Ohne jetzt zu sehr ins Detail zu gehen, können wir aus der Doku entnehmen, dass wir mindestens folgende Daten an die wp-comments-post.php per HTTP POST senden müssen:

  • comment_post_ID
    Das ist die ID des Beitrags, den wir kommentieren wollen.
  • author
    Der Name des Kommentar-Autors.
  • email
    Die E-Mail-Adresse des Kommentar-Autors.
  • comment
    Der Kommentar-Text.

Wenn du in WordPress unter Einstellungen -> Diskussion den Haken bei „Benutzer müssen zum Kommentieren Name und E-Mail-Adresse angeben“ entfernt hast, ist der Autoren-Name sowie die E-Mail-Adresse sogar optional und müssen nicht an die wp-comments-post.php gesendet werden!

Den Namen, die E-Mail-Adresse und den Text des Kommentars gibt der Spammer natürlich selber vor und somit sind diese Daten bereits bekannt.

Was dem Spammer allerdings noch fehlt ist die ID des Beitrags, den er vollspammen möchte.

Das ist allerdings auch kein Problem für jemanden, der sich ein wenig mit WordPress auskennt.

Um an die Post ID zu kommen gibt es mehrere Möglichkeiten. Zum einen findet man sie im Quelltext der jeweiligen WordPress Seite.

Beispiel:

HTML
<link rel="alternate" type="application/json" href="https://dein-business.de/wp-json/wp/v2/posts/12345" />

<link rel='shortlink' href='https://dein-business.de/?p=12345' />

Du kannst sicher bereits erahnen wo sich hier die Post ID befindet. Es ist in diesem Fall die 12345.

Man könnte auch daran denken den RSS Feed auszulesen, auch dort wird man fündig.

Doch das alles wäre vergleichsweise sehr aufwendig, nur um an die Post ID zu kommen.

Viel einfacher ist es hingegen, alle Beiträge auf einmal abzurufen und die jeweilige Post ID auf dem silbernen Tablett serviert zu bekommen.

Dazu müssen wir einfach nur diese URL aufrufen:

WordPress REST API
https://mein-business.de/wp-json/wp/v2/posts

Versuch’s mal auf deiner eigenen Seite. Ersetze einfach mein-business.de gegen deine eigene URL.

Du solltest nun alle veröffentlichten Beiträge im JSON-Format sehen. Du erkennst vermutlich nicht viel, weil alles in einer langen Zeile steht. Besser erkennst du es, wenn du z.B. den JSON Formatter benutzt. Dann sollte es in etwa so aussehen:

WordPress Beiträge über die WordPress REST API aufgerufen
WordPress Beiträge können über die WordPress REST API abgerufen werden

Dieser JSON-Code lässt extrem einfach auslesen und ich habe hier alles was ich brauche. Zum einen ganz oben die Post ID und weiter unten sehe ich sogar, ob die Kommentarfunktion für diesen Beitrag aktiviert ist oder nicht. In diesem Beispiel ist die Kommentarfunktion deaktiviert, deshalb steht dort "comment_status": "closed".

Diese Daten können u.U. auch dann abgerufen werden, wenn sich deine Webseite im Wartungsmodus befindet. Deine Webseite in den Wartungsmodus zu versetzen schützt dich also nicht vor Spam Kommentaren!

Als Spammer muss ich also nicht einmal meine Serverressourcen verschwenden und hier versuchen irgendwo zu kommentieren, wo es gar nicht möglich ist.

Ich kann ganz entspannt und natürlich automatisiert jeden Beitrag durchlaufen, kontrollieren, ob ich dort kommentieren kann und falls ja, meinen Kommentar mit der jeweiligen Post ID an die wp-comments-post.php senden.

Hier ein Beispiel:

Hier sende ich einen Spam Kommentar an eine WordPress Seite. In diesem Fall tue ich das manuell, aber du bekommst eine Idee davon, wie so etwas prinzipiell funktioniert. Auf der rechten Seite habe ich alle notwendigen Daten angegeben, die ich an eine WordPress Seite sende und links kommt der Kommentar in WordPress an.

Das funktioniert übrigens genauso mit den Seiten und nicht nur mit den Beiträgen. Für die Seiten würden man dann einfach /wp-json/wp/v2/pages abrufen. Ansonsten ändert sich an der Vorgehensweise nichts.

Diese Möglichkeiten hast du, um Kommentar Spam in WordPress zu verhindern

Viele Wege führen nach Rom, doch einige sind kürzer und sind nicht so aufwendig wie andere. Trotzdem möchte ich dir hier erstmal die Funktionen zeigen, die WordPress bereits standardmäßig mitbringt.

Anschließend stelle ich dir ein Plugin vor, welches aus meiner Sicht wirklich genial ist. Denn es verhindert genau solchen Spam, verbraucht dabei praktisch keine Ressourcen, müllt deine Datenbank nicht mit irgendwelchen Trackingdaten zu und ist (und war schon immer) DSGVO-konform.

Kommentarfunktion komplett deaktivieren

Eine sehr radikale Entscheidung, aber nicht jeder braucht eine Kommentarfunktion auf seiner Webseite. Auf einer Unternehmenswebseite ist so eine Funktion normalerweise nicht nötig, außer es wird ein Blog betrieben.

Möchtest du die Kommentarfunktion komplett deaktivieren, dann kannst du das unter Einstellungen -> Diskussion tun:

Kommentarfunktion in WordPress für neue Beiträge deaktivieren
Kommentarfunktion in WordPress für neue Beiträge deaktivieren

Dabei solltest du beachten, dass die Kommentarfunktion automatisch für alle neuen Beiträge deaktiviert wird. Das heißt, dass du alle bestehenden Beiträge bearbeiten und dort überall die Kommentarfunktion deaktivieren musst.

Das lässt sich aber auch relativ einfach machen, indem du mehrere oder alle Beiträge auf einmal bearbeitest:

Mehrere Beiträge in WordPress gleichzeitig bearbeiten und Kommentare deaktivieren
Mehrere Beiträge in WordPress gleichzeitig bearbeiten und Kommentare deaktivieren

Kommentarfunktion zeitlich begrenzen

Was viele Webseitenbetreiber auch tun, ist die Kommentare nach einer bestimmten Anzahl an Tagen automatisch zu deaktivieren:

WordPress Beiträge nach einer bestimmten Zeit automatisch deaktivieren
WordPress Beiträge nach einer bestimmten Zeit automatisch deaktivieren

So hast du immer höchstens nur für einen begrenzten Zeitraum ein Problem mit Spam.

Kommentieren nur registrierten Benutzern erlauben

Das kommt vermutlich nur in Frage, wenn du eine (aktive) Community aufgebaut hast oder noch aufbauen möchtest. So hättest du auch kein Problem mehr mit (automatisiertem) Spam.

Nur um kommentieren zu dürfen, werden sich vermutlich nur die wenigsten registrieren, weshalb diese Option für die meisten wohl nicht in Frage kommt.

Außerdem solltest du dabei bedenken, dass du für das Speichern sensibler Daten wie die E-Mail-Adressen und Passwörter verantwortlich bist. Deine WordPress-Installation sollte also gut gegen Hackerangriffe gesichert sein.

Zudem öffnest du damit ggf. ein weiteres Tor für Spammer. Sie können sich dann nämlich automatisiert Accounts anlegen. Zwar hast du dann keinen Kommentar Spam mehr, dafür aber viele Benutzerdaten, die deine Datenbank zumüllen.

Überlege dir also gut, bevor du diese Option wählst:

Kommentarfunktion in WordPress nur für registrierte Benutzer aktivieren
Kommentarfunktion in WordPress nur für registrierte Benutzer aktivieren

Nutze die Kommentar-Sperrliste

Ebenfalls unter Einstellungen -> Diskussion zu finden ist die Kommentar-Sperrliste.

WordPress Kommentar-Sperrliste nutzen, um Kommentarspam zu verhindern
WordPress Kommentar-Sperrliste nutzen, um Kommentarspam zu verhindern

Diese kannst du nutzen, um Kommentare, die bestimmte Begriffe enthalten oder über eine bestimmte IP-Adresse gesendet werden, direkt in den Papierkorb verschoben werden.

Diese Sperrliste wird vermutlich von den wenigsten genutzt, da man so im Prinzip den Spammern nur hinterherläuft, weil sie in der Regel ihre gesendeten Daten jedes Mal ändern.

Und den Papierkorb musst du dann trotzdem immer wieder kontrollieren, um sicherzugehen, dass keine echten Kommentare dort gelandet sind.

Was kannst du also noch tun, um möglichst einfach echte Kommentare zu erhalten und die automatisierten Bots auszusperren, ohne dabei deine Besucher mit Captchas zu nerven.

WordPress Spam Kommentare mit diesem „Trick“ auf einen Schlag unterbinden

Vor ein paar Wochen hatte eine Kundin ein Problem mit Spam Kommentaren. Ich habe ihr dann zunächst genau die hier genannten Tipps gegeben, wie sie diesen Spam verhindern oder zumindest eindämmen kann. Auch das bekannte Plugin Antispam Bee habe ich ihr empfohlen.

In ihrem Fall gab es auch Spam Kommentare auf einer Webseite, die sich im Wartungsmodus befand und eigentlich für niemanden mehr zugänglich war.

Mir hat das keine Ruhe gelassen und so habe ich danach recherchiert was man noch gegen Spam Kommentare in WordPress tun kann. Irgendwann stieß ich auf das Plugin Forget Spam Comment.

WordPress Plugin Forget Spam Comment, um Spam Kommentare DSGVO-konform zu verhindern
WordPress Plugin Forget Spam Comment, um Spam Kommentare DSGVO-konform zu verhindern

Zunächst war ich skeptisch und habe mir deshalb den Quellcode des Plugins angesehen, um die Funktionsweise besser zu verstehen.

Forget Spam Comment verhindert Spam Kommentare sofort

Tatsächlich besteht das Plugin aus nur einer einzigen kleinen PHP-Datei (und ein paar Sprachdateien).

Das Versprechen des Entwicklers, dass das Plugin DSGVO-konform ist kann ich bestätigen. Es verarbeitet und speichert keine personenbezogenen Daten.

So funktioniert Forget Spam Comment

Das Plugin entfernt erstmal standardmäßig den Wert des action-Attributs aus allen Kommentarformularen. Dort steht normalerweise der Pfad zur wp-comments-post.php. Es kann also gar kein Kommentar gesendet werden.

Erst wenn der Besucher anfängt zu scrollen, wird der Pfad wieder eingefügt. Dieses Mal aber mit einem zusätzlichen Parameter, der einen einzigartigen Schlüssel enthält.

Beim Absenden eines Kommentars wird nun geprüft, ob dieser Schlüssel ebenfalls übergeben wurde und ob er auch mit dem Beitrag übereinstimmt.

Jetzt fragst du dich wie diese Vorgehensweise Spammer davon abhalten soll auf deiner Webseite komplett auszuarten und deine Datenbank vor lauter Kommentaren überlaufen zu lassen?

Nun, der einzigartige Schlüssel wird nur dann gesendet, wenn ein Beitrag besucht und auch gescrollt wird. Ein Spammer sendet allerdings direkt seine Daten an WordPress und somit fehlt dieser Schlüssel.

So wird der Spam Kommentar direkt mit einer Fehlermeldung abgelehnt, noch bevor er in der WordPress-Datenbank landen kann.

Ziemlich einfach, aber auch clever, wie ich finde. 🙂

Fazit

Spam jeglicher Art ist leider etwas, dass sich nur sehr schwer verhindern lässt. Auch Forget Spam Comment hat sicher seine Schwächen. Doch gerade wenn es um automatisierten Spam geht, hilft das Plugin weiter und belastet dabei deine WordPress-Installation praktisch gar nicht.

Wenn du also Probleme mit Spam Kommentaren auf deiner WordPress Seite hast, dann probiere das Plugin einfach mal aus. Ich kann es dir nur empfehlen!

FAQ

Häufig gestellte Fragen zu WordPress Spam Kommentaren werden hier beantwortet.

Warum erhalte ich Spam Kommentare, obwohl sich meine WordPress Seite im Wartungsmodus befindet?

Deine WordPress Seite muss nicht direkt besucht werden, um einen Kommentar zu hinterlassen. Spammer senden den Kommentar direkt an die wp-comments-post.php von WordPress.

Das funktioniert auch, wenn sich deine WordPress Seite im Wartungsmodus befindet.

Warum erhalte ich weiterhin Spam Kommentare, obwohl ich die Kommentarfunktion in WordPress abgeschaltet habe?

Wenn du die Kommentarfunktion unter Einstellungen -> Diskussion deaktivierst, dann greift diese Einstellung nur für neue, aber nicht für bestehende, Beiträge.

Du musst alle deine bestehenden Beiträge bearbeiten und in jedem einzelnen die Kommentarfunktion deaktivieren. Du kannst auch mehrere Beiträge gleichzeitig auswählen und bearbeiten. So musst du nicht jeden Beitrag einzeln aufrufen, um die Kommentarfunktion auszuschalten.

Woher weiß ein Spammer welchen Beitrag ich zuletzt aktualisiert habe? Es erhält immer nur der aktuellste Beitrag Spam Kommentare.

Über die WordPress Schnittstelle (REST API) kann jeder alle deine veröffentlichten Beiträge abrufen. Hierüber sieht man auch wann ein Beitrag veröffentlicht und wann dieser zuletzt aktualisiert wurde.

Wie verhindere ich ohne zusätzliches Plugin Spam Kommentare in WordPress?

Das aller einfachste ist es die Kommentarfunktion in WordPress komplett zu deaktivieren. Oder du lässt das Kommentieren nur für registrierte Benutzer zu.

Heutzutage gibt es immer weniger Webseiten, die Kommentare zulassen. Zumindest ohne sich registrieren zu müssen. Es kommt immer darauf an wie kommentierfreudig deine Besucher sind.

Erhältst du nur sehr wenige bis gar keine Kommentare, dann ist es wohl am besten die Kommentarfunktion komplett zu deaktivieren, weil du sonst hauptsächlich nur mit Kommentar Spam beschäftigt bist.

Hast du aber eine aktive Community aufgebaut, die immer wieder gerne deine Beiträge kommentiert, dann könnte sich der Moderationsaufwand schon eher lohnen. In dem Fall probiere das von mir empfohlene Plugin Forget Spam Comment aus!