Sicurezza delle applicazioni web: 10 buone pratiche per il 2024

Sicurezza delle applicazioni web: 10 buone pratiche per il 2024

La sicurezza delle applicazioni web è diventata una questione decisiva per qualsiasi azienda presente online. I cyberattacchi si moltiplicano e si fanno più raffinati, mettendo a rischio i dati sensibili e la reputazione delle organizzazioni. Questo articolo raccoglie le buone pratiche per proteggere davvero le tue applicazioni web dalle minacce di oggi e di domani.

Capire le minacce principali

Gli attacchi più diffusi

Prima di entrare nelle soluzioni, conviene sapere quali sono i tipi di attacco che minacciano le applicazioni web:

  1. SQL injection: consiste nell’inserire codice malevolo nelle query SQL per manipolare il database.
  2. Cross-Site Scripting (XSS): l’attaccante inietta script malevoli in pagine web consultate da altri utenti.
  3. Attacchi a forza bruta: si tenta di indovinare le credenziali provando un numero enorme di combinazioni.

Come sono cambiate le minacce nel 2024

I cybercriminali adattano di continuo le loro tecniche. Nel 2024 si osserva una recrudescenza degli attacchi mirati e un uso sempre più frequente dell’intelligenza artificiale per automatizzare e affinare i tentativi di intrusione.

Le basi della messa in sicurezza di un’applicazione web

Costruire un’autenticazione solida

Un’autenticazione solida è la prima linea di difesa contro gli accessi non autorizzati.

  • Hashing sicuro delle password: usa algoritmi di hashing moderni come bcrypt o Argon2 per salvare le password.

Esempio in PHP con password_hash() e password_verify():

php
// Hashing della password al momento della registrazione
$password = $_POST['password'];
$hashedPassword = password_hash($password, PASSWORD_ARGON2ID);

// Salva $hashedPassword nel database

// Verifica della password al momento del login
$storedHash = // Recupera l'hash salvato dal database
if (password_verify($_POST['password'], $storedHash)) {
    // Password corretta
} else {
    // Password errata
}
  • Autenticazione a più fattori (2FA/MFA): aggiungi un livello di sicurezza in più chiedendo diverse forme di identificazione.

Gestione sicura delle sessioni

Metti in piedi i meccanismi che proteggono le sessioni utente:

  • Genera identificatori di sessione casuali e complessi.
  • Imponi una scadenza della sessione dopo un periodo di inattività.
  • Usa cookie sicuri con gli attributi HttpOnly e Secure
php
// Configura le opzioni di sessione sicure
ini_set('session.cookie_httponly', 1);
ini_set('session.use_only_cookies', 1);
ini_set('session.cookie_secure', 1);

// Genera un nuovo ID di sessione a ogni login
session_regenerate_id(true);

// Imposta una durata di vita della sessione
ini_set('session.gc_maxlifetime', 3600); // 1 ora
  • Autenticazione a più fattori (2FA/MFA): aggiungi un livello di sicurezza in più chiedendo diverse forme di identificazione.

Validazione e sanificazione degli input utente

Ogni input dell’utente va considerato potenzialmente pericoloso:

  • Valida con rigore tutti gli input lato server.
  • Usa liste bianche per filtrare i caratteri ammessi.
  • Fai l’escape dei dati prima di inserirli in una query SQL o nel codice HTML.
php
// Esempio di validazione e sanificazione di un indirizzo email
$email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL);
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    // L'email non è valida
}

// Esempio di protezione dalla SQL injection con query preparate
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username");
$stmt->execute(['username' => $username]);
$user = $stmt->fetch();

Protezione dei dati sensibili

Cifratura dei dati in transito e a riposo

La cifratura è indispensabile per proteggere le informazioni sensibili:

  • Usa TLS 1.3 per proteggere le comunicazioni tra client e server.
  • Cifra i dati sensibili salvati nel database.
php
// Cifratura
$plaintext = "Données sensibles à chiffrer";
$cipher = "aes-256-cbc";
$key = openssl_random_pseudo_bytes(32);
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length($cipher));

$encrypted = openssl_encrypt($plaintext, $cipher, $key, 0, $iv);

// Decifratura
$decrypted = openssl_decrypt($encrypted, $cipher, $key, 0, $iv);

Attivare HTTPS/SSL

HTTPS non è più un’opzione, è una necessità:

  • Procurati un certificato SSL/TLS valido presso un’autorità di certificazione riconosciuta.
  • Configura il server perché rediriga automaticamente tutto il traffico HTTP verso HTTPS.
.htaccess
php
# Rediriger HTTP vers HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Gestione sicura delle API

