Bloccare le pubblicità sui dispositivi Android

Aggiornamento del 14 aprile 2017: Alternate DNS, uno strumento precedentemente consigliato in questo articolo, è diventato a pagamento. Ho sostituito le indicazioni con l’uso di Adguard DNS che è analogo.

Il web è un calderone di informazioni sconfinato, ma è anche un grandissimo contenitore di pubblicità. A volte troppa pubblicità. Ci sono siti di notizie dove le “notizie correlate” sono un miscuglio di notizie vere e link sponsorizzati a prodotti che promettono di far perdere peso, blog in cui prima di leggere un articolo bisogna chiudere finestre modali gigantesche e lampeggianti, e così via.

Ma un altro aspetto negativo, forse il più importante, è la costante profilazione degli utenti da parte delle agenzie pubblicitarie. Siamo arrivati ad una situazione in cui ci addentriamo nell’era della no-privacy su Internet, per citare un articolo di Pagina99.

La pubblicità è fastidiosa e su cellulare lo è ancor di più.

Perché gli utenti bloccano la pubblicità

Tune, un’agenzia di marketing che lavora nel settore del publishing online, ha pubblicato uno studio dedicato proprio ad analizzare le ragioni per cui le persone bloccano la pubblicità sui dispositivi mobili e quanto il fenomeno incida sulla popolazione.

tune_blocking_2016
1 persona su 4 ha installato una app per bloccare le pubblicità

Dalle interviste è risultato che il 25% delle persone ha installato un’applicazione per bloccare gli annunci sul proprio dispositivo mobile. Probabilmente le ragioni non sono uguali per ogni persona, ma a mio avviso ce ne sono diverse e sono piuttosto importanti.

Le motivazioni principali per bloccare le pubblicità possono essere:

  • Risparmio di tempo — Le pubblicità pesano, e anche parecchio. Forse non è un gran problema con una ADSL o la fibra ottica, ma può esserlo con una connessione 3G. Nel 2015 il New York Times ha effettuato un test e ha rilevato come una pagina impiegasse 33 secondi a caricarsi, ma solo 7 secondi col blocco attivato.
  • Risparmio di denaro — Siamo ancora lontani dal momento in cui avremo i “giga” infiniti nei nostri piani tariffari. Per ora dobbiamo accontentarci di avere una soglia dati ben definita, ma una buona fetta di byte viene sprecata in pubblicità. Nel test del New York Times, la pagina con pubblicità pesava 16.3 MB mentre si scendeva a 3.5 MB per la stessa pagina senza annunci. In sostanza, la pubblicità consumava il 79% del traffico.
  • Privacy — Il tracking effettuato dai circuiti pubblicitari raggiunge livelli molto elevati, a volte decisamente inaccettabili. Il problema della privacy non si risolve con stupide normative sui cookie (con banner lapalissiani che avvisano del tracking, senza sortire alcun effetto) ma si risolve bloccando i tracker in partenza.
  • Fastidio costante — Molti siti che usano la pubblicità lo fanno in modo sbagliato. Invece di cercare di interessare l’utente, provano a infastidirlo piazzando i banner in mezzo al testo, o addirittura sopra di esso. Specialmente sui cellulari, lo spazio è una risorsa preziosa e non si può sprecare la maggior parte dello schermo per mostrare pubblicità.
  • Rischio di malware — La pubblicizzazione di applicazioni indesiderate o pericolose è piuttosto frequente quando si naviga col cellulare. Nel 2014 la BBC ha riportato uno studio che definisce le pubblicità “il più grande rischio di mobile malware”.

Credo sia pacifico che i siti web non hanno alcun diritto di consumare oltre il 50% del nostro traffico di rete, per di più tracciando tutti i nostri comportamenti. Senza contare il fatto che dovremmo proteggere le persone meno avvezze alla tecnologia dal rischio di installare malware sui propri dispositivi.

Fino a quando non si diffonderanno dei metodi pubblicitari sensati, sicuri e ragionevoli, la soluzione più efficace per arginare il problema è bloccare direttamente gli annunci. Viste le possibili motivazioni, rimane da vedere come funzionano effettivamente questi blocchi e come si possono installare su Android.

