Programmazione con Yii2 sicurezza

Se stai chiedendo "Cos'è Yii?" check-out Introduzione al framework Yii, che rivede i vantaggi di Yii e include una panoramica di Yii 2.0.

In questa serie di programmazione con Yii2, guido i lettori all'uso di Yii2 Framework per PHP. Se hai intenzione di condividere la tua applicazione con il pubblico, avrai bisogno che sia sicura, ed è meglio pianificare questo dall'inizio. Fortunatamente, partire da un framework come Yii rende questo molto più semplice di quanto sarebbe altrimenti. Come affermato nelle caratteristiche di Yii:

Yii è dotato di molte misure di sicurezza per aiutare a prevenire le tue applicazioni Web da attacchi come SQL injection, cross-site scripting (XSS), cross-site request forgery (CSRF) e manomissione dei cookie.

In questo tutorial, ti guiderò attraverso i concetti di sicurezza di base all'interno del framework dell'applicazione Yii. E, se sei interessato, gli episodi futuri funzioneranno per proteggere l'applicazione, Meeting Planner, presente nelle nostre serie di startup, mentre si avvicina alla versione alpha.

Prima di iniziare, ricorda, cerco di partecipare alle discussioni di seguito. Se hai una domanda o un suggerimento sull'argomento, per favore pubblica un commento qui sotto o contattami su Twitter @reifman. 

Nota: se hai notato il divario tra gli episodi della serie Programmazione Yii, è perché dovevo averlo chirurgia cerebrale l'anno scorso. Grazie per la vostra pazienza e supporto: è bello scrivere di nuovo regolarmente, e non vedo l'ora di continuare la copertura di Yii2.

Le basi della sicurezza con Yii

Se sei nuovo nella sicurezza delle applicazioni web, c'è molto da capire sulle offerte di Yii. Farò del mio meglio per offrire una panoramica basata sul meglio della documentazione di Yii 2.0. Il team Yii divide la sicurezza in sette aree chiave:

  1. Autenticazione
  2. Autorizzazione
  3. Lavorare con le password
  4. Crittografia
  5. Osserva la sicurezza
  6. Client di autenticazione
  7. Migliori pratiche

Iniziamo a immergerci in questi uno per uno.

1. Autenticazione

La presentazione di Yii Framework Security di Ilko Kacharov offre alcune utili diapositive che riassumono l'obiettivo dell'autenticazione (e il seguente sotto-argomento, autorizzazione). In sostanza, ecco le domande a cui questi argomenti devono rispondere:

  • Chi è l'utente?
  • È l'utente che dicono di essere?
  • L'utente è autorizzato ad accedere a una risorsa?
  • L'utente è autorizzato a eseguire un'azione?
  • L'utente è autorizzato a eseguire un'azione su una risorsa?

Il modello utente e l'interfaccia di identità

La classe yii / web / utente di Yii si integra con yii \ web \ IdentityInterface per gestire lo stato di autenticazione dell'utente all'interno dell'applicazione. 

Lo scorso novembre, ho scritto un tutorial sul modello di applicazione avanzata di Yii. Uno dei vantaggi del modello avanzato è che fornisce l'integrazione preconfigurata del modello utente con ActiveRecord e il proprio database. Quindi la tua applicazione offre un'autenticazione basata su database sin dal primo momento.

Il modello Utente consente di accedere e disconnettersi a livello di codice agli utenti:

  • login () imposta l'identità specificata e ricorda lo stato di autenticazione in sessione e cookie.
  • logout () contrassegna l'utente come ospite e cancella le informazioni rilevanti dalla sessione e dai cookie.
  • setIdentity (): cambia l'identità dell'utente senza toccare la sessione o il cookie, meglio per la funzionalità API.

La proprietà $ isGuest determina se l'utente corrente ha effettuato l'accesso o meno. Quando l'utente è disconnesso, è null, ma restituisce in ogni caso un'istanza di IdentityInterface.