Le API sono spesso punti di ingresso critici:

  • Richiedi un’autenticazione forte per accedere alle API.
  • Limita il numero di richieste per prevenire gli abusi.
  • Usa token JWT (JSON Web Tokens) per gestire in sicurezza le sessioni API.
    • Definisci un processo sistematico per applicare le patch di sicurezza.
    • Iscriviti ai bollettini di sicurezza dei fornitori dei software che usi.

Formazione e cultura della sicurezza

      • Organizza sessioni di formazione regolari sulle tecniche di sicurezza più recenti.
      • Insegna agli utenti le buone pratiche di sicurezza (password robuste, riconoscere il phishing, ecc.).

    Conformità e standard di sicurezza

        • Verifica che la tua applicazione web rispetti le normative in vigore (GDPR, PCI DSS, ecc.).
        • Usa la Top 10 OWASP come riferimento per individuare e correggere le vulnerabilità più critiche.

      Conclusione

      Mettere in sicurezza un’applicazione web è un processo continuo che richiede attenzione costante. Adottando queste buone pratiche rafforzi in modo netto la protezione delle tue applicazioni contro le minacce di oggi e di domani.

        • Esegui test di intrusione almeno una volta l’anno o dopo ogni modifica importante.
        • Metti davanti all’applicazione un web application firewall (WAF) per bloccare molti attacchi noti.
        • Configura avvisi sulle attività sospette.
        • Conserva i log abbastanza a lungo da poter fare analisi forensi.

      Gestione delle vulnerabilità e aggiornamenti

          • Definisci un processo sistematico per applicare le patch di sicurezza.
          • Iscriviti ai bollettini di sicurezza dei fornitori dei software che usi.

        Formazione e cultura della sicurezza

            • Organizza sessioni di formazione regolari sulle tecniche di sicurezza più recenti.
            • Insegna agli utenti le buone pratiche di sicurezza (password robuste, riconoscere il phishing, ecc.).

          Conformità e standard di sicurezza

              • Verifica che la tua applicazione web rispetti le normative in vigore (GDPR, PCI DSS, ecc.).
              • Usa la Top 10 OWASP come riferimento per individuare e correggere le vulnerabilità più critiche.

            Conclusione

            Mettere in sicurezza un’applicazione web è un processo continuo che richiede attenzione costante. Adottando queste buone pratiche rafforzi in modo netto la protezione delle tue applicazioni contro le minacce di oggi e di domani.

              • Forma il tuo team sulle tecniche di programmazione sicura.
              • Usa framework e librerie con una buona reputazione in fatto di sicurezza.
              • Fai revisioni del codice regolari mirate alla sicurezza.
              • Tieni un inventario aggiornato di tutte le dipendenze.
              • Usa strumenti automatici per individuare le vulnerabilità nelle librerie di terze parti.
              • Applica il principio della difesa in profondità mettendo in sicurezza ogni strato dell’infrastruttura.

            Test e monitoraggio continuo

                • Esegui test di intrusione almeno una volta l’anno o dopo ogni modifica importante.
                • Metti davanti all’applicazione un web application firewall (WAF) per bloccare molti attacchi noti.
                • Configura avvisi sulle attività sospette.
                • Conserva i log abbastanza a lungo da poter fare analisi forensi.

              Gestione delle vulnerabilità e aggiornamenti

                  • Definisci un processo sistematico per applicare le patch di sicurezza.
                  • Iscriviti ai bollettini di sicurezza dei fornitori dei software che usi.

                Formazione e cultura della sicurezza

                    • Organizza sessioni di formazione regolari sulle tecniche di sicurezza più recenti.
                    • Insegna agli utenti le buone pratiche di sicurezza (password robuste, riconoscere il phishing, ecc.).

                  Conformità e standard di sicurezza

                      • Verifica che la tua applicazione web rispetti le normative in vigore (GDPR, PCI DSS, ecc.).
                      • Usa la Top 10 OWASP come riferimento per individuare e correggere le vulnerabilità più critiche.

                    Conclusione

                    Mettere in sicurezza un’applicazione web è un processo continuo che richiede attenzione costante. Adottando queste buone pratiche rafforzi in modo netto la protezione delle tue applicazioni contro le minacce di oggi e di domani.

                    php
                    function hasPermission($userId, $action) {
                        $userRole = getUserRole($userId); // Funzione per ottenere il ruolo dell'utente
                        $permissions = [
                            'admin' => ['read', 'write', 'delete'],
                            'editor' => ['read', 'write'],
                            'viewer' => ['read']
                        ];
                    
                    return in_array($action, $permissions[$userRole] ?? []);
                    }
                    
                    // Uso
                    if (hasPermission($userId, 'write')) {
                        // Autorizza l'azione di scrittura
                    } else {
                        // Nega l'accesso
                    }

                    Sicurezza del codice e dell’infrastruttura

                        • Forma il tuo team sulle tecniche di programmazione sicura.
                        • Usa framework e librerie con una buona reputazione in fatto di sicurezza.
                        • Fai revisioni del codice regolari mirate alla sicurezza.
                        • Tieni un inventario aggiornato di tutte le dipendenze.
                        • Usa strumenti automatici per individuare le vulnerabilità nelle librerie di terze parti.
                        • Applica il principio della difesa in profondità mettendo in sicurezza ogni strato dell’infrastruttura.

                      Test e monitoraggio continuo

                          • Esegui test di intrusione almeno una volta l’anno o dopo ogni modifica importante.
                          • Metti davanti all’applicazione un web application firewall (WAF) per bloccare molti attacchi noti.
                          • Configura avvisi sulle attività sospette.
                          • Conserva i log abbastanza a lungo da poter fare analisi forensi.

                        Gestione delle vulnerabilità e aggiornamenti

                            • Definisci un processo sistematico per applicare le patch di sicurezza.
                            • Iscriviti ai bollettini di sicurezza dei fornitori dei software che usi.

                          Formazione e cultura della sicurezza

                              • Organizza sessioni di formazione regolari sulle tecniche di sicurezza più recenti.
                              • Insegna agli utenti le buone pratiche di sicurezza (password robuste, riconoscere il phishing, ecc.).

                            Conformità e standard di sicurezza

                                • Verifica che la tua applicazione web rispetti le normative in vigore (GDPR, PCI DSS, ecc.).
                                • Usa la Top 10 OWASP come riferimento per individuare e correggere le vulnerabilità più critiche.

                              Conclusione

                              Mettere in sicurezza un’applicazione web è un processo continuo che richiede attenzione costante. Adottando queste buone pratiche rafforzi in modo netto la protezione delle tue applicazioni contro le minacce di oggi e di domani.

                                Controllo degli accessi e autorizzazioni

                                Principio del privilegio minimo

                                Concedi a ogni utente o processo solo i diritti necessari a portare a termine i suoi compiti.

                                Definire una politica di controllo degli accessi efficace

                                Esempio semplice di controllo degli accessi basato sui ruoli:

                                php
                                function hasPermission($userId, $action) {
                                    $userRole = getUserRole($userId); // Funzione per ottenere il ruolo dell'utente
                                    $permissions = [
                                        'admin' => ['read', 'write', 'delete'],
                                        'editor' => ['read', 'write'],
                                        'viewer' => ['read']
                                    ];
                                
                                return in_array($action, $permissions[$userRole] ?? []);
                                }
                                
                                // Uso
                                if (hasPermission($userId, 'write')) {
                                    // Autorizza l'azione di scrittura
                                } else {
                                    // Nega l'accesso
                                }

                                Sicurezza del codice e dell’infrastruttura

                                    • Forma il tuo team sulle tecniche di programmazione sicura.
                                    • Usa framework e librerie con una buona reputazione in fatto di sicurezza.
                                    • Fai revisioni del codice regolari mirate alla sicurezza.
                                    • Tieni un inventario aggiornato di tutte le dipendenze.
                                    • Usa strumenti automatici per individuare le vulnerabilità nelle librerie di terze parti.
                                    • Applica il principio della difesa in profondità mettendo in sicurezza ogni strato dell’infrastruttura.

                                  Test e monitoraggio continuo

                                      • Esegui test di intrusione almeno una volta l’anno o dopo ogni modifica importante.
                                      • Metti davanti all’applicazione un web application firewall (WAF) per bloccare molti attacchi noti.
                                      • Configura avvisi sulle attività sospette.
                                      • Conserva i log abbastanza a lungo da poter fare analisi forensi.

                                    Gestione delle vulnerabilità e aggiornamenti

                                        • Definisci un processo sistematico per applicare le patch di sicurezza.
                                        • Iscriviti ai bollettini di sicurezza dei fornitori dei software che usi.

                                      Formazione e cultura della sicurezza

                                          • Organizza sessioni di formazione regolari sulle tecniche di sicurezza più recenti.
                                          • Insegna agli utenti le buone pratiche di sicurezza (password robuste, riconoscere il phishing, ecc.).

                                        Conformità e standard di sicurezza

                                            • Verifica che la tua applicazione web rispetti le normative in vigore (GDPR, PCI DSS, ecc.).
                                            • Usa la Top 10 OWASP come riferimento per individuare e correggere le vulnerabilità più critiche.

                                          Conclusione

                                          Mettere in sicurezza un’applicazione web è un processo continuo che richiede attenzione costante. Adottando queste buone pratiche rafforzi in modo netto la protezione delle tue applicazioni contro le minacce di oggi e di domani.

                                          php
                                          function generateToken($userId) {
                                              $payload = [
                                                  'user_id' => $userId,
                                                  'exp' => time() + 3600 // Scade tra 1 ora
                                              ];
                                              return jwt_encode($payload, 'votre_clé_secrète');
                                          }
                                          
                                          function verifyToken($token) {
                                              try {
                                                  $payload = jwt_decode($token, 'votre_clé_secrète');
                                                  if ($payload->exp < time()) {
                                                      return false; // Token scaduto
                                                  }
                                                  return $payload->user_id;
                                              } catch (Exception $e) {
                                                  return false; // Token non valido
                                              }
                                          }
                                          
                                          // Uso in una rotta API
                                          $token = getBearerToken(); // Funzione per estrarre il token dall'header
                                          $userId = verifyToken($token);
                                          if ($userId === false) {
                                              http_response_code(401);
                                              echo json_encode(['error' => 'Unauthorized']);
                                              exit;
                                          }
                                          // Prosegui con l'elaborazione della richiesta API

                                            Controllo degli accessi e autorizzazioni

                                            Principio del privilegio minimo

                                            Concedi a ogni utente o processo solo i diritti necessari a portare a termine i suoi compiti.

                                            Definire una politica di controllo degli accessi efficace

                                            Esempio semplice di controllo degli accessi basato sui ruoli:

                                            php
                                            function hasPermission($userId, $action) {
                                                $userRole = getUserRole($userId); // Funzione per ottenere il ruolo dell'utente
                                                $permissions = [
                                                    'admin' => ['read', 'write', 'delete'],
                                                    'editor' => ['read', 'write'],
                                                    'viewer' => ['read']
                                                ];
                                            
                                            return in_array($action, $permissions[$userRole] ?? []);
                                            }
                                            
                                            // Uso
                                            if (hasPermission($userId, 'write')) {
                                                // Autorizza l'azione di scrittura
                                            } else {
                                                // Nega l'accesso
                                            }

                                            Sicurezza del codice e dell’infrastruttura

                                                • Forma il tuo team sulle tecniche di programmazione sicura.
                                                • Usa framework e librerie con una buona reputazione in fatto di sicurezza.
                                                • Fai revisioni del codice regolari mirate alla sicurezza.
                                                • Tieni un inventario aggiornato di tutte le dipendenze.
                                                • Usa strumenti automatici per individuare le vulnerabilità nelle librerie di terze parti.
                                                • Applica il principio della difesa in profondità mettendo in sicurezza ogni strato dell’infrastruttura.

                                              Test e monitoraggio continuo

                                                  • Esegui test di intrusione almeno una volta l’anno o dopo ogni modifica importante.
                                                  • Metti davanti all’applicazione un web application firewall (WAF) per bloccare molti attacchi noti.
                                                  • Configura avvisi sulle attività sospette.
                                                  • Conserva i log abbastanza a lungo da poter fare analisi forensi.

                                                Gestione delle vulnerabilità e aggiornamenti

                                                    • Definisci un processo sistematico per applicare le patch di sicurezza.
                                                    • Iscriviti ai bollettini di sicurezza dei fornitori dei software che usi.

                                                  Formazione e cultura della sicurezza

                                                      • Organizza sessioni di formazione regolari sulle tecniche di sicurezza più recenti.
                                                      • Insegna agli utenti le buone pratiche di sicurezza (password robuste, riconoscere il phishing, ecc.).

                                                    Conformità e standard di sicurezza

                                                        • Verifica che la tua applicazione web rispetti le normative in vigore (GDPR, PCI DSS, ecc.).
                                                        • Usa la Top 10 OWASP come riferimento per individuare e correggere le vulnerabilità più critiche.

                                                      Conclusione

                                                      Mettere in sicurezza un’applicazione web è un processo continuo che richiede attenzione costante. Adottando queste buone pratiche rafforzi in modo netto la protezione delle tue applicazioni contro le minacce di oggi e di domani.

                                                      Damien Flandrin Sviluppatore web dal 2010, creatore di Gekkode e di Email Impact. Ogni articolo è testato su un progetto reale prima della pubblicazione. Contatti
                                                      Newsletter

                                                      I nuovi test, tutorial e progetti, via e-mail.

                                                      Test riproducibili, codice versionato, risultati datati. Mai spam.