Wenn die IP-Adresse gespeichert wird, wie es Contao standardmäßig tut, sollte im Kommentarformular darauf hingewiesen werden, siehe z.B. die Erläuterungen in diesem Artikel.
Zitat von
marcohe
...würde ich die Speicherung von IP-Adressen gerne komplett abschalten, hat das schon jemand gemacht bzw. wie wäre die Vorgehensweise?
Zitat von
Sascha
Von daher nochmal die Frage wie kann ich die Speicherung von IP-Adressen bei Kommentaren abschalten (oder alternativ anonymisieren)?
Das Speichern der IP-Adresse ist "hard coded" in der Kommentarklasse definiert (hier) und lässt sich (derzeit) nicht deaktivieren.
Leider gibt es in der Kommentarklasse (derzeit) keinen prepareFormData Hook, mit dem man die zu speichernden Werte vor der Speicherung ändern könnte.
Es gibt in der Kommentarklasse aber den addComment Hook, der unmittelbar nach dem Speichern eines Kommentars genutzt werden kann.
Man kann mit diesem Hook die IP-Adresse direkt nach dem Speichern wieder löschen oder anonymisieren. Dazu ist kein Cron-Job erforderlich.
Um diese Option zu nutzen, die Ordner /src/EventListner/ im Root der Contao-Installation anlegen (falls noch nicht vorhanden) und darin eine Datei AddCommentListener.php mit folgendem Inhalt speichern:
Kommentar-IP-Adresse löschen/ersetzen:
PHP-Code:
<?php
// src/EventListener/AddCommentListener.php
namespace App\EventListener;
use Contao\CoreBundle\DependencyInjection\Attribute\AsHook;
use Contao\Comments;
use Contao\Database;
#[AsHook('addComment')]
class AddCommentListener
{
public function __invoke(int $commentId, array $commentData, Comments $comments): void
{
// Delete/Replace the IP address of the comment
Database::getInstance()->prepare("UPDATE tl_comments SET ip='not saved' WHERE id=?")->execute($commentId);
}
}
Danach im ContaoManager unter Systemwartung den Prod.-Cache erneuern und dann sollte es schon funktionieren (für neue Kommentare, dies ändert keine bereits vorhandenen Kommentare).
Im Beispiel wird die IP-Adresse mit 'not saved' ersetzt, das wird dann im Backend bei den Kommentaren als 'IP not saved' angezeigt.
Man kann das aber auch leer lassen ip='' oder einen anderen Text verwenden (maximal 24 Zeichen, das IP-Feld ist in der Datenbank varchar(24) ).
Kommentare ohne IP-Adresse und ohne E-Mail-Adresse
Falls die E-Mail-Adresse auch nicht gespeichert werden soll, gibt es den Trick, das Kommentarformular anzupassen und das E-Mail-Feld als verstecktes Feld mit einer vordefinierte Mailadresse festzulegen. Die Benachrichtigungsfunktion (das 'notify'-Feld) sollte in dem Fall im Backend deaktiviert sein und im Formular ausgeblendet werden.
PHP-Code:
<!-- templates/mod_comment_form.html5 -->
[...]
<?php
echo '<input type="hidden" name="email" value="comment@example.com">';
foreach ( $this->fields as $field ) {
// Do not render the default fields 'email' and 'notify':
if ( !in_array($field->name, array('email', 'notify')) ) {
echo $field->parse();
}
}
?>
[...]
Der Wert des versteckten E-Mail-Feldes (input type="hidden") im Quelltext kann aber manipuliert werden, so dass dann dennoch eine andere E-Mail-Adresse zum Kommentar gespeichert wird.
Mit einer kleinen Anpassung des AddCommentListener kann man sicherstellen, dass immer nur eine selbst definierte Mailadresse in der Datenbank gespeichert wird:
PHP-Code:
<?php
// src/EventListener/AddCommentListener.php
namespace App\EventListener;
use Contao\CoreBundle\DependencyInjection\Attribute\AsHook;
use Contao\Comments;
use Contao\Database;
#[AsHook('addComment')]
class AddCommentListener
{
public function __invoke(int $commentId, array $commentData, Comments $comments): void
{
// Delete/Replace the IP address and email of the comment
Database::getInstance()->prepare("UPDATE tl_comments SET ip='not saved', email='comment@example.com' WHERE id=?")->execute($commentId);
}
}
Das E-Mail-Feld ist ein Pflichtfeld, daher sollte man hier nicht email='' (leer, ohne Wert) verwenden, denn sonst kann es eventuell Fehler geben, wenn man im Backend einen Kommentar bearbeiten will und keine Mailadresse beim Kommentar vorhanden ist.
Kleiner Hacken an der Sache: Der addComment Hook hat keinen Einfluss auf die Daten, die per Mail als Benachrichtigung an den Systemadmin/Autor geschickt werden. In der Mail kann also eventuell trotzdem eine manipulierte E-Mail-Adresse zum Kommentar angegeben sein.
Anonyme Kommentare ohne IP-Adresse, E-Mail und Website
Wenn auch keine 'website' gespeichert werden soll, kann das Feld im Formulartemplate komplett weggelassen werden, da es kein Pflichtfeld ist:
PHP-Code:
<!-- templates/mod_comment_form.html5 -->
[...]
<?php
echo '<input type="hidden" name="email" value="comment@example.com">';
foreach ( $this->fields as $field ) {
// Do not render the default fields 'email', 'notify' and 'website':
if ( !in_array($field->name, array('email', 'notify', 'website')) ) {
echo $field->parse();
}
}
?>
[...]
Auch, wenn das Website-Feld damit nicht mehr im HTML-Quelltext des Kommentarformulars vorhanden ist, kann es durch Manipulation des Quelltextes wieder hinzugefügt werden. So können theoretisch Einträge im Website-Datenbankfeld landen, die man nicht möchte.
Um sicherzustellen, dass kein Mist im Website-Feld landet, kann man es durch eine kleine Anpassung des AddCommentListener direkt nach dem Speichern wieder löschen:
PHP-Code:
<?php
// src/EventListener/AddCommentListener.php
namespace App\EventListener;
use Contao\CoreBundle\DependencyInjection\Attribute\AsHook;
use Contao\Comments;
use Contao\Database;
#[AsHook('addComment')]
class AddCommentListener
{
public function __invoke(int $commentId, array $commentData, Comments $comments): void
{
// Delete/Replace the IP address, email and website of the comment
Database::getInstance()->prepare("UPDATE tl_comments SET ip='not saved', email='comment@example.com', website='' WHERE id=?")->execute($commentId);
}
}
Der addComment Hook war bereits in Contao 4 vorhanden und kann auch mit der aktuellen Version Contao 5.4 verwendet werden. Ich denke, man kann diese Lösung daher als "updatesicher" bezeichnen. Zumindest, bis die Kommentarklasse eventuell irgendwann einmal überarbeitet wird.