DSGVO und die Kommentarfunktion (IP-Adressen)
Hallo zusammen,
mal eine Frage bzgl der kommenden DSGVO.
Wie rechtfertigt ihr die Speicherung der IP-Adressen bei Abgabe eines Kommentars?
Um auf der sicheren Seite zu sein würde ich die Speicherung von IP-Adressen gerne komplett abschalten, hat das schon jemand gemacht bzw. wie wäre die Vorgehensweise?
Danke + Gruß Marco
Kommentare ohne Speicherung der IP-Adresse
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:
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:
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 Haken 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.
Weitere Tipps für anonyme Kommentare
Da in der Kommentarklasse die Formularfelder „hard codiert“ sind, sind weitere Anpassungen des Kommentarformulars etwas tricky.
Wenn anonyme Kommentare erlaubt werden, sollte die Angabe eines Namens freiwillig sein.
Das Namensfeld ist aber ein Pflichtfeld und muss ausgefüllt sein, damit Contao den Kommentar speichert.
(Anonyme Kommentare sollten selbstverständlich nur erlaubt werden, wenn die Kommentare moderiert sind und vor der Veröffentlichung geprüft werden.)
Option 1: Namensfeld komplett ausblenden
Das Namensfeld kann im Template als verstecktes Feld mit einem voreingetragenen Wert eingefügt werden, auf die selbe Weise, wie es im vorherigen Beitrag für die E-Mail-Adresse gemacht wurde:
PHP-Code:
<!-- templates/mod_comment_form.html5 -->
[...]
<?php
echo '<input type="hidden" name="name" value="Anonym">';
echo '<input type="hidden" name="email" value="comment@example.com">';
foreach ( $this->fields as $field ) {
// Do not render the default fields 'name', 'email' and 'notify':
if ( !in_array($field->name, array('name', 'email', 'notify')) ) {
echo $field->parse();
}
}
?>
[...]
Dadurch kann der Verfasser allerdings keinen Namen mehr zu zusätzlich zum Kommentar angeben, falls er das möchte.
Option 2: Label des Namensfeldes anpassen
Die Feldbeschreibung (das Label) kann angepasst werden. Anstelle „Name“ könnte das Label z.B. „Dein Name oder Pseudonym (Angabe freiwillig)“ lauten.
Die Anpassungen können updatesicher in den Sprachdateien gemacht werden. Dazu beispielsweise /contao/languages/de/default.php anlegen (falls noch nicht vorhanden) und eigene Beschriftungen festlegen:
PHP-Code:
<?php
// contao/languages/de/default.php
// Angepasste Beschriftung für labels beim Kommentar-Formular:
$GLOBALS['TL_LANG']['MSC']['com_name'] = 'Dein Name oder Pseudonym (Angabe freiwillig):';
$GLOBALS['TL_LANG']['MSC']['com_comment'] = 'Dein Kommentar:';
$GLOBALS['TL_LANG']['MSC']['com_submit'] = 'Kommentar abschicken';
Bei mehrsprachigen Websites sollten die Labels aller verwendeten Sprachen angepasst werden, englisch z.B. in /contao/languages/en/default.php usw.
Contao rendert das Namensfeld dennoch als Pflichtfeld im Frontend:
HTML-Code:
<label for="ctrl_name_1" class="mandatory">
<span class="invisible">Pflichtfeld </span>Dein Name oder Pseudonym (Angabe freiwillig):<span class="mandatory">*</span>
</label>
Hier sollte man nun überlegen, ob man die von Contao erzeugten < span > Elemente per CSS mit display:none; ausblenden möchte oder nicht. Es sind weiterhin Pflichtfelder, daher sollte eigentlich weiterhin darauf hingewiesen werden. Das widerspricht aber dem Hinweis „Angabe freiwillig“.
Man könnte im Labeltext oder unter/über den Formularfeldern auch darauf hinweisen, dass der Nutzer „Anonym“ in das Namensfeld eintragen soll, wenn er seinen Namen nicht angeben möchte. Dadurch wird der Labeltext oder das Kommentarformular aber eventuell unnötig lang...
Option 3: Mit „Anonym“ vorausgefülltes Namensfeld (durch den Nutzer änderbar)
Eine Anpassung der Kommentar-Formularfelder per Data Container Array (DCA) in /contao/dca/tl_comments.php funktioniert leider nicht, weil die Felder, die im Frontend gerendert werden, innerhalb der Kommentarklasse fix definiert sind. Für das Namensfeld kann auf diese Weise kein Standardwert (default value) festgelegt werden.
Der Beitrag "Kommentar Formular mit Platzhaltern und CSS-Klassen ausstatten" brachte mich aber auf die Idee, auf ähnliche Weise den Standardwert des Namensfeldes im Formulartemplate anzupassen.
PHP-Code:
<!-- templates/mod_comment_form.html5 -->
[...]
<?php
echo '<input type="hidden" name="email" value="comment@example.com">';
// If the name field is empty, prefill it with the value "Anonym"
if ( empty($this->fields['name']->value) ) {
$this->fields['name']->value = 'Anonym';
}
// Render the fields
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();
}
}
?>
[...]
Falls die Website mehrsprachig ist, können sprachabhängig unterschiedliche Begriffe verwendet werden, z.B.:
PHP-Code:
<!-- templates/mod_comment_form.html5 -->
[...]
<?php
echo '<input type="hidden" name="email" value="comment@example.com">';
// Language of the current page
$com_locale = \Contao\System::getContainer()->get('request_stack')->getCurrentRequest()->getLocale();
// If the name field is empty, prefill it with the value "Anonym"
if ( empty($this->fields['name']->value) ) {
if ( $com_locale == 'de' ) {
$this->fields['name']->value = 'Anonym';
} else {
$this->fields['name']->value = 'Anonymous';
}
}
// Render the fields
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();
}
}
?>
[...]
Dadurch ist das Namenfeld mit „Anonym“ vorausgefüllt und der Verfasser des Kommentars kann selbst entscheiden, ob er es ändern möchte oder nicht...
Reihenfolge ändern: Erst das Kommentarfeld, dann das Namensfeld
Ergänzend zum vorherigen Beispiel noch ein Trick, wie die Reihenfolge der Formularfelder im Kommentartemplate geändert werden kann: Dazu beispielsweise das Kommentarfeld zuerst rendern und dieses Feld dafür bei der foreach-Schleife für die restlichen Felder ausschließen:
PHP-Code:
<!-- templates/mod_comment_form.html5 -->
[...]
<?php
echo '<input type="hidden" name="email" value="comment@example.com">';
// Render the 'comment' field first
echo $this->fields['comment']->parse();
// Language of the current page
$com_locale = \Contao\System::getContainer()->get('request_stack')->getCurrentRequest()->getLocale();
// If the name field is empty, prefill it with the value "Anonym"
if ( empty($this->fields['name']->value) ) {
if ( $com_locale == 'de' ) {
$this->fields['name']->value = 'Anonym';
} else {
$this->fields['name']->value = 'Anonymous';
}
}
// Render other fields
foreach ( $this->fields as $field ) {
// Do not render the default fields 'email', 'notify' and 'comment':
if ( !in_array($field->name, array('email', 'notify', 'comment')) ) {
echo $field->parse();
}
}
?>
[...]
IP-Adresse in Contao 5.3 anonymisieren
Hallo Community,
ich komme bei einem Thema nicht weiter.
Ich möchte gerne wissen, wie ich die IP-Adressen von Webseitenbesuchern anonymisieren kann. Die bisherigen Antworten bezogen sich ja auf die Kommentarfunktion.
Meine Lösungssuche war bisher nicht eindeutig.
Wenn das in Contao 5 bereits automatisch passieren sollte, wie kann ich das kontrollieren?
Danke und Grüße