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.
Lascia un commento