Qui potete vedere alcuni esempi di “prima/dopo” con il risultato che vogliamo ottenere:

Come funzionano i blocchi

Esistono diverse tecniche di blocco, specialmente quando si parla di ad blocker per il browser. Se prendiamo come esempi la famosissima estensione Adblock Plus, o la meno diffusa (ma più precisa e leggera) uBlock Origin, possiamo verificare che questi strumenti applicano varie tecniche:

  • Blocco di indirizzi web dedicati esclusivamente alla pubblicità
  • Blocco di specifici tipi di risorse (per esempio elementi Flash o immagini)
  • Filtraggio cosmetico (cioè le pubblicità difficili da bloccare vengono solo rese invisibili)

Quando si parla di blocco sui dispositivi mobili, ci sono alcuni browser specifici che combinano questi approcci. Il problema è che funzionano solo per navigare, ma non bloccano i banner all’interno delle app. Tuttavia, è possibile ottenere ottimi risultati sfruttando solo la prima strategia (il blocco degli indirizzi) perché molti siti web usano network pubblicitari esterni e quindi facili da bloccare.

Tanto per fare un esempio pratico, configurando il vostro dispositivo per bloccare (o comunque rendere irraggiungibile) il dominio googlesyndacation.com impedirete il caricamento di qualsiasi banner di Google AdSense su qualsiasi sito web. 😉

Per ottenere questo risultato, bisogna intervenire sulla risoluzione dei nomi di dominio, ovvero quel processo per cui un dispositivo trasforma un nome come google.com in un indirizzo IP come 216.58.214.110. Si può procedere in due modi:

  • Usare un server DNS filtrato — Il server DNS è il computer a cui si collegano i nostri dispositivi (o il nostro router) per effettuare la risoluzione di un dominio. Se il DNS filtra determinati indirizzi di server pubblicitari, i banner non riescono a caricarsi. Vi consiglio Adguard DNS che è gratuito e molto efficace.
  • Usare un file di host sul dispositivo — Prima di usare un server DNS, il computer (o il cellulare) verifica se ha già “la risposta pronta” controllando delle liste di traduzione da dominio a IP. Se il dispositivo è configurato con delle apposite liste che rendono irraggiungibili i server pubblicitari, il risultato è analogo (e anche lievemente più rapido).

In rete ci sono diversi articoli che spiegano come bloccare la pubblicità su Android, ma molti di essi si basano sul fatto che gli utenti abbiano effettuato il rooting al telefono, oppure funzionano solo con versioni di Android dalla 5.0 in poi. In realtà è possibile applicare queste tecniche con qualsiasi versione di Android a partire dalla 4.0, anche senza permessi di root.

Le sezioni seguenti spiegano come fare nei vari casi. Scegliete quella più adatta alle vostre esigenze!

Dispositivi con i permessi di root (Android 4.1 e seguenti)

I permessi di root ci consentono di effettuare modifiche al sistema operativo, compresa la possibilità di installare dei file di host personalizzati per bloccare i server pubblicitari. AdAway è un’ottima app che automatizza il tutto.

Non si può installare tramite Play Store (dove le app di questo tipo sono vietate) ma la potete ottenere tramite lo store F-Droid che tra l’altro contiene solo software libero e open source. Procedete quindi all’installazione di F-Droid:

  • Attivate l’installazione di app da origini sconosciute nelle preferenze di sicurezza del vostro dispositivo
  • Scaricate e installate l’APK di F-Droid dal sito
  • Aprite F-Droid e premete la voce Aggiorna i repository nel menu
  • Cercate AdAway e installatelo

Le figure mostrano il processo passo per passo:

A questo punto potete aprire AdAway:

  • Date i permessi di root all’applicazione quando viene richiesto
  • Cliccate sul bottone per scaricare i filtri
  • Confermate di voler riavviare il telefono quando vi viene proposto

Da questo momento il filtro sarà sempre attivo, potreste persino disinstallare l’app… anche se vi consiglio di tenerla e di aggiornare periodicamente i filtri con lo stesso pulsante. 🙂

Dispositivi senza permessi di root (Android 5.0 e seguenti)

