Slide 1

Slide 1 text

© All rights reserved. Zend Technologies, Inc. Sviluppo di applicazioni web sicure con ZF2 Enrico Zimuel ([email protected]) Software Engineer Zend Framework Team Zend Technologies

Slide 2

Slide 2 text

© 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

Slide 3

Slide 3 text

© 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/

Slide 4

Slide 4 text

© All rights reserved. Zend Technologies, Inc. Sicurezza: principio di base “Filter Input, Escape Output” Si, ma non è sufficiente

Slide 5

Slide 5 text

© 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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

© 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

Slide 8

Slide 8 text

© All rights reserved. Zend Technologies, Inc. Zend\Permissions

Slide 9

Slide 9 text

© 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

Slide 10

Slide 10 text

© 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

Slide 11

Slide 11 text

© All rights reserved. Zend Technologies, Inc. Zend\Filter

Slide 12

Slide 12 text

© 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

Slide 13

Slide 13 text

© All rights reserved. Zend Technologies, Inc. Zend\Validator

Slide 14

Slide 14 text

© All rights reserved. Zend Technologies, Inc. Esempio

Slide 15

Slide 15 text

© 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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

© 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”

Slide 18

Slide 18 text

© All rights reserved. Zend Technologies, Inc. Example

Slide 19

Slide 19 text

© All rights reserved. Zend Technologies, Inc. Zend\Escaper

Slide 20

Slide 20 text

© All rights reserved. Zend Technologies, Inc. Escaper ● Formatta l'output per diversi formati: ▶ escapeHtml() ▶ escapeHtmlAttr() ▶ escapeJs() ▶ escapeUrl() ▶ EscapeCss()

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

© 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

Slide 23

Slide 23 text

© 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

Slide 24

Slide 24 text

© All rights reserved. Zend Technologies, Inc. Come cifrare dei dati sensibili

Slide 25

Slide 25 text

© 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)

Slide 26

Slide 26 text

© All rights reserved. Zend Technologies, Inc. Esempio di cifratura Il crittogramma è codificato in Base64, è possibile scegliere il formato binario con setBinaryOutput(true)

Slide 27

Slide 27 text

© 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

Slide 28

Slide 28 text

© All rights reserved. Zend Technologies, Inc. Come memorizzare una password utente in modo sicuro?

Slide 29

Slide 29 text

© 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)

Slide 30

Slide 30 text

© 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

Slide 31

Slide 31 text

© 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

Slide 32

Slide 32 text

© 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.

Slide 33

Slide 33 text

© All rights reserved. Zend Technologies, Inc. Esempio ● L'output dell'algoritmo bcrypt ($hash) è una stringa di 60 caratteri

Slide 34

Slide 34 text

© 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

Slide 35

Slide 35 text

© All rights reserved. Zend Technologies, Inc. Grazie! ● Per maggiori informazioni ▶ http://framework.zend.com ▶ Canali IRC (freenode): #zftalk, #zftalk.dev