Nehmen Sie Kontakt mit mir auf:
 










Fragen?

Martin Gamnitzer

 

NoIpPlugin v 0.2

UPDATE 2010-03-20: Piwik 0.55 ist fertig und ich biete damit mein Plugin nicht mehr zum Download an. Bitte nutzt stattdessen das Core-Plugin “AnonymizeIP”.

UPDATE 2010-02-28: Das Plugin wird in einer erweiterten Form in der nächsten Piwik-Version (0.55) vorhanden sein. Neu hinzugekommen ist die Möglichkeit, in der Konfiguration die Anzahl der zu löschenden Oktette einzustellen. Wer will, kann es sich schon vorher aus dem Piwik-SVN holen.
Bis zum Erscheinen der Version 0.55 wird das NoIpPlugin hier aber noch verfügbar bleiben.
Ich bedanke mich für alle Anregungen und Diskussionen, insbesondere bei André Bräkling.

See english version below.

Für Eilige:
Download NoIpPlugin v 0.2

Das Plugin im Piwik-Trac

Worum geht es?

Für alle, die hier neu ankommen, noch ein paar einleitende Worte: Das Speichern der IP-Adresse von Webseitenbesuchern wird in Deutschland zunehmend kritisch betrachtet und ist strenggenommen nicht erlaubt. Grundlage dafür ist das Telemediengesetz, welches zur Speicherung personenbezogener Daten das explizite Einverständnis des Nutzers voraussetzt. Nun kann man stundenlang darüber diskutieren, ob eine IP-Adresse als personenbezogen angesehen werden kann. Tatsache ist aber, dass Aufsichtsbehörden wie der Düsseldorfer Kreis dies so sehen. Wer also ein rechtssicheres Webtracking nutzen möchte, kann leider nicht mehr auf Google Analytics zurückgreifen. Doch auch selbst gehostete Lösungen wie Piwik speichern die IP-Adressen. Das hier beschriebene Piwik-Plugin setzt an dieser Stelle an, um Trackingdaten besser zu anonymisieren.

Die Umsetzung

Wie in der ersten Fassung bleibt das Plugin ziemlich simpel. Geändert wurde vor allem der Hook: Musste man in Version 0.1 noch auf die richtige Reihenfolge der Plugins achten, kommt jetzt der Hook “Tracker.saveVisitorInformation” zum Einsatz. Dieser wird direkt vor dem Speichern aufgerufen. Andere Plugins wie GeoIP haben ihre Arbeit dann schon beendet.
Außerdem werden die IP-Adressen jetzt nicht mehr mit einer Null überschrieben, sondern um die letzen beiden Blöcke gekürzt, wie bei André Bräkling beschrieben. Die Kürzung zu Beginn, noch vor dem GeoIP-Plugin, schenke ich mir. Die Gründe führe ich weiter unten aus. Im Augenblick sehe ich auch keinen Vorteil, die gekürzten IP-Adressen zu speichern. Aber auch keinen Nachteil.

Diskussion

Trackingfehler

In der ersten Version des NoIP-Plugins wurde die IP-Adresse einfach mit einer Null überschrieben. Das erfüllt soweit seinen Zweck. Allerdings kam im Piwik-Trac an anderer Stelle die Sorge auf, dass dieses Verfahren Nutzer mit deaktivierten Cookies falsch zählt. Ist dem so?
Holen wir etwas aus: Wird eine Webseite aufgerufen, versucht Piwik herauszufinden, ob es sich um einen neuen oder wiederkehrenden Besucher handelt. Diese Aufgabe übernimmt die Funktion recognizeTheVisitor in der Datei /core/Tracker/Visit.php. Dabei wird zuerst geprüft, ob ein Cookie gesetzt ist. Wenn nicht, wird über die gesamte Client-Konfiguration sowie die IP-Adresse ein Hash gebildet – ein mehr oder weniger individueller Fingerabdruck des Gastrechners. Ebenso enthält die log_visit-Tabelle diesen Hash (in der Spalte config_md5config). Der Hash-Wert des Besuchers wird mit den Daten in der Tabelle verglichen. Wird der Eintrag gefunden, handelt es sich um einen wiederkehrenden Besucher. Wenn nun alle IP-Adressen sehr früh durch eine Null ersetzt werden, würden zwei unterschiedliche Besucher mit der gleichen Rechnerkonfiguration als ein Besucher gezählt werden.
In meinem Plugin wird die IP-Adresse aber erst vor der Speicherung gekürzt. Zu diesem Zeitpunkt ist der Hash schon längst gebildet.