Essenzialmente, hai bisogno di una classe User che estenda ActiveRecord e implementa metodi per supportare IdentityInterface, come questo:

 $ Token]);  / ** * @return int | string user ID corrente * / public function getId () return $ this-> id;  / ** * @return stringa chiave di autenticazione utente corrente * / funzione pubblica getAuthKey () return $ this-> auth_key;  / ** * @param stringa $ authKey * @return boolean se la chiave di autenticazione è valida per l'utente corrente * / funzione pubblica validateAuthKey ($ authKey) return $ this-> getAuthKey () === $ authKey; 

Inoltre, prima che venga creato un utente, l'applicazione genera una stringa casuale come chiave di autorizzazione. Può essere utilizzato nelle e-mail "ha dimenticato la password" o in altri collegamenti di accesso basati su e-mail:

classe Utente estende ActiveRecord implementa IdentityInterface ... public function beforeSave ($ insert) if (parent :: beforeSave ($ insert)) if ($ this-> isNewRecord) $ this-> auth_key = \ Yii :: $ app- > sicurezza-> generateRandomString ();  return true;  return false; 

Autorizzazione

Yii fornisce due approcci integrati all'autorizzazione. La più semplice ACL (Access Control List) determina quali utenti o processi sono autorizzati a eseguire azioni su una risorsa e il più intenso Controllo accessi basato sui ruoli (RBAC) consente di gestire l'accesso definendo i ruoli. In RBAC, solo gli utenti o le attività di sistema con ruoli specifici possono eseguire azioni specifiche.

Elenco di controllo di accesso

Talvolta l'ACL viene anche chiamato un filtro di controllo dell'accesso (ACF). Yii fornisce il supporto ACL all'interno di yii \ filters \ AccessControl. È ideale per le applicazioni che richiedono solo un semplice controllo degli accessi. È quello che ho usato finora in Meeting Planner.

Ecco un esempio del comune SiteController che configura un comportamento di accesso per filtrare l'accesso alle azioni disponibili, spesso pagine. In questo caso, ACL agisce su registrazione, accesso e disconnessione. Il '?' indica che qualsiasi utente può accedere alle pagine di accesso e di registrazione, mentre il '@' indica che solo gli utenti registrati o autenticati possono accedere. Nell'esempio seguente, solo gli utenti registrati possono disconnettersi:

utilizzare yii \ web \ Controller; usa yii \ filters \ AccessControl; class SiteController estende Controller function function pubblici () return ['access' => ['class' => AccessControl :: className (), 'only' => ['login', 'logout', 'signup'], 'rules' => [['allow' => true, 'actions' => ['login', 'signup'], 'ruoli' => ['?'],], ['allow' => true, 'actions' => ['logout'], 'roles' => ['@'],],],],];  // ...

All'aumentare del controller, ogni nuova azione deve essere definita all'interno delle regole di AccessControl. Inoltre, man mano che l'applicazione cresce, ogni controller e tutte le sue azioni devono integrare il filtro ACL per la sicurezza.

Controllo degli accessi basato sui ruoli

Il controllo degli accessi basato sui ruoli (RBAC) fornisce un sistema di autenticazione più robusto ma richiede anche una progettazione e un'implementazione molto più anticipata. 

Con RBAC, si definisce l'autenticazione attraverso ruoli che possono essere ereditati (o meno) e si applicano ruoli agli utenti. È anche possibile definire regole per i ruoli. Le implementazioni di RBAC possono diventare piuttosto complesse.

Nella figura seguente, gli amministratori possono eseguire qualsiasi compito e gli autori possono creare un post e aggiornare i propri post. Jane è un amministratore in modo che possa eseguire i compiti degli amministratori e John è solo un autore:

Yii implementa ciò che definisce "un RBAC gerarchico generale, seguendo il modello NIST RBAC". La funzionalità RBAC viene fornita dal relativo componente dell'applicazione authManager.

