Att tänka på: Google AdSense, PII, och URL:er

Marcus Olsson,

webbjobb.io så är AdSense en betydande intäktskälla, därför var det mindre lustigt att se det här i ett mail från Google:

Dear Publisher,

It has come to our attention that you are passing personally identifiable information (PII) to Google through your use of one or more of Google's advertising products -- DFP, AdSense, and/or DoubleClick AdExchange.

Our systems have detected information, including email addresses and/or passwords, being passed from the ad requests attached to this email.

[...]

We require that you fix the issue within 30 days.

Självklart en dundertabbe från min sida, då jag faktiskt har koll på vad som gäller; bifogat var även exempel på data som de flaggat:

1Url sample: https://webbjobb.io/prenumerera/verifiera/redacted@example.com/xxxxxxxxxx
1Url sample: https://webbjobb.io/prenumerera/verifiera/redacted@example.com/xxxxxxxxxx

När jag byggde webbjobb.io så lade jag en del tid på att planera ut URL:erna, självklart vill man ha fina URL:er som direkt förklarar vad de gör utan att kännas "konstiga" för användaren, därför finns det sådana som:

1webbjobb.io/prenumerera/verifiera/example@example.com/xxxxxxxxxx
2webbjobb.io/prenumerera/installningar/example@example.com/xxxxxxxxxx
3webbjobb.io/prenumerera/avsluta/example@example.com/xxxxxxxxxx
1webbjobb.io/prenumerera/verifiera/example@example.com/xxxxxxxxxx
2webbjobb.io/prenumerera/installningar/example@example.com/xxxxxxxxxx
3webbjobb.io/prenumerera/avsluta/example@example.com/xxxxxxxxxx

Där jag använde e-postadressen och en slumpmässig sträng på 10 tecken för att verifiera användaren.

Problemet med allt det här (vilket jag igen, borde ha tänkt på) är att Google läser av URL:en för att räkna ut vilka annonser som ska servas till användaren – och e-postadressen skickas då med i anropet. Google förbjuder en strikt att skicka med PII (Personal Identifiable Information) i annonsanropen.

För att lösa problemet var första tanken var så klart att bara ta bort annonserna på de sidorna det gällde, men jag ville inte riskera att fastna på något liknande igen – så jag fick bygga om systemet för att använda sig av GUIDs istället (och självklart vara bakåtkompatibelt). För PHP/Laravel så är det så enkelt som (exempelvis):

1<?php
2// via: http://stackoverflow.com/a/15875555/684195
3public static function generateGUID() {
4
5 $data = openssl_random_pseudo_bytes(16);
6
7 assert(strlen($data) == 16);
8
9 $data[6] = chr(ord($data[6]) & 0x0f | 0x40);
10 $data[8] = chr(ord($data[8]) & 0x3f | 0x80);
11
12 return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
13}
1<?php
2// via: http://stackoverflow.com/a/15875555/684195
3public static function generateGUID() {
4
5 $data = openssl_random_pseudo_bytes(16);
6
7 assert(strlen($data) == 16);
8
9 $data[6] = chr(ord($data[6]) & 0x0f | 0x40);
10 $data[8] = chr(ord($data[8]) & 0x3f | 0x80);
11
12 return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
13}

Fulare URL:er t.ex:

1webbjobb.io/prenumerera/verifiera/xxxxxxxx-xxxx-4xxx-8xxx-xxxxxxxxxxxx
1webbjobb.io/prenumerera/verifiera/xxxxxxxx-xxxx-4xxx-8xxx-xxxxxxxxxxxx

Men enligt Googles riktlinjer – och i slutändan säkrare för användarna.