Kürzung vor der Weiterverarbeitung

André erwähnt in seinem weiter oben verlinkten Artikel, dass es nötig sein kann, die IP-Adresse bereits vor der Ermittlung der Stadt durch das GeoIP-Plugin kürzen zu müssen. Ich habe auf diesen Schritt in meinem Plugin verzichtet. Erstens, weil es wieder die Frage aufwirft, an welcher Stelle ich die erste Kürzung vornehmen kann, ohne im Core rumspielen zu müssen. Das würde einfacher werden, wenn man das Hook-System um eine Ausführungspriorität erweitern würde, wie im Ticket #1169 beschrieben. Zweitens, weil die Ermittlung der Stadt aus der IP-Adresse lokal geschiet und kein externer Service die IP-Adresse sieht.

Hash statt Kürzung

Im Piwik-Trac wurde auch vorgeschlagen, statt der Null einen MD5-Hash der IP-Adresse zu speichern. Das hätte zur Folge, dass die Spalte location_ip von “bigint unsignend” auf “varchar(32)” geändert werden müsste. Außerdem nützt diese Form der Anonymisierung nicht viel. Denn wenn ich (oder die Staatsanwaltschaft) herausfinden möchte, ob sich ein Nutzer mit einer bestimmten IP-Adresse auf meiner Seite aufgehalten hat, kann man natürlich die dann bekannte IP-Adresse hashen und mit den Datenbankeinträgen vergleichen. Nur andersherum geht es nicht.

———-

Wie immer freue ich mich über Rückmeldungen. Wenn wir uns auf diese Lösung als Konsenz verständigen können, werde ich versuchen, sie als Funktion für die kommende Piwik-Version 0.6 einzubringen. Ein Ticket dafür gibt schon lange.

 

English version

What is this about?

Some introductive words for all new visitors: In Germany, saving the IP address of a website visitor is not allowed. It’s said that the IP is personal data and a client must agree to the storage of his data explicitly. Therefore, tools like Google Analytics should not be used. But even software like Piwik saves the IP addresses. This Plugin was constructed to guarantee better Anonymity.

The Implementation

Like the first version, this plugin is very simple. The most important change is the used hook: In version 0.1, the order of the plugins was important. But now, I use “Tracker.saveVisitorInformation”, which is executed directly before saving to the database. Other plugins like GeoIp are already finished.
Furthermore, the IP addresses aren’t replaced by zero, but trimmed to two blocks, following the suggestion of André Bräkling. But I skipped the first trimming. I will explain my reasons later. And I don’t get the point of saving the short IP instead of zero, neither is it a drawback.

Discussion

Tracking faults

In the first version of this plugin, the IP was substituted for zero. It worked well, but it was mentioned in the Piwik-Trac that this could create wrong counts of users without cookie support. Is this true?
Let’s have a detailed look: If a website is called, Piwik tries to find out if the user is a new one ore a returning visitor. This is done by the function recognizeTheVisitor in /core/Tracker/Visit.php. At first, Piwik checks the cookie. Without it, Piwik creates a hash across the client configuration and the IP address – some kind of fingerprint. Moreover this hash is saved in the visitor_log table (in the column config_md5config). The hash of the current visitor must be compared with the the hashes in the database. If the entry was found, we have a returning visitor. But when all IP addresses would be zero, two clients with the same configuration would look the same.
My plugin avoids this situation. The IP is trimmed (or deleted) right beforen saving to the database, after the creation of the hash.

Trim before process

André mentions in his article, that it could be necessary to skip the last block of an IP before analysing the city with GeoIP. I’ve skipped this step. Firstly, it’s tricky to find the right position without hacking the core. This would be easier with the solution suggested in ticket #1169. Secondly, because to whole processing is done on the same server. Only in case we use a remote service, trimming would be necessary.

Hashing instead of trimming

There are suggestions in the Piwik Trac, that the IP should be hashed instead of deleted. This would mean to change the column location_ip from “bigint unsigned” to “varchar(32)”. Moreover this kind of anonymisation is not satisfying. If we want to know if a user with a known IP address has visited our site, we just need to hash the IP and check it against the database. Only the other way round is impossible.