Non entrerò troppo in profondità con l'RBAC qui, ma spero di farlo in un futuro tutorial. Ancora una volta, tocca alle divinità editoriali: parlare con loro non è mai facile:

via PopSugar

Fondamentalmente, per implementare accuratamente l'RBAC, è necessario:

  • definire ruoli e permessi
  • stabilire relazioni tra i tuoi ruoli e permessi
  • definire eventuali regole esistenti
  • associare le regole ai tuoi ruoli e permessi
  • e infine, assegnare ruoli agli utenti

Puoi vedere il codice richiesto per abilitare l'inizio di un sistema RBAC di seguito:

AuthManager; // aggiungi l'autorizzazione "createPost" $ createPost = $ auth-> createPermission ('createPost'); $ createPost-> description = 'Crea un post'; $ Auth-> aggiungere ($ createPost); // aggiungi l'autorizzazione "updatePost" $ updatePost = $ auth-> createPermission ('updatePost'); $ updatePost-> description = 'Aggiorna post'; $ Auth-> aggiungere ($ updatePost); // aggiungi il ruolo "author" e assegna a questo ruolo il permesso "createPost" $ author = $ auth-> createRole ('author'); $ Auth-> aggiungere ($ autore); $ auth-> addChild ($ author, $ createPost); // aggiungi il ruolo "admin" e assegna a questo ruolo il permesso "updatePost" // così come i permessi del ruolo "autore" $ admin = $ auth-> createRole ('admin'); $ Auth-> aggiungere ($ admin); $ auth-> addChild ($ admin, $ updatePost); $ auth-> addChild ($ admin, $ author); // Assegna ruoli agli utenti. 1 e 2 sono ID restituiti da IdentityInterface :: getId () // solitamente implementato nel modello Utente. $ auth-> assign ($ author, 2); $ auth-> assign ($ admin, 1); 

Per implementare l'RBAC, devi essere pronto a scrivere molto codice in anticipo o man mano che la tua applicazione cresce. E, se lo fai, Yii gestirà l'autenticazione in base al framework di autenticazione che definisci. In altre parole, la progettazione e la codifica in primo piano forniscono un'autenticazione solida e dettagliata.

Lavorare con le password

Come Mark Zuckerberg ha appreso in giugno, alcuni siti Web memorizzano le password degli utenti in testo normale, ma il tuo non dovrebbe; per essere onesti con Zuckerberg, il mio account Facebook è stato hackerato una volta a causa di PHPList che aveva fatto lo stesso, prima dei giorni dei gestori di password. Ad ogni modo, Yii rende facile crittografare e verificare in sicurezza le password.

La funzione crypt di Yii utilizza bcrypt per generare hash per la tua password. Quando le persone si registrano, viene creato un hash:

$ hash = Yii :: $ app-> getSecurity () -> generatePasswordHash ($ password);

Quindi, quando l'utente tenta di accedere, viene sottoposto a hash e confrontato con l'hash nel database:

if (Yii :: $ app-> getSecurity () -> validatePassword ($ password, $ hash)) // tutto ok, logging utente in else // password errata

Ma puoi anche usare Yii per proteggere i dati con la crittografia.

Crittografia

Il framework Yii offre una serie di funzionalità integrate per supportare la protezione dei dati:

  • Password e funzioni di generazione della chiave come generateRandomKey, generateRandomString e generateSalt.
  • Convalida della password: generatePasswordHash () e validatePassword ().
  • Cifratura / decifratura: EncryptByKey (), DecryptByKey (), encryptByPassword () e decryptByPassword ().
  • Derivazione chiave utilizzando algoritmi standard: pbkdf2 () e hkdf ().
  • Prevenzione della manomissione dei dati: hashData () e validateData ().

Visualizzazioni Sicurezza

Qualsiasi dato proveniente dagli utenti è probabilmente infetto da attacchi come SQL injection o script cross-browser. È importante che i dati che generi agli utenti nelle viste siano purificati. Yii offre un paio di metodi per questo. 

