Quali sono le migliori pratiche per proteggere un'API Web?


15

Devo creare un'API del servizio Web per la nostra app mobile per interagire con il nostro server e database (in ASP.Net MVC 4, ma non è rilevante). Mentre la maggior parte delle azioni non richiede che gli utenti siano registrati con il nostro servizio, vorremmo limitare l'accesso solo agli utenti della nostra app.

Quali sono i metodi per assicurarsi che le chiamate effettuate da qualche altra parte (ad esempio qualcuno che desidera tutti i nostri dati o che costruisce un'app non ufficiale) vengano rifiutate?

La mia idea iniziale è che il dispositivo chieda al server un token, che viene generato casualmente e inviato così com'è. Tutti gli altri metodi verificheranno che le intestazioni della richiesta ne contengano una specifica che sarà hash md5 del token salato. Il server conosce il token e il salt ed è in grado di calcolare l'hash e confrontarlo con quello inviato. Inoltre, il token ha una durata limitata e il dispositivo deve riceverne un altro ogni ora.

Sembra abbastanza facile da implementare e sebbene probabilmente non sia una prova al 100%, sembra essere una buona idea. Cosa pensi?

Risposte:


15

Non appena si rilascia l'applicazione, potrebbe essere retroingegnerizzata. Ciò significa che non c'è nulla che tu possa fare per essere protetto al 100% se la stessa applicazione (stessi binari, stesse impostazioni) è distribuita a tutti i tuoi utenti.

Se puoi personalizzare l'applicazione per ogni utente, allora hai forse la possibilità di non vietare ad altre applicazioni di usare la tua API, ma almeno limitare questa applicazione in base al numero di richieste che può fare all'API.

Immagina il seguente schema:

  1. Il client si connette e invia il proprio identificativo univoco (un identificatore per utente).
  2. Il server risponde inviando una richiesta crittografata con una chiave pubblica. Questa chiave pubblica è associata all'identificatore univoco precedentemente inviato.
  3. Il client risolve la sfida decodificando i dati utilizzando una chiave privata e invia il segreto decrittografato in chiaro al server.
  4. Il server verifica che il segreto inviato corrisponda a quello originariamente generato.

Lo sviluppatore che hackererà la tua applicazione e otterrà correttamente la chiave privata sarebbe in grado di utilizzare la tua API dalla sua stessa applicazione, ma sarà identificatore come se stesso per il tuo server.

Se lo stesso utente può fare 10.000 richieste all'API al giorno e in media, un utente attivo effettua 2 000 richieste al giorno, significa che questo sviluppatore sarebbe in grado di utilizzare la sua applicazione da solo e magari di darla ai suoi amici, ma non sarebbe in grado, diciamo, di venderlo a migliaia di persone, solo perché funzionerà solo per pochi minuti al mattino.

Anche se questo aiuta, non è nemmeno una prova al 100%. Cosa succede se l'hacker trova un modo per estrarre la chiave privata dalla tua app quando la sua app è installata sul dispositivo?


Nota a margine che non risponde alla tua domanda, ma potrebbe comunque essere utile: non pensare a un'API come strumento per il tuo prodotto principale (applicazione mobile). Pensalo come un prodotto di prima classe , un prodotto che può essere pagato. Lo stesso modello viene utilizzato da anni da Amazon e Google, inizia a essere attivamente utilizzato da Microsoft con Azure, ecc.

Non appena consideri l'API non come uno strumento secondario ridotto in schiavitù per le tue splendide nuove app mobili, ma il prodotto reale, allo stesso livello di qualsiasi applicazione che l'utente vede effettivamente, inizi a pensare meno a come proteggere l'API contro l'utilizzo da parte di altre app e altro sulla monetizzazione dell'API stessa. Tale API può essere utilizzata dalle tue app che sono i suoi clienti o qualsiasi altra app, sviluppata liberamente da chiunque. Ciò ha diversi vantaggi:

  • Creare un'API in modo che venga utilizzata solo dalle tue applicazioni è difficile e costoso. Questa volta e denaro possono essere utilizzati per qualcosa di più utile.

  • Aprire la tua API al pubblico può avere un grande vantaggio sia per te che per il mondo. Immagina di essere un grande architetto e un grande sviluppatore, quindi hai creato un'API sorprendentemente eccezionale, ma le tue capacità di visual designer fanno schifo e davvero non capisci nulla sul design dell'interazione, ecc. Se nascondi l'API, l'unica la cosa che la gente saprà è che hai creato un'applicazione mobile inutilizzabile e brutta. Se la tua API è pubblica, altri sviluppatori saranno attratti dalla sua qualità e scriveranno ottime applicazioni per te, offrendoti un sacco di soldi.

  • Non puoi mai immaginare come altre persone possano usare le tue API. Questo è quello che è successo con Kinect. Inizialmente, Microsoft ha creato Kinect per i giochi. Quando Microsoft ha aperto l'API al pubblico, non avrebbe mai immaginato che sarebbe stata utilizzata qualche anno dopo da applicazioni scientifiche, settore sanitario, ecc. È simile per le API Web: più sviluppatori lo usano, più le idee sarebbero diffuse.


Risposta molto interessante Probabilmente dobbiamo pensare a come rendere pubblica l'API. Anche per riferimento, il mercato target in Francia, dove il reverse engineering e lo smontaggio è illegale, quindi dovremmo preoccuparci troppo di questo.
Antoine,

2
@Antoine: Revere engineering sarebbe illegale in qualsiasi paese non appena la licenza lo proibisse. Ma il fatto che sia illegale non significa che nessuno venererà la tua app.
Arseni Mourzenko,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.