Lees deel 2 hier!
Sinds 25 mei van vorig jaar is de Algemene Verordening Gegevensbescherming (kortweg AVG) van toepassing. Binnen de AVG wordt een ruime definitie voor het begrip ’persoonsgegevens’ gehanteerd, namelijk “alle informatie over een geïdentificeerde of identificeerbare natuurlijke persoon”. Het gaat hierbij dus om gegevens die direct over een persoon gaan, of gegevens die in combinatie met andere gegevens naar deze persoon te herleiden is.
Persoonsgegevens mogen alleen verwerkt worden voor het doel waarvoor ze verkregen zijn. Dit wordt ‘doelbinding’ genoemd. Om te voorkomen dat organisaties persoonsgegevens verzamelen zonder dit goed te kunnen verantwoorden, moeten zij de uitgangspunten van privacy by design en privacy by default invoeren. Privacy by design houdt in dat een organisatie er al bij het ontwerpen van producten en diensten voor zorgt dat persoonsgegevens goed worden beschermd. Privacy by default houdt in dat een organisatie technische en organisatorische maatregelen moet nemen om ervoor te zorgen dat zij, als standaard, alléén persoonsgegevens verwerkt die noodzakelijk zijn voor het specifieke doel dat zij wil bereiken. Dit betekent bijvoorbeeld dat het niet toegestaan is om meer gegevens te vragen dan nodig is voor het abonneren op een nieuwsbrief.
De kans bestaat echter dat je onrechtmatig persoonsgegevens verwerkt, zonder dat je je hier bewust van bent. Bijvoorbeeld doordat je tools of scripts op je website gebruikt die meten op welke URL een bezoeker zich bevindt. Deze URL kan bijvoorbeeld een e-mailadres bevatten als de klant via een klantmail je website bezoekt.
In mijn tweedelige blog laat ik je daarom graag zien welke maatregelen je kunt nemen om het onbedoeld verzamelen en verwerken van persoonsgegevens op je website zoveel mogelijk te voorkomen. Daarbij worden persoonsgegevens overschreven, niet verwijderd - mochten er dus onbedoeld bepaalde gegevens verzameld worden, dan kun je deze goed herkennen en de bron ervan opsporen.
In deel 1 introduceer ik de ‘PII-preventiematrix’ en laat ik je zien hoe je met behulp van Google Tag Manager persoonsgegevens kunt blacklisten en whitelisten op een toolonafhankelijke manier - dat wil zeggen: niet voor elk script of elke tool opnieuw, maar slechts één keer voor alle scripts en tools. De uitgewerkte maatregelen zijn bedoeld voor technisch webanalisten, die niet terugdeinzen voor het gebruik van Google Tag Manager en Javascript. Ook maak ik gebruik van reguliere expressie (regex) om patronen te beschrijven.
De PII-preventiematrix
De maatregelen die je kunt nemen om de verwerking van persoonsgegevens te voorkomen, deel ik in volgens twee classificaties. Samen vormen ze een matrix die ik de PII-preventiematrix noem - hierin verwijst de afkorting PII naar de Engelse term ‘Personal Identifiable Information’ die min of meer gelijk staat aan het begrip ‘persoonsgegevens’. De classificaties zijn:
1) toolonafhankelijk vs. toolafhankelijk.
Bij een toolonafhankelijke oplossing moeten de persoonsgegevens voor elke tool opnieuw vervangen worden. De volgorde waarin verschillende gebeurtenissen plaatsvinden is daarbij als volgt:
- Gegevens zoals een URL komen beschikbaar
- Scripts en/of tools worden geladen
- Elk(e) script en/of tool vervangt de persoonsgegevens
- Elk(e) script en/of tool verwerkt de gegevens die ontdaan zijn van persoonsgegevens
Omdat bij de toolafhankelijke oplossing stap III meerdere keren uitgevoerd dient te worden, is dit tamelijk inefficiënt. Daarbij komt dat sommige scripts en/of tools niet eens de mogelijkheid bieden om data zoals URL’s te bewerken alvorens deze door de scripts en/of tools daadwerkelijk te verwerken. De toolonafhankelijke oplossing biedt hiervoor uitkomst. Bij een toolonafhankelijke oplossing is de oplossing tooloverstijgend, en hoeft deze dus slechts een keer toegepast te worden. De volgorde waarin verschillende gebeurtenissen plaatsvinden is daarbij als volgt:
- Gegevens zoals een URL komen beschikbaar
- Eventuele persoonsgegevens binnen de beschikbare gegevens worden vervangen
- Scripts en/of tools worden geladen
- Elk(e) script en/of tool verwerkt de gegevens die ontdaan zijn van persoonsgegevens
2) blacklisten vs. whitelisten.
Bij blacklisting definieer je een lijst van gegevens die niet verwerkt mogen worden. Staat een bepaald gegeven niet op de blacklist? Dan mag deze verwerkt worden. Whitelisten werkt andersom: hierbij definieer je een lijst van gegevens die wél verwerkt mogen worden. Een bepaald gegeven mag alleen verwerkt worden als deze op de lijst voorkomt. Daarmee is whitelisten dus strenger dan blacklisten.
De classificaties van hierboven resulteren in een kwadrant van 4 oplossingen om de verwerking van persoonsgegevens te voorkomen:
|
Blacklisten |
Whitelisten |
Toolonafhankelijk |
Huidige blog |
Huidige blog |
Toolafhankelijk |
Deel 2/2 |
Deel 2/2 |
In de rest van deze blog zal ik dieper ingaan op het toolonafhankelijk blacklisten en whitelisten van persoonsgegevens met behulp van Google Tag Manager. In de volgende blog zal ik laten zien hoe je blacklisting en whitelisting op Google Analytics kunt toepassen.
Toolonafhankelijk persoonsgegevens vervangen
Aangezien de meeste scripts op een pagina toegang hebben tot de metadata van een webpagina – denk aan de URL en paginatitel - zijn vooral deze gegevens geschikt om op een toolonafhankelijke manier van persoonsgegeven te ontzien. Dat wil zeggen: voordat de gegevens voor andere scripts beschikbaar is. Het komt regelmatig voor dat deze metadata, bedoeld of onbedoeld, persoonsgegevens bevatten. Denk bijvoorbeeld aan een mailadres dat als queryparameter wordt meegestuurd op de bestemmingspagina van een klantmail. Of een postcode die als queryparameter wordt meegestuurd vanaf een vergelijkingssite.
Toolonafhankelijk blacklisten - hoe doe ik dat?
Met de oplossing van toolonafhankelijk blacklisten specificeer je de reguliere expressies waaraan persoonsgegevens voldoen (de blacklist). Vervolgens check je of deze patronen voorkomen in de gegevens die je wilt verwerken. Als dit het geval is, dan vervang je de substrings die aan deze patronen voldoen. Dit doe je voordat de gegevens door andere scripts verwerkt worden (toolonafhankelijk).
Ter illustratie wil ik je graag laten zien hoe je de URL-parameter “foo” en/of “bar” kunt vervangen door “[REDACTED]” en e-mailadressen door “[REDACTED EMAIL]”. De URL “https://www.domein.nl?foo=waarde&bar=waarde&email=siemon@i-spark.nl&foobar=waarde” wordt dan “https://www.domein.nl?foo=[REDACTED]&bar=[REDACTED]&email=[REDACTED_EMAIL]&foobar=waarde”. Hieronder leg ik stap voor stap uit hoe je dit met behulp van Google Tag Manager kunt realiseren:
1. Definieer je blacklist.
- Maak een nieuwe variabele aan van het type ‘Aangepaste JavaScript-macro’ en noem deze “PII”. Zie het voorbeeld hieronder.
- Definieer binnen de nieuwe variabele een array met daarin voor elk type persoonsgegeven een object. In ons voorbeeld gaat het om twee typen persoonsgegevens, namelijk geblackliste parameters en e-mailadressen.
- Geef de objecten die je voor elke type persoonsgegeven gedefinieerd hebt 3 keys: ’name’, ‘regex’ en ‘replacement’. Geef voor de name key een string op waarmee je beschrijft om welk type persoonsgegeven het gaat. Dit is vooral voor jezelf handig. Geef voor de regex key de reguliere expressie op waaraan het type persoonsgegeven voldoet. Geef voor de replacement key de string op waarmee het persoonsgegeven vervangen moet worden.
- Return de gedefinieerde array.
function(){ var piiRegex = [{ name: 'BLACKLISTED PARAMETER', regex: /[?&](foo|bar)=([^&$#]+)/gi, replacement: "[REDACTED]"
},{
name: 'EMAIL',
regex: /(([a-zA-Z0-9_\-\.]+)(@|%40)([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}))/gi,
replacement: "[REDACTED_EMAIL]"
}];
return piiRegex;
} |
2. Creëer een nieuwe functie die persoonsgegevens vervangt.
- Maak een nieuwe variabele aan van het type ‘Aangepaste JavaScript-macro’ en noem deze “return redactData function”. Gebruik hierbinnen de onderstaande Javascript.
- De variabele returnt een functie met 2 parameters: de 1e parameter is een gegevensstring, de 2e parameter is de eerder gedefinieerde blacklist die we “PII” hebben genoemd. Voor elk van de gedefinieerde persoonsgegevens in de blacklist checkt de functie of de reguliere expressie voorkomt in de gegevensstring, totdat er een match is. Op dat moment wordt het persoonsgegeven de gegevensstring vervangen door de bijbehorende waarde van de replacement key, en geeft de functie de gegevensstring terug, waarbij persoonsgegevens vervangen zijn.
- Door de functie in een aparte variabele te plaatsen kun je deze altijd aanroepen vanuit iedere tag. Stel, je leest de waardes van formuliervelden uit en wilt deze naar Google Analytics versturen. Om deze gegevens van persoonsgegevens te ontzien voordat je ze naar Google Analytics verstuurt, kun je de zojuist gedefinieerde functie vanuit een tag aanroepen. Daarvoor geef je de gegevensstring en de gedefinieerde blacklist “PII” als argumenten mee. Dat ziet er dan als volgt uit:
{{return redactData function}}(gegevensstring, {{PII}})
function(){ return function(data, PII){ for (var i = 0; i < PII.length; i++){ data = data.replace(PII[i].regex, PII[i].replacement);};
return data;
}
} |
3. Creëer een tag die persoonsgegevens vervangt.
- Maak een nieuwe tag aan van het type ‘Aangepaste HTML’. Gebruik hierbinnen de onderstaande Javascript.
- De tag a) leest de titel en URL uit van de webpagina waarop de tag geladen wordt, b) vervangt middels bovenstaande functie de eerder gedefinieerde persoonsgegevens in de titel en URL van de webpagina, c) past, indien persoonsgegevens aanwezig zijn, de URL in de browser aan en/of vervangt de titel van de webpagina, en d) verstuurt een event “piiRedacted” naar de dataLayer, tezamen met de nieuwe URL.