Video

Durante la conferenza F8 2015, Jonathan Gross e Brent Dorman hanno spiegato come integrare Facebook Login in modo più sicuro.

Chiave segreta

La chiave segreta è usata per generare i token d'accesso in alcuni flussi di accesso ed è concepita per un uso sicuro dell'app da parte di utenti fidati. Può essere usata per creare facilmente un token d'accesso dell'app in grado di eseguire richieste all'API per conto di qualsiasi utente dell'app, per questo è estremamente importante che non sia compromessa.

Pertanto la chiave segreta o un token d'accesso dell'app non devono mai essere inclusi nel codice.

Per offrire la maggiore protezione possibile, consigliamo di usare token d'accesso dell'app solo direttamente dai server dell'app. Nel caso di app native, invece, consigliamo che l'app comunichi con il tuo server e con quello che effettua le richieste API a Facebook usando il token d'accesso dell'app. Per questo motivo, se il valore di "Tipo di app" nelle Impostazioni avanzate della Dashboard gestione app è impostato su Native/Desktop, daremo per scontato che la tua app nativa contenga la chiave segreta o un token d'accesso dell'app nel file binario e non consentiremo chiamate firmate con un token d'accesso dell'app. L'API si comporterà come se il token d'accesso non fosse stato fornito.

Chiamate lato server sicure con appsecret_proof

Puoi ridurre l'esposizione a malware e spam chiedendo che le chiamate tra server all'API di Facebook siano firmate con il parametro appsecret_proof. La verifica della chiave segreta è un hash sha256 del token d'accesso, che usa come chiave la chiave segreta. Per individuare la chiave segreta, dalla Dashboard gestione app vai a Impostazioni > Di base.

Generazione della verifica

Il seguente esempio di codice mostra come appare la chiamata in PHP:

$appsecret_proof= hash_hmac('sha256', $access_token.'|'.time(), $app_secret); 

Alcuni sistemi operativi e linguaggi di programmazione restituiranno un'indicazione temporale che è un float. Assicurati di effettuare la conversione in un valore intero prima del calcolo della verifica della chiave segreta. Alcuni linguaggi di programmazione creano l'hash come oggetto digest. Assicurati di esprimere l'hash come oggetto esadecimale.

Aggiunta della verifica

Aggiungi il risultato come parametro appsecret_proof con appsecret_time impostato sull'indicazione temporale che hai usato quando hai applicato l'algoritmo di hashing alla chiave segreta a ogni chiamata effettuata:

curl \
  -F 'access_token=ACCESS-TOKEN' \
  -F 'appsecret_proof=APP-SECRET-PROOF' \
  -F 'appsecret_time=APP-SECRET-TIME' \
  -F 'batch=[{"method":"GET", "relative_url":"me"},{"method":"GET", "relative_url":"me/accounts"}]' \
  https://graph.facebook.com

Le verifiche della chiave segreta con indicazione temporale verranno considerate scadute dopo 5 minuti, quindi è consigliabile generare una nuova verifica in linea quando si effettua ogni chiamata all'API Graph.

Richiesta della verifica

Nella sezione Impostazioni > Avanzate della Dashboard gestione app nella sezione Protezione, abilita Richiedi la chiave segreta. Quando questa opzione è abilitata, sono consentite solo le chiamate all'API che includono appsecret_proof.

Chiamate lato client sicure con i token di breve durata e il flusso del codice

In alcune configurazioni, le app riutilizzano token di lunga durata per diversi client, ma ti sconsigliamo di farlo. Usa invece token di breve durata generati attraverso il flusso del codice, come descritto nella documentazione relativa ai token d'accesso.

Alterazione dei token

Per capire come avviene, immagina che un'app nativa di iOS debba effettuare chiamate all'API ma che, invece di farlo direttamente, comunichi con il proprio server trasmettendogli un token generato mediante l'SDK per iOS. Questo token sarebbe poi usato dal server per effettuare chiamate all'API.

L'endpoint usato dal server per ricevere il token potrebbe essere compromesso e altri potrebbero trasmettergli token d'accesso per app diverse. Si tratta di un'opzione poco sicura, ma esiste un modo per proteggersi: non dare mai per scontato che i token d'accesso siano stati generati dall'app che li utilizza, ma controllali usando endpoint di debug.

Controlli regolari della validità dei token d'accesso

Se non utilizzi gli SDK di Facebook, controlla regolarmente la validità del token d'accesso. Sebbene i token d'accesso abbiano una scadenza programmata, è possibile farli scadere in anticipo per motivi di sicurezza. Se non usi gli SDK di Facebook nell'app, è estremamente importante implementare manualmente frequenti controlli (almeno quotidiani) della validità dei token per assicurarti che la tua app non utilizzi un token scaduto in anticipo per motivi di sicurezza.

Parametro state

Se usi la finestra di dialogo Accedi di Facebook sul tuo sito web, il parametro state è una stringa unica che protegge la tua app dagli attacchi Cross-Site Request Forgery.

Abilitazione dell'uso della modalità con limitazioni