Se il telefono non è rootato, l’unico modo per filtrare le richieste a un server DNS e/o le connessioni a determinati server è l’attivazione di una VPN da parte di una app. Ho già parlato in passato di cosa sono le VPN e di quanto sia fondamentale usarle per proteggersi, perciò dovreste avere una vaga idea di cosa sto parlando.

La cosa interessante però è che andremo ad usare una app che crea una finta VPN, cioè non instrada il nostro traffico su server sicuri ma si limita a bloccare gli indirizzi dei server che forniscono le pubblicità. Chi usa Android 5.0 o versioni successive può usare DNS66, che si può installare sempre tramite F-Droid (consultate la sezione dedicata ad AdAway per maggiori dettagli).

DNS66 contiene dei file di host già configurati, pertanto basta poco per attivare i filtri:

  • Aprite DNS66
  • Premete il pulsante con la freccia circolare per aggiornare i file di host
  • Tenete premuto a lungo il grosso bottone di accensione
  • Android vi mostrerà una richiesta per consentire l’uso della VPN
  • Verificate che ci sia il simbolo della chiave in alto sullo schermo e che DNS66 sia nello stato Running

I filtri si possono disattivare a piacere usando il bottone nell’app. Nelle versioni recenti di Android la VPN dovrebbe ripartire automaticamente anche se riavviate il telefono.

Dispositivi senza permessi di root (Android 4.0 e seguenti)

NoRoot Data Firewall è una app gratuita che permette di bloccare il collegamento ad Internet di alcune applicazioni. Lo fa usando lo stesso trucco della finta VPN usato da DNS66 e la cosa interessante è che dà la possibilità di usare un server DNS personalizzato. Possiamo pertanto sfruttare questa app anche senza utilizzarne le funzioni di firewall, ma limitandoci a impostare un server DNS che blocchi i server pubblicitari.

Procedete come segue:

  • Installate NoRoot Data Firewall da Google Play Store (ha uno scudo blu come logo)
  • Aprite la app e consentite l’avvio della VPN, dichiarandola sempre attendibile
  • Osservate che le app hanno due colonne di simboli gialli (sono relativi al filtraggio)
  • Cliccate sul simbolo dell’antenna in cima alla prima colonna e selezionate Permetti tutte le connessioni
  • Ripetete la stessa operazione con la seconda colonna (a questo punto dovreste aver consentito l’uso di Internet a tutte le app)
  • Spostatevi sulla sezione Config e sui Permessi di default mettete Permetti connessione in entrambi i casi
  • Scorrete in basso, attivate Set DNS server e come indirizzo impostate quello di Adguard DNS: 176.103.130.130 (la figura mostra un IP diverso)
  • Riavviate il dispositivo

Alcune versioni vecchie di Android potrebbero chiedervi una conferma di connessione alla VPN ogni volta che accendete il telefono.

Cambio del DNS per chi usa già una VPN

Come avrete notato, le due soluzioni per dispositivi senza permessi di root richiedono l’attivazione di una (finta) VPN. Però, come dicevo prima, è importante utilizzare un vero servizio VPN per navigare in modo sicuro.

Pertanto, chi ha a cuore la propria sicurezza anche nelle reti wireless dei locali pubblici fa già uso di una app VPN e non ne può attivare due contemporaneamente. Mi trovo anche io in questa situazione.

Fortunatamente, in questo caso si può utilizzare comunque un server DNS personalizzato. Quasi tutte le app Android dei vari provider VPN infatti sono basate su OpenVPN e i client OpenVPN consentono di configurare il server DNS. Il come però dipende un po’ da quale provider utilizzate e dalla app con cui vi collegate.

Io utilizzo VPNSecure e la loro app ufficiale, perciò userò questa come esempio. Per cambiare il DNS ho proceduto nel modo seguente:

  • Ho aperto la app e sono andato su Settings
  • Alla voce Advanced config ho scritto questa riga per impostare il server di Adguard DNS:
    dhcp-option DNS 176.103.130.130
  • Ho premuto Add to config
  • Ho scollegato e ricollegato la VPN

