Aggirare la censura di Facebook

Facebook ha delle regole in merito al tipo di contenuti che possono essere caricati sul sito. Indipendentemente da quello che ciascuno può pensare, Facebook decide legittimamente cosa fare in casa propria e chi va a casa di Facebook deve rispettare quelle regole.

Quanto segue ha il solo scopo di fornire una proof of concept, non è un’istigazione a violare leggi o ad abusare in alcun modo di terzi.

Analizzando il modo in cui Facebook include le immagini è possibile aggirare eventuali censure oppure trarre in inganno altri utenti.

Ho individuato due modi: uno un po’ grezzo, ma che può mettere in atto chiunque abbia la possibilità di avere una directory accessibile con un URL, e un altro un pochino più raffinato.

Ci sono due modi per includere un’immagine in Facebook: o la si carica con l’apposita interfaccia del sito oppure si specifica l’URL dell’immagine, il sito la carica in autonomia e la visualizza; i due metodi descritti di seguito si applicano solamente a questo secondo scenario.

Ipotizziamo di avere una directory prova nel sito example.com e carichiamo l’immagine foto.jpg nella directory prova; l’URL dell’immagine sarà http://example.com/prova/foto.jpg

Si include l’immagine in un post di Facebook indicando l’URL http://example.com/prova/foto.jpg e dopo qualche secondo Facebook mostra l’immagine caricata direttamente da example.com. A questo punto si cancella il file foto.jpg caricato da Facebook e lo si sostituisce con un’altra immagine con lo stesso nome. Tutte le persone che cliccheranno la foto non vedranno quella mostrata da Facebook, ma quella che è stata sostituita. Questo metodo ha l’evidente problema che, se Facebook dovesse ricontrollare in un secondo tempo l’immagine, riceverebbe l’immagine caricata in seguito.

Un secondo metodo fa uso di un linguaggio lato server per decidere quale immagine utilizzare, in questo caso viene usato PHP con le estensioni GD, ma un linguaggio vale l’altro. Probabilmente con un po’ di lavoro si possono anche utilizzare le regole di rewrite di Apache o regole analoghe di altri web server senza ricorrere a linguaggi lato server.

Quando Facebook carica l’immagine da un URL esterno si identifica tramite uno user agent specifico:
User-Agent: facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)

Possiamo quindi creare nella nostra directory prova un file index.php con questo contenuto:

<?php
$fb = false;
foreach (getallheaders() as $name => $value) {
  if (stristr($name,'User-Agent') and stristr($value, 'facebook')) $fb = true;
}
header('Content-Type: image/jpeg');
if ($fb) {
  imagejpeg(imagecreatefromjpeg('fbsicura.jpg'));
} else {
  imagejpeg(imagecreatefromjpeg('vera.jpg'));
}

Nella medesima directory carichiamo i file fbsicura.jpg e vera.jpg

Per includere l’immagine si utilizza l’URL http://example.com/prova/fbsicura.jpg, questa sarà l’immagine caricata da Facebook, mentre quando si clicca sull’immagine verrà visualizzata vera.jpg.

Questo secondo metodo ha il vantaggio di servire a Facebook sempre l’immagine che il sito deve vedere in quanto l’immagine fornita al client dipende dall’esistenza della stringa facebook all’interno dello user agent del client. Se mai Facebook dovesse decidere in seguito di ricaricare l’immagine, vedrebbe sempre fbsicura.jpg

Questi metodi sono stati testati prima di scrivere l’articolo in un gruppo privato di Facebook.

Il consiglio è, come sempre, di stare molto attenti a ciò che si clicca anche su Facebook. Quando viene inclusa un’immagine esterna, Facebook specifica il nome del sito da cui proviene: attenzione ai nomi di siti sconosciuti.

Autore: Luigi Rosa

Consulente IT, sviluppatore, SysAdmin, cazzaro, e, ovviamente, geek.

Un commento su “Aggirare la censura di Facebook”

Spazio per un commento