La modalità con limitazioni protegge le app impedendo agli autori di atti illeciti di alterare il reindirizzamento. L'abilitazione della modalità con limitazioni è obbligatoria per tutte le app.

Prima di attivare la modalità con limitazioni nella Dashboard gestione app, assicurati che l'attuale traffico di reindirizzamento sia ancora attivo eseguendo queste operazioni nelle impostazioni di Facebook Login:

  • Per le app con URI di reindirizzamento dinamici, usa il parametro State per restituire le informazioni dinamiche a un numero limitato di URI di reindirizzamento. Quindi, aggiungi ognuno degli URI di reindirizzamento con limitazioni alla lista di URI di reindirizzamento OAuth validi.

  • Per le app con un numero limitato di URI di reindirizzamento, aggiungi ognuno di questi alla lista di URI di reindirizzamento OAuth validi.

  • Per le app che utilizzano solo l'SDK JavaScript di Facebook, il reindirizzamento del traffico è già protetto e non devi fare altro.

Dopo aver eseguito queste operazioni, assicurati di abilitare la modalità con limitazioni.

Funzionamento della modalità con limitazioni

La modalità con limitazioni evita che gli URI di reindirizzamento vengano alterati pretendendo che corrispondano esattamente a quelli contenuti nella lista di URI di reindirizzamento OAuth validi. Ad esempio, se la lista contiene www.esempio.com, la modalità con limitazioni non ammetterà www.esempio.com/token come reindirizzamento valido. Non ammetterà neanche altri parametri di query non presenti nella lista di URI di reindirizzamento OAuth validi.

Uso del protocollo HTTPS

Usa il protocollo Internet HTTPS che, a differenza di HTTP, utilizza la crittografia. Il protocollo HTTPS mantiene privati i dati trasmessi, proteggendoli da eventuali intercettazioni. Inoltre, durante la trasmissione, i dati sono protetti da manomissioni mirate, ad esempio, dall'inserimento di inserzioni o codice dannoso.

Dal 6 ottobre 2018 tutte le app dovranno utilizzare il protocollo HTTPS.

Attivazione dell'SDK JavaScript per Facebook Login

Se indichi che utilizzi l'SDK di JavaScript per effettuare l'accesso impostando il pulsante Accedi con l'SDK JavaScript su "sì", il dominio della pagina che ospita l'SDK deve corrispondere a uno di quelli presenti nella lista Domini consentiti per l'SDK JavaScript. Ciò garantisce che i token d'accesso siano restituiti solo a callback all'interno di domini autorizzati. Soltanto le pagine https sono supportate per azioni di autenticazione con l'SDK JavaScript di Facebook.

Per quanto riguarda le integrazioni JSSDK create prima del 10 agosto 2021, sarà eseguito il backfill di questa lista con valori basati sull'uso attuale. Non è necessaria alcuna azione aggiuntiva.

Per le nuove integrazioni create dopo il 10 agosto 2021, aggiungi i valori a questa lista.

Se noti che il campo dei domini JSSDK dell'app contiene URL che iniziano con *., modificali sostituendoli con URL di dominio assoluti per garantire una maggiore sicurezza.

Come funziona il controllo degli URI di reindirizzamento

