$30 off During Our Annual Pro Sale. View Details »

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.

Enrico Zimuel

February 01, 2013
Tweet

More Decks by Enrico Zimuel

Other Decks in Programming

Transcript

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

    View Slide

  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

    View Slide

  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/

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

  14. © All rights reserved. Zend Technologies, Inc.
    Esempio

    View Slide

  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

    View Slide

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

    View Slide

  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”

    View Slide

  18. © All rights reserved. Zend Technologies, Inc.
    Example

    View Slide

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

    View Slide

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

    Formatta l'output per diversi formati:

    escapeHtml()

    escapeHtmlAttr()

    escapeJs()

    escapeUrl()

    EscapeCss()

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

  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)

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

  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)

    View Slide

  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

    View Slide

  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

    View Slide

  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.

    View Slide

  33. © All rights reserved. Zend Technologies, Inc.
    Esempio

    L'output dell'algoritmo bcrypt ($hash) è una stringa di
    60 caratteri

    View Slide

  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

    View Slide

  35. © All rights reserved. Zend Technologies, Inc.
    Grazie!

    Per maggiori informazioni

    http://framework.zend.com

    Canali IRC (freenode): #zftalk, #zftalk.dev

    View Slide