Sviluppo di applicazioni web sicure con ZF2

Sviluppo di applicazioni web sicure con ZF2

In questo talk verranno presentate le novità di Zend Framework 2 per lo sviluppo di applicazioni web sicure. In particolare verranno illustrate alcune funzionalità di sicurezza, come la realizzazione di un sistema di login per l'autenticazione utente, l'implementazione di un sistema di autorizzazioni ACL o RBAC , il filtro dei dati in ingresso e l'escape dei dati in uscita, la memorizzazion sicura delle password degli utenti, etc. Il talk è stato presentato durante lo Zend Framework Day a Milano (Italy), il 1 Feb. 2013.

D3a1203bb9b132944427746ec3eae323?s=128

Enrico Zimuel

February 01, 2013
Tweet

Transcript

  1. 1.

    © All rights reserved. Zend Technologies, Inc. Sviluppo di applicazioni

    web sicure con ZF2 Enrico Zimuel (enrico@zend.com) Software Engineer Zend Framework Team Zend Technologies
  2. 2.

    © All rights reserved. Zend Technologies, Inc. • Enrico Zimuel

    (@ezimuel) • Software Engineer dal 1996 – Assembly x86, C/C++, Java, Perl, PHP • PHP Engineer presso Zend Technologies nel team di Zend Framework • Svolto attività di Ricerca presso l'Informatics Institute dell'Università di Amsterdam • Co-autore del libro “PHP Best Practices” FAG Edizioni 2012 • Co-fondatore del PUG Torino Mi presento
  3. 3.

    © All rights reserved. Zend Technologies, Inc. Top ten attachi

    secondo OWASP 1) Cross-Site Scripting (XSS) 2) Injection Flaws 3) Malicious File Execution 4) Insecure Direct Object Reference 5) Cross Site Request Forgery (CSRF) 6) Information Leakage and Improper Error Handling 7) Broken Authentication and Session Management 8) Insecure Cryptographic Storage 9) Insecure Communications 10) Failure to Restrict URL Access Fonte: https://www.owasp.org/
  4. 4.

    © All rights reserved. Zend Technologies, Inc. Sicurezza: principio di

    base “Filter Input, Escape Output” Si, ma non è sufficiente
  5. 5.

    © All rights reserved. Zend Technologies, Inc. Strumenti per la

    sicurezza in ZF2 • Zend\Authentication • Zend\Captcha • Zend\Crypt • Zend\Escaper • Zend\Filter • Zend\InputFilter • Zend\Permissions • Zend\Math • Zend\Validator
  6. 7.

    © All rights reserved. Zend Technologies, Inc. Autenticazione • Zend\Authentication

    fornisce un componente di base per la realizzazione di un sistema di autenticazione • Adapters: ▶ Database Table ▶ Digest ▶ HTTP ▶ LDAP ▶ Il vostro adapter
  7. 9.

    © All rights reserved. Zend Technologies, Inc. Zend\Permissions\Acl • Implementa

    una Lista di Controllo degli Accessi (ACL) per la gestione dei diritti • Terminologia: ▶ una risorsa è un oggetto il cui accesso è controllato ▶ un ruolo è un oggetto che può richiedere accesso ad una risorsa
  8. 10.

    © All rights reserved. Zend Technologies, Inc. Zend\Permissions\Rbac • Controllo

    Accessi Basato sui Ruoli (RBAC) si diversifica dall'ACL poichè pone più enfasi sui ruoli ed i permessi più che sulle risorse • Terminologia: ▶ una identità ha uno o più ruoli ▶ un ruolo richiede l'uso di un permesso ▶ un permesso è dato ad un ruolo
  9. 12.

    © All rights reserved. Zend Technologies, Inc. Filtri disponibili •

    Alnum • Alpha • BaseName • Boolean • Callback • Compress/Decompress • Digits • Dir • Encrypt/Decrypt • HtmlEntities • Int • Null • NumberFormat • PregReplace • RealPath • StringToLower/ToUpper • StringTrim • StripNewLines/Tags
  10. 15.

    © All rights reserved. Zend Technologies, Inc. Sistemi di validazione

    disponibili • Alnum • Alpha • Barcode • Between • Callback • CreditCard • Date • Db\RecordExists and NoRecordExists • Digits • EmailAddress • GreaterThan/LessThan • Hex • Hostname • Iban • Identical • InArray • Ip • Isbn • NotEmpty • PostCode • Regex • Sitemap • Step • StringLength
  11. 17.

    © All rights reserved. Zend Technologies, Inc. Zend\InputFilter • Il

    componente Zend\InputFilter può essere utilizzato per filtrare uno o più dati. Ad esempio filtrare I dati provenienti da $_GET, $_POST, parametri da linea di comando CLI, etc. • Ricordate sempre: “Filter the input, always”
  12. 20.

    © All rights reserved. Zend Technologies, Inc. Escaper • Formatta

    l'output per diversi formati: ▶ escapeHtml() ▶ escapeHtmlAttr() ▶ escapeJs() ▶ escapeUrl() ▶ EscapeCss()
  13. 22.

    © All rights reserved. Zend Technologies, Inc. La crittografia è

    difficile! • La crittografia è difficile ed anche la sua implementazione! • PHP offre alcune primitive di crittografia (Mcrypt, OpenSSL) ma il loro utilizzo non è banale • La crittografia se applicata male non apporta nessun beneficio, anzi. • Abbiamo pensato di implementare un componente in ZF2 che facilitasse l'uso corretto della crittografia
  14. 23.

    © All rights reserved. Zend Technologies, Inc. Zend\Crypt • Componenti

    di crittografia in ZF2: ▶ Zend\Crypt\Password ▶ Zend\Crypt\Key\Derivation ▶ Zend\Crypt\Symmetic ▶ Zend\Crypt\PublicKey ▶ Zend\Crypt\Hash ▶ Zend\Crypt\Hmac ▶ Zend\Crypt\BlockCipher
  15. 25.

    © All rights reserved. Zend Technologies, Inc. Cifratura ed autenticazione

    • Zend\Crypt\BlockCipher offre un sistema di cifratura + autenticazione (tramite HMAC) • API semplificata: ▶ setKey($key) ▶ encrypt($data) ▶ decrypt($data) • Utilizza di default l'adapter Mcrypt • Utilizzo algoritmi standard (AES, PBKDF2, HMAC, SHA256, etc)
  16. 26.

    © All rights reserved. Zend Technologies, Inc. Esempio di cifratura

    Il crittogramma è codificato in Base64, è possibile scegliere il formato binario con setBinaryOutput(true)
  17. 27.

    © All rights reserved. Zend Technologies, Inc. Esempio di cifratura

    064b05b885342dc91e7915e492715acf0f896620d bf9d1e00dd0798b15e72e8cZg+hO34C3f3eb8TeJ M9xWQRVex1y5zeLrBsNv+dYeVy3SBJa+pXZbUQY NZw0xS9s Zend\Crypt\BlockCipher::encrypt “This is the message to encrypt” “this is the encryption key” HMAC, IV, ciphertext
  18. 29.

    © All rights reserved. Zend Technologies, Inc. Memorizzare una password

    • Come memorizzare in maniera sicura una password utente? • Metodi considerati insicuri: ▶ MD5/SHA1(password) ▶ MD5/SHA1(password . salt) dove salt è una stringa casuale • Metodi sicuri: ▶ bcrypt ▶ scrypt (disponibile con ZF 2.1.0)
  19. 30.

    © All rights reserved. Zend Technologies, Inc. Perchè MD5/SHA1 ±salt

    non è più sicuro? • Attacchi di forza bruta sempre più potenti • GPU-accelerated password hash: ▶ Whitepixel project whitepixel.zorinaq.com 4 Dual HD 5970, ~ $2800 Algoritmo Velocità 8 car. 9 car. 10 car. md5($pass) 33 miliardi p/s 1 ½ ora 4 ½ giorni 294 giorni
  20. 31.

    © All rights reserved. Zend Technologies, Inc. bcrypt • bcrypt

    utilizza il cifrario Blowfish con numerose iterazioni per generare un valore hash • bcrypt è sicuro contro attacchi di forza bruta perchè è lento, molto lento! • L'algoritmo utilizza un valore salt ed un fattore di costo che consente di determinare il carico di lavoro dell'algoritmo
  21. 32.

    © All rights reserved. Zend Technologies, Inc. Zend\Crypt\Password\Bcrypt • Utilizza

    la funzione crypt() del PHP per l'algoritmo bcrypt • Il costo è un intero compreso tra 4 e 31 • Il costo di default è 14, equivalente ad un secondo di calcolo con una CPU Intel Core i5 a 3.3 Ghz • Il valore del costo deve essere tarato a seconda della CPU utilizzata. Per questioni di sicurezza si consiglia un valore che garantisca un calcolo di almeno mezzo secondo.
  22. 33.

    © All rights reserved. Zend Technologies, Inc. Esempio • L'output

    dell'algoritmo bcrypt ($hash) è una stringa di 60 caratteri
  23. 34.

    © All rights reserved. Zend Technologies, Inc. Come verificare una

    password • Per verificare la validità di una password: ▶ Bcrypt::verify($password, $hash) dove $password è la password da verificare e $hash è l'hash precedentemente generato con bcrypt • Questa funzione restituisce vero o falso a seconda che la password sia valida oppure no
  24. 35.

    © All rights reserved. Zend Technologies, Inc. Grazie! • Per

    maggiori informazioni ▶ http://framework.zend.com ▶ Canali IRC (freenode): #zftalk, #zftalk.dev