Altre app simili potrebbero avere i parametri in un altra sezione, però la riga di configurazione OpenVPN da aggiungere è sempre quella.

Conclusione

In questo post abbiamo visto che ci sono diversi modi per bloccare la pubblicità su Android e si può fare anche senza permessi di root. Il blocco si configura una volta e non ci si pensa più, o al limite si può ricontrollare ogni tanto per vedere se si devono aggiornare i file di host.

Così facendo si può godere di una navigazione più veloce, che consuma meno giga e meno esposta al rischio di malware o banner fastidiosi. Naturalmente il filtro “perfetto” non esiste e qualcosina potrebbe passare lo stesso, ma la differenza la noterete subito. 😀

Annunci

Estrarre la rubrica da un BlackBerry con software danneggiato

Un’amica mi ha sottoposto un dispositivo BlackBerry 9780 per un’analisi. Lo scopo era quello di recuperare il contenuto integrale della rubrica contatti, in quanto il software di sistema era pesantemente danneggiato e il dispositivo faticava ad accendersi. Dopo alcuni minuti di inattività, crashava improvvisamente con un messaggio di tipo App Error.

La prima cosa da fare, in questo caso, è rimuovere la batteria e reinserirla, per effettuare un reset. Dopo diversi tentativi in cui il dispositivo sembrava bloccato all’avvio, ho verificato che effettivamente il sistema si avviava, mettendoci però 11 minuti. Alla fine del caricamento, comparivano numerosi messaggi di errore relativi al software basato su Java.

Schermata di caricamento ed errori del software
Schermata di caricamento ed errori del software

In questi casi è possibile premere ripetutamente OK per raggiungere il menu del telefono. Dopo aver effettuato questa operazione, sono iniziate le difficoltà reali:

  • la rubrica mostrava la lista dei contatti (nomi) ma non era possibile aprirli per visualizzare i numeri
  • le impostazioni di sistema non erano accessibili e facevano crashare il dispositivo
  • non si riusciva ad effettuare un accoppiamento via bluetooth
  • il programma BlackBerry Desktop Manager, oltre a essere solo per Windows o Mac, non riusciva a connettersi al dispositivo

Il fatto di non poter aprire le impostazioni di sistema significava non potersi collegare al Wi-Fi per tentare di esportare i contatti tramite qualche app. I problemi col bluetooth lasciavano il collegamento USB come unica speranza.

Il mio piano infatti era quello di effettuare un backup con il software ufficiale di BlackBerry e poi esportare la rubrica. Dopotutto è possibile usare Windows in macchina virtuale (come quelle fornite da Microsoft sul sito Modern.ie) oppure creare una USB avviabile tramite le varie Release Candidate per sviluppatori. Peccato solo per l’errore nefasto restituito da BlackBerry Desktop Manager per Windows:

BlackBerry® Desktop Manager non è in grado di comunicare con il dispositivo BlackBerry connesso. Se il dispositivo si sta riavviando oppure la batteria è completamente scarica, fare clic su Riprova per tentare di ristabilire la connessione una volta completato il riavvio. In caso contrario, per risolvere il problema potrebbe essere necessario aggiornare BlackBerry® Device Software.

Come spesso accade, mi sono reso poi conto che Linux poteva venire in aiuto e salvare la situazione. Per evitare di installare troppo software sul mio portatile, ho creato una chiavetta USB avviabile con Xubuntu 14.10, assicurandomi di attivare la persistenza per poter salvare i dati recuperati. Ad ogni modo, qualsiasi distribuzione dovrebbe andare bene.

Per evitare problemi, ho effettuato nuovamente il reset del BlackBerry. Nel frattempo ho fatto partire Xubuntu. Una volta avviato il sistema, ho installato Barry, un software open source per gestire i dispositivi BlackBerry:

sudo apt-get install barrydesktop

Ho collegato il BlackBerry col cavo USB e ho avviato il programma con i permessi di amministratore, per evitare errori di accesso negato:

sudo barrydesktop

Barry ha individuato il dispositivo senza batter ciglio e mi ha chiesto di dargli un nome. Ho cliccato su Config… e poi sul primo tasto Configure… (quello relativo al backup) per selezionare tutti i campi disponibili. In realtà era di fondamentale importanza recuperare soltanto la rubrica, ma ero curioso di vedere quanto si potesse effettivamente estrarre.

