Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Yii

Creare la tua startup: Proteggere l'API

by
Difficulty:IntermediateLength:ShortLanguages:
This post is part of a series called Building Your Startup With PHP.
Building Your Startup: Leveraging Crowdfunding
Building Your Startup: Approaching Major Feature Enhancements

Italian (Italiano) translation by Mirko Pizii (you can also view the original English article)

Final product image
What You'll Be Creating

Benvenuto in Costruisci la tua startup con la serie PHP, che guida i lettori nel lancio di una startup attuale, Meeting Planner. Ogni episodio descrive diversi codici e sfide di business, con esempi dettagliati che puoi usare per imparare.

Introduzione

Recentemente, ti ho introdotto su Semplice generazione di API REST con Yii e Nuovo servizio API "RESTful" di Meeting Planner. A quel tempo, ho detto che queste API sono state scritte senza protezioni. Certo, c'era un segreto condiviso tra il client e il server, ma c'erano un paio di problemi.

In primo luogo, i token degli utenti e la chiave segreta sono state ripetutamente trasmesse nei parametri di query delle chiamate SSL. E non c'era nessun altro controllo di autenticità per i dati, permettendo un attacco middle-person.

Nella puntata di oggi, ti guiderò su come ho reso sicuro l'API contro queste debolezze per un'API più robusta.

Se hai letto la serie della nostra startup, hai probabilmente già provato Meeting Planner e Simple Planner, ma se non lo hai fatto, fallo. Schedulare un meeting è facile:

Come di solito, parteciperò ai commenti sotto quindi, scrivi pure i tuoi pensieri. Puoi anche raggiungermi su Twitter @lookahead_io. Sono sempre specialmente intrigato se vuoi suggerire nuove caratteristiche o argomenti per futuri tutorial.

Come promemoria, tutto il codice per Meeting Planner è scritto con il framework Yii2 per PHP. Se desideri ulteriori informazioni per Yii2, scopri la nostra serie parallela di Programmare con Yii2.

La sicurezza iniziale per le API

Cominciamo dando un'occhiata al codice iniziale di sicurezza per le API che ho scritto. Presumeremo che c'è un'applicazione mobile di cui ho condiviso un $app_id e $app_secret. Sono accettati solo le chiamate API con queste chiavi.

Ad esempio, l'applicazione tenta di registrare il suo proprietario, come un nuovo utente di Meeting Planner:

L'applicazione chiama il actionRegister scritto sopra attraverso https://api.meetingplanner.io/user-token/register/ con i seguenti argomenti:

  • $app_id e $app_secret per l'autenticazione
  • $source = 'facebook' per il servizio OAuth che stiamo usando e da quel servizio $oauth_token
  • $email, $firstname e $lastname forniti tramite OAuth

Tutti questi sono argomenti di query come:

Service::VerifyAccess($app_id,$app_secret) cerca le chiavi per autenticare la chiamata, come illustrato di seguito:

Perché le chiavi e i dati sono stati inviati via SSL, sono abbastanza sicuri ma non invincibili. Neanche la chiave segreta è sicura sugli iPhone degli utenti per alcuni.

Come possiamo rendere questo più sicuro? Ecco alcune idee:

  1. Non trasmettere mai la chiave segreta su Internet.
  2. Non trasmettere i dati come parametri URL che potrebbero presentarsi nei log del server.
  3. Firma tutti i dati per verificarne l'esattezza.

Queste sono in realtà le pratiche standard utilizzate per proteggere le API.

Nota: Un esempio del rischio di trasmissione di dati che potrebbero essere esposti nei log del server sarebbero l'email e il token OAuth di Facebook. Se trovate nei registri, questi potrebbero essere utilizzati con l'API di Facebook per accedere all'account di Facebook di qualcuno.

Implementazione di una migliore protezione per le API

Utilizzo di firme Hash

Prima di tutto, ho intenzione di interrompere la trasmissione di $app_secret. Invece, firmeremo i dati in uscita con esso prima di fare una chiamata API.

Così potremo disporre in ordine alfabetico le variabili e concatenarle in una stringa, come questo:

Che risulta:

Poi, dovremo cifrare i dati con la funzione hash_hmac di PHP e useremo l'algoritmo sha256 per la chiave segreta.

Building Your Startup Securing API - PHP hash_hmac docs

Questo crea un codice hash unico basato sugli argomento della chiamata API e della nostra chiave segreta condivisa:

Adesso, possiamo fare una chiamata alla API senza trasmettere la chiave segreta. Invece, trasmettiamo la firma di sopra dei dati cifrati.

Ho usato Postman per provare l'API ma puoi anche usare cURL:

Building Your Startup Securing API - Testing the API with a signature

Questo è il codice delle API che riceve e che risponde alla chiamata di sopra:

Inoltre, come ho rivisto l'ultima volta, ogni utente riceve i propri token quando accedono a Meeting Planner tramite l'API, ad esempio tramite il cellulare. Così, successivo alla registrazione, possiamo firmare le chiamate con il loro token individuale e non è necessario trasmettere la chiave segreta dell'applicazione o il token individuale dell'utente.

Inviare dati negli header HTTPS

Successivamente, migreremo l'invio dei dati negli header. Puoi farlo facilmente con Postman o cURL. Ecco Postman:

Building Your Startup Securing API - Testing the API sending data in the headers

Ed ecco cURL:

Ecco il codice di ricezione che ottiene i dati API dagli header di HTTPS:

In chiusura

Oggi abbiamo iniziato con i seguenti obiettivi:

  1. Non trasmettere mai la chiave segreta su Internet.
  2. Non trasmettere i dati come parametri URL che potrebbero presentarsi nei log del server.
  3. Firma tutti i dati per verificare la sua accuratezza.

E abbiamo raggiunto tutti questi obiettivi con solo modeste modifiche al nostro codice API. E' stato divertente fare queste modifiche e vedere quanto facilmente possiamo proteggere un API. Spero che hai apprezzato seguendo insieme con la puntata di oggi.

Controllo regolarmente i commenti, quindi per favore, partecipa alla discussione. Puoi anche contattarmi direttamente su Twitter @lookahead_io. E, naturalmente, guardare per i prossimi tutorial qui nella serie Costruisci la tua startup con la serie PHP.

Se non l'hai fatto in precedenza, prova a pianificare un meeting presso Meeting Planner e fatemi sapere cosa ne pensate. Ho particolarmente apprezzato le richieste per le nuove caratteristiche.

Link correlati

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.