Sistema di accesso sicuro - utilizzando le sessioni?

4

Sto cercando un modo sicuro per consentire agli utenti di accedere al mio sito web. Attualmente, ho sempre usato un sistema di sessione, come questo:

<?php
session_start();

if (validPass() || isset($_SESSION['userId'])) {
    if (isset($_GET['logout'])) {
        session_destroy();
    } else {
        if (!isset($_SESSION['userId'])) {
            $_SESSION['userId'] = $the_id;
        }
        // User is logged in
    }
} else {
    // Show a login form
}
?>

È questo il modo sicuro, o ci sono sistemi migliori? Cosa dovrei cercare?

    
posta Keelan 12.04.2013 - 17:10
fonte

3 risposte

6

Un modo più sicuro? Usa https insieme a questo. Ci sono due vulnerabilità qui:

  • Quando l'utente effettua il login, la password che viene inviata può essere facilmente letta da chiunque curiosetta sulla tua connessione. Questo non può accadere su una connessione https.
  • Se un utente ha già effettuato l'accesso, qualcuno che ficca la tua connessione può semplicemente copiare i cookie di sessione. In HTTPS, i cookie vengono trasmessi in modo sicuro, quindi non c'è molto di un problema.

Potresti anche voler registrare l'indirizzo IP dell'utente e non lasciarli scambiare, anche se questo può essere fastidioso (per un utente come me che è dietro un proxy universitario con IP esterni in rotazione, non sarò mai in grado di accedere ).

Un'ultima osservazione: non utilizzare GET per il bit di logout. Cerca di non utilizzare GET per qualsiasi cosa che attiva una modifica: va bene per la navigazione, ma non per qualcosa che porterà a qualcosa di diverso sul server (un logout o qualsiasi cosa che scrive in un database). Vedi l'uso prescritto di GET e POST per ulteriori dettagli .

Se implementi quanto sopra, assicurati anche che il referrer di una richiesta POST sia il tuo sito e non qualche altro sito. (Questo, insieme a quanto sopra, aiuterà a prevenire gli attacchi CSRF ).

Per impedire clickjacking , disabilita l'inquadratura tramite javascript e l'intestazione X-Frame-Options: deny .

    
risposta data 12.04.2013 - 17:33
fonte
1

Solo per migliorare il metodo di controllo prova ad aggiungere alcune cose sul login sicuro dell'utente.
Prova a utilizzare force cast con (int) per evitare che l'autore dell'attacco possa passare qualsiasi stringa dannosa e anche un controllo non vuoto.

<?php
if (isset($_SESSION['userId']) && (!empty($_SESSION['userId'])) {
  $user_id= (int)$_SESSION['userId'];
} else {
  $user_id=0;
}

echo 'Test: '.$user_id;
?>
    
risposta data 12.04.2013 - 19:00
fonte
1

Per aggiungere una risposta a Manishearth, ti consiglio anche quanto segue:

  1. Imposta i cookie come HttpOnly e Secure Scrivi sempre sicuro (per assicurarti che sia leggibile solo dal sito abilitato HTTPS) e HttpOnly (per assicurarti che non sia accessibile tramite Script: può essere pericoloso se XSS viene visualizzato sul tuo sito)

  2. Abilita intestazioni front-end come Content Security Policy, Strict-Transport-Policy.

risposta data 12.04.2013 - 20:43
fonte

Leggi altre domande sui tag