Selezione degli elementi da estrarre
Selezione degli elementi da estrarre

Dopo aver salvato le mie scelte, ho dovuto solo premere il tasto Backup nella finestra principale:

Barry durante l'operazione di backup
Barry durante l’operazione di backup

Il processo si è interrotto “brutalmente” al 42%, probabilmente a causa degli errori software. Barry ha mostrato un messaggio di errore indicando quali campi non erano stati estratti. Ha quindi provveduto a salvare quello che era stato recuperato, incluso il contenuto integrale della rubrica. Il BlackBerry è poi crashato nuovamente.

Dato che il processo era stato avviato come amministratore, è stato necessario copiare i file dalla cartella dei backup alla home dell’utente che stavo utilizzando:

sudo cp /root/.barry/backup ~
sudo chmod a+r ~/backup

L’obiettivo finale era esportare i contatti in un formato “universale” che si potesse agevolmente aprire e magari importare su Gmail. Dato che Barry effettua il backup in un formato proprietario, ho utilizzato un comodo script chiamato BlackBerry-Address-Book-to-CSV.

È sufficiente scaricare il file ZIP, estrarlo ed eseguirlo sul file di backup. Si tratta solo di dare pochi comandi:

wget https://github.com/mintern/BlackBerry-Address-Book-to-CSV/archive/master.zip
unzip master.zip
cd BlackBerry-Address-Book-to-CSV-master
./bbab2csv ~/backup/[PIN]/[NOME].tar.gz

Al posto di [PIN] e [NOME] vanno inseriti il PIN del dispositivo e il nome dell’archivio creato da Barry, che varia di volta in volta. L’output in formato CSV viene mostrato nel terminale, se volete salvarlo su un file potete ripetere l’ultimo comando ridirezionando l’output:

./bbab2csv ~/backup/[PIN]/[NOME].tar.gz > ~/contatti_BB.csv

Il file risultante si trova nella home e si può aprire tranquillamente con LibreOffice oppure importare in un account Gmail, per sincronizzarlo con un dispositivo Android. Ovviamente va salvato in un posto sicuro, specialmente se si sta usando Linux su una live USB.

Il procedimento di recupero con Linux, alla fine, è stato molto veloce. La maggior parte del tempo è stata persa nei vari riavvii del dispositivo e tentando di far funzionare il software ufficiale di BlackBerry, che non è stato di alcun aiuto per estrarre i dati.

Tuttavia, BlackBerry Desktop Manager si è rivelato utile perlomeno per far tornare funzionante il telefono. Una volta collegato il cavo USB e ricevuto il messaggio di errore, ho cliccato su Aggiorna. Alla proposta di fare un backup ho risposto di no (altrimenti si sarebbe bloccato di nuovo) e ho confermato di voler formattare il dispositivo.

Alla fine del processo, il BlackBerry era perfettamente funzionante e tristemente vuoto. Avviando di nuovo Linux, con Barry ho potuto ripristinare la rubrica di cui era stato fatto il backup in precedenza.

La morale che si può trarre da questa esperienza è che da un BlackBerry con software danneggiato a volte si possono recuperare dei dati. Inoltre, non sempre l’applicazione ufficiale è la scelta migliore. Anzi, Barry consente di accedere almeno a una parte delle informazioni in casi in cui BlackBerry Desktop Manager non è in grado di collegarsi al dispositivo, con l’ulteriore vantaggio di non essere costretti a usare Windows.

Usare Jquery per gestire tabelle e altri elementi con overflow su dispositivi mobili

Qualche tempo fa mi stavo occupando di rendere un sito web mobile-friendly e mi sono trovato di fronte alla necessità di gestire delle tabelle molto larghe. Purtroppo non era possibile pretendere che le tabelle fossero tutte quante di larghezza ridotta o con poche colonne, perciò era necessario usare l’overflow orizzontale con il CSS.

Oltre alle tabelle, ci sarebbero state anche delle formule visualizzate con Mathjax che — se molto lunghe — avrebbero “sfondato” la pagina. Ho avuto modo di accorgermi ben presto che la soluzione è leggermente meno semplice di quanto si possa pensare.