———-

As always, I’m happy to get feedback. If everyone can agree to this solution, I will try to implement it into the next release of Piwik. There is a ticket for this topic long ago.

8 Kommentare zu “NoIpPlugin v 0.2”

  1. Herr Gamnitzer hat hier eine ideale Lösung geschaffen. Auch wir werden schon bald auf seine Entwicklung wechseln. Hervorragendes und durchdachtes Tool. Danke !

  2. Kay Strobach sagt:

    Genial, im Trac gibt es einen passenden Eintrag http://dev.piwik.org/trac/ticket/692#comment:18 ich würde es genial finden, wenn dieses Plugin seinen Web in die System Plugins von Piwik finden würde ;)

    Grüße
    Kay

  3. CJHarms sagt:

    Perfekt, vielen Dank für die Erstellung dieses Plugins, damit kann ich nun endlich sorgenfrei Piwik auf meiner Seite einführen.

  4. PiwikBlog sagt:

    “Denn wenn ich (oder die Staatsanwaltschaft) herausfinden möchte, ob sich ein Nutzer mit einer bestimmten IP-Adresse auf meiner Seite aufgehalten hat, kann man natürlich die dann bekannte IP-Adresse hashen und mit den Datenbankeinträgen vergleichen. Nur andersherum geht es nicht.”

    MD5 ist erstmal nicht reversible – soweit richtig. Aber bei einer Menge von gerade mal 4,1 Mrd. möglichen Hashes (2^32 IPs) ist das kein wirkliches Problem.

    Alles in allem ein sehr cooles Plugin – was mir jedoch fehlt ist eine mögliche Konfigurierung über die Oberfläche. Eine “per domain” Konfiguration wäre auch sehr gut – ich habe mehrere Pages die in den US gehostet sind und wenige die in .de sind.

  5. martin sagt:

    @Piwikblog:
    In der aktuellen Version wäre es etwas zu viel, eine grafische Oberfläche anzulegen. Immerhin wird man es nur einmal konfigurieren und dann nie mehr anfassen.
    Wenn man es für jede Domain einzeln einstellen könnte, wäre eine Oberfläche ein Muss. Aber auch das ist doch eher die Ausnahme. Ich denke nicht, dass viele Nutzer davon Gebrauch machen würden. Jedenfalls wäre der Aufwand dafür bedeutend höher als das, was bisher umgesetzt wurde.

  6. kA sagt:

    Stimmt es, dass das Plugin AnonymizeIP nicht verhindert, dass die IP-Adresse ungekürzt an andere Plugins weiter gereicht wird? Das könnte zu unzulässigen Protokollierungen und Weitergaben führen. Können Sie ein Plugin schreiben, das das verhindert?

    • martin sagt:

      kA, warum verwenden Sie keine vernünftige Email-Adresse? Ich war geneigt, Ihre Nachricht ungelesen als Spam anzusehen.

      Zu der Frage: Ja, AnonymizeIP kürzt die IP-Adresse erst vor dem Speichern in die Datenbank. Das ist auch Absicht und ein Abwägen von Prioritäten. Denn ein frühes Kürzen der IP-Adresse führt zu Fehlern in der Geolokalisierung.
      Auf der anderen Seite ist es natürlich richtig, dass andere Plugins theroetisch die IP-Adresse speichern oder weiterreichen könnten. Aber mit der Möglichkeit, Piwik auf dem eigenen Server zu installieren, geht eben auch die Verantwortung einher, keine Plugins zu installieren, bei denen man nicht (grob) weiß, was sie tun.

  7. Helle sagt:

    Ich danke sehr für dieses PlugIn!
    Eine Empfehlung, Meinerseits:
    MD5 ist veraltet und lässt sich bekanntermaßen sehr wohl rückrechnen.
    Ich schlage vor das moderne und tatsächlich bisher sichere SHA1 zu verwenden (dann bräuchte man anstatt 32 eben 40 Zeichen platz in der DB)
    Hier zwei Links dazu:
    - http://php.net/manual/de/function.sha1.php
    - http://de.wikipedia.org/wiki/Secure_Hash_Algorithm

Hinterlasse eine Antwort