Si parla di attacco di reindirizzamento aperto quando un autore di atti illeciti fornisce un parametro redirect_uri non autorizzato nella richiesta di accesso, provocando il rischio di divulgazione di informazioni riservate (come un token d'accesso) tramite la stringa della query o un frammento dell'URI di reindirizzamento.

Per evitare questo genere di attacchi, nelle integrazioni web personalizzate devi fornire gli URI di reindirizzamento autorizzati all'interno delle impostazioni dell'app. Durante la gestione di una richiesta di accesso, il parametro redirect_uri sarà confrontato con i valori presenti nella lista. L'URI completo deve avere una corrispondenza perfetta, compresi tutti i parametri, con l'eccezione del parametro State (facoltativo), il cui valore sarà ignorato.

Browser in-app e SDK JavaScript

Normalmente l'SDK JavaScript usa pop-up e callback per completare l'accesso, il che potrebbe non funzionare con alcuni browser in-app che bloccano i pop-up. In questi casi l'SDK cercherà automaticamente di effettuare il reindirizzamento con un token d'accesso alla pagina che l'ha richiamato. Tale reindirizzamento può avvenire in modo sicuro solo se l'URI completo della pagina è elencato fra gli URI di reindirizzamento OAuth validi.

Se i browser in-app sono importanti per la tua app web, aggiungi il dominio della tua pagina di accesso ai Domini consentiti e l'URI completo (inclusi percorso e parametri della query) agli URI di reindirizzamento OAuth validi. Se gli URI di accesso all'app sono molto variabili, puoi specificare manualmente un parametro fallback_redirect_uri come opzione nella chiamata a FB.login(): in questo modo ti basterà aggiungere solo questo valore alla lista degli URI di reindirizzamento OAuth validi.

Blocco delle impostazioni dell'app Facebook

Abilita e/o disabilita i flussi di autenticazione che l'app non usa per ridurre al minimo la superficie di attacco.

  • Usa token d'accesso di breve durata generati tramite codice sui client, anziché token di lunga durata creati dal client o dal server. Il flusso dei token d'accesso di breve durata generati tramite codice richiede che il server dell'app scambi il codice con un token: si tratta di un'opzione più sicura rispetto a ottenere il token attraverso il browser. Per una questione di sicurezza, laddove possibile le app dovrebbero prediligere l'uso esclusivo di questo flusso, che impedirebbe ai malware eventualmente presenti sul computer dell'utente di ottenere token d'accesso per usi impropri. Scopri di più nella documentazione relativa ai token d'accesso.

  • Disabilita l'accesso client OAuth se la tua app non lo usa. L'accesso client OAuth è l'opzione che consente di abilitare o disabilitare a livello globale i flussi del token client OAuth. Se la tua app non usa nessun flusso del client OAuth, inclusi quelli dell'SDK di Facebook Login, disabilita questo flusso. Tuttavia, tieni presente che non puoi richiedere le autorizzazioni per un token d'accesso se hai disabilitato l'accesso client OAuth. Questa impostazione si trova nella sezione Prodotti > Facebook Login > Impostazioni della Dashboard gestione app.

  • Disabilita il flusso web OAuth o specifica una lista di reindirizzamenti consentiti. L'impostazione Accesso OAuth web consente ai flussi del token client OAuth che usano la finestra di dialogo web di Facebook Login di restituire token al tuo sito web. Questa impostazione si trova nella sezione Prodotti > Facebook Login > Impostazioni della Dashboard gestione app. Disabilita questa impostazione, se non stai creando un flusso di accesso web personalizzato o se non usi l'SDK di Facebook Login sul web.

  • Adotta HTTPS. Questa impostazione richiede il protocollo HTTPS per reindirizzamenti OAuth e che tutte le chiamate dell'SDK JavaScript di Facebook che restituiscono o richiedono un token d'accesso provengano solo da pagine HTTPS. Tutte le nuove app create a partire da marzo 2018 hanno questa impostazione attivata in modo predefinito. Pianifica entro il 6 ottobre 2018 la migrazione di tutte le app esistenti affinché usino solo URL HTTPS. La maggior parte dei principali host di app cloud offre una configurazione gratuita e automatica dei certificati TLS per le tue app. Se la tua app si trova su un server di tua proprietà oppure il tuo servizio di hosting non offre HTTPS per impostazione predefinita, puoi ottenere un certificato gratuito per i tuoi domini da Let's Encrypt.

  • Disabilita il flusso OAuth incorporato nel browser se l'app non lo usa. Alcune app native per computer e mobile autenticano gli utenti attraverso il flusso del client OAuth in una finestra incorporata con visualizzazione web. Se non è il caso della tua app, disabilita l'impostazione nella sezione Prodotti > Facebook Login > Impostazioni della Dashboard gestione app.

  • Disabilita i flussi di accesso singolo su dispositivo mobile, se la tua app non li usa. Se la tua app non usa l'accesso per iOS o Android, disabilita l'impostazione "Accesso singolo" nelle sezioni iOS e Android di Impostazioni > Di base.

La Dashboard gestione app contiene altre impostazioni che consentono agli sviluppatori di bloccare i contenuti sensibili agli attacchi, evitando problemi di protezione:

  • Di base > Chiave segreta: se la chiave segreta risulta compromessa, puoi reimpostarla qui.
  • Di base > Domini app: usa questa impostazione per bloccare i domini e i sottodomini che consentono di usare Facebook Login per conto dell'app.
  • Avanzate > Tipo di app: quando crei un'app nativa per mobile o computer includendo la chiave segreta, configura questa impostazione su Native/Desktop per evitare che l'app sia decompilata e che la chiave segreta venga rubata.
  • Avanzate > Lista di elementi consentiti IP server: specifica qui una lista di indirizzi IP da cui effettuare le chiamate API Graph con la chiave segreta. Le chiamate all'API Graph effettuate con la tua chiave segreta al di fuori di questa lista non andranno a buon fine. Questa impostazione non ha alcun effetto sulle chiamate effettuate usando token d'accesso dell'utente.
  • Avanzate > Aggiorna la lista degli IP consentiti delle impostazioni: blocca gli indirizzi IP da cui è possibile modificare tali impostazioni dell'app stabilendo un intervallo specifico. Fai attenzione quando imposti una lista IP di elementi consentiti su una connessione a banda larga residenziale: se l'indirizzo IP cambia, infatti, perderai la possibilità di modificare le impostazioni dell'app.
  • Avanzate > Aggiorna e-mail di notifica: invia una notifica a un indirizzo e-mail quando le impostazioni dell'app vengono modificate attraverso la Dashboard gestione app.
  • Avanzate > Protezione URL post stream: questa impostazione impedisce all'app di pubblicare URL che non reindirizzano a un dominio dell'app. Non è sempre utile, soprattutto se sai che l'app pubblicherà link ad altri siti.