Nonostante le ultime versioni di Android e di iOS per iPhone/iPad supportino lo scorrimento di parti di pagina affette da overflow, le versioni vecchie di Android non permettono di scorrere correttamente con il dito, mentre quelle di iOS richiedono due dita e ciò è poco intuitivo.

Fortunatamente, ho trovato una soluzione interessante in Javascript sul blog di Chris Barr. Leggendo i commenti, ho anche scoperto con piacere che un lettore (Jeff) ne aveva fornito una versione Jquery, mentre un altro (Cormac) suggeriva l’utilizzo del metodo .live() per consentirne un corretto utilizzo anche su elementi caricati nel DOM in un momento successivo.

Ho deciso di unire i due approcci ed è venuto fuori il seguente risultato, che potete includere all’interno della pagina:


function isTouchDevice(){
	try {
		document.createEvent("TouchEvent");
			return true;
	}
	catch(e) {
		return false;
	}
}

function touchScroll(selector) {
    if (isTouchDevice()) {
        var scrollStartPosY=0;
        var scrollStartPosX=0;
        $("body").delegate(selector, 'touchstart', function(e) {
            scrollStartPosY=this.scrollTop+e.originalEvent.touches[0].pageY;
            scrollStartPosX=this.scrollLeft+e.originalEvent.touches[0].pageX;
        });
        $("body").delegate(selector, 'touchmove', function(e) {
            if ((this.scrollTop < this.scrollHeight-this.offsetHeight &&
                this.scrollTop+e.originalEvent.touches[0].pageY < scrollStartPosY-5) ||                  (this.scrollTop != 0 && this.scrollTop+e.originalEvent.touches[0].pageY > scrollStartPosY+5))
                    e.preventDefault();
            if ((this.scrollLeft < this.scrollWidth-this.offsetWidth &&
                this.scrollLeft+e.originalEvent.touches[0].pageX < scrollStartPosX-5) ||                  (this.scrollLeft != 0 && this.scrollLeft+e.originalEvent.touches[0].pageX > scrollStartPosX+5))
                    e.preventDefault();
            this.scrollTop=scrollStartPosY-e.originalEvent.touches[0].pageY;
            this.scrollLeft=scrollStartPosX-e.originalEvent.touches[0].pageX;
        });
    }
}

La cosa interessante della soluzione proposta da Jeff (e che ho riutilizzato) è quella di permettere il corretto funzionamento dei link contenuti nell’elemento che scorre.

Come potete intuire dal codice, la prima funzione controlla se il dispositivo è dotato di touchscreen oppure no, mentre la seconda accetta un selettore Jquery e associa un evento che viene azionato quando l’utente scorre con il dito sopra gli elementi corrispondenti.

Per applicare lo scorrimento alle tabelle, è necessario racchiuderle con un contenitore (in questo caso un <div>) in modo da applicare l’overflow, che con le tabelle non funziona in modo convenzionale.

La funzione deve essere richiamata dentro a $(document).ready(), e può essere utilizzata così, tenendo presente il trucco per le tabelle:


$(document).ready(function() {
    touchScroll(".MathJax_Display");
    $("table").wrap('<div class="table-scroll"></div>');
    $(".table-scroll").css('overflow', 'auto');
    touchScroll(".table-scroll");
});

La prima chiamata a touchScroll() si occupa delle formule prodotte da MathJax, i cui elementi compaiono nel DOM in un momento successivo ma sono catturati ugualmente grazie all’uso di .delegate(). Le seguenti righe si occupano invece di racchiudere le tabelle con un contenitore di classe table-scroll e applicano la funzionalità di scorrimento usando il selettore adeguato.

Questo è quanto! Come avete visto, una volta predisposta la funzione di Chris Barr modificata da Jeff, Cormac e me è sufficiente usare una chiamata per applicare l’overflow agli elementi desiderati. Nel caso delle tabelle, è necessario inserire un contenitore addizionale, ma questo si può fare con Jquery, in modo da evitare di introdurre modifiche al markup della pagina.