Innanzitutto, c'è HTML :: encode, che essenzialmente rompe qualsiasi SQL o scripting:

 
nome)?>

E c'è integrazione con la libreria HtmlPurifier per blocchi di testo più grandi:

 
testo)?>

Accedi tramite client di autenticazione

Yii fornisce anche la possibilità di autenticazione da parte di terzi, che è particolarmente utile per supportare l'accesso social tramite Google, Facebook, Twitter, ecc.

Ho scritto diversi tutorial per Envato Tuts + sull'utilizzo di AuthClient all'interno di Yii Framework con accessi social:

  • Costruire la tua startup: semplificare Onramp con AuthClient (in attesa di pubblicazione)
  • Come programmare con Yii2: Google Authentication
  • Come programmare con Yii2: Integrazione AuthClient con Twitter, Google e altre reti

Ho trovato che l'accesso social funziona molto bene con Meeting Planner. I nuovi utenti possono iniziare a programmare una riunione senza password.

Migliori pratiche

Yii consiglia anche una manciata di buone pratiche quando si tratta di sicurezza delle applicazioni web. E la sua documentazione fornisce un buon primer su questi argomenti per chiunque.

  1. Filtro di input e output
  2. Evitare le iniezioni SQL
  3. Evitare cross-site scripting (XSS)
  4. Evitare la falsificazione di richieste tra siti (CSRF)
  5. Evitare l'esposizione dei file
  6. Evitare informazioni di debug e strumenti in produzione
  7. Utilizzo della connessione protetta su TLS

I primi tre argomenti sopra sono gestiti bene dalla codifica discussa sopra in Visualizzazioni Sicurezza

Yii fornisce anche una protezione CSRF integrata per attività comuni e può essere disattivata quando necessario. In Meeting Planner, ho dovuto disattivare CSRF per accettare i messaggi inviati dai servizi API di Mailgun.

Per quanto riguarda l'esposizione dei file, il framework aiuta a minimizzare questo instradando tutte le richieste di input nel file di richiesta web / index.php. Ciò limita notevolmente la necessità di scrivere il codice dell'applicazione che filtra le richieste. È gestito bene in un unico posto.

Infine, l'utilizzo di HTTPS può aiutare a salvaguardare le connessioni e a lavorare con Yii per proteggere gli utenti. All'inizio di quest'anno, ho scritto su Let's Encrypt: puoi usare questo tutorial per installare anche HTTPS per le app Yii.

Vuoi saperne di più?

Se sei interessato a leggere materiale più dettagliato su questi argomenti, Yii 1.x Framework offre questi post. Certamente, sono più vecchi e meno specifici di Yii 2, ma rimangono utili.

  • Argomenti speciali: sicurezza
  • Come scrivere applicazioni Yii sicure
  • Yii Guida estesa alla sicurezza

In chiusura

Spero che tu abbia apprezzato la mia panoramica sulla sicurezza per Yii2. Se si integrano aspetti della maggior parte o tutti i concetti di cui sopra nella propria applicazione, è necessario disporre di un servizio Web sostanzialmente sicuro. Si consiglia di controllare il nostro Building Your Startup con la serie PHP per l'implementazione del mondo reale di alcune di queste pratiche di sicurezza.

Guarda le prossime esercitazioni nella nostra serie Programming With Yii2 mentre continuiamo a esplorare i diversi aspetti del framework. Accolgo richieste di argomenti e argomenti. Puoi postarli nei commenti qui sotto o mandarmi una e-mail sul mio sito Web di Lookahead Consulting.

Se vuoi sapere quando arriverà il prossimo tutorial di Yii2, seguimi @reifman su Twitter o controlla la mia pagina di istruttore. La mia pagina di istruttore includerà tutti gli articoli di questa serie non appena saranno pubblicati. 

Lavoriamo insieme per mantenere felici le divinità editoriali.

Link correlati

  • Yii Migliori pratiche di sicurezza
  • Classe di sicurezza di base Yii 
  • Yii2 Developer Exchange