previene il dirottamento di sessione in PHP

6

Ho scritto gli script di accesso / disconnessione della mia pagina Web e quando l'utente accede memorizzo nella variabile $_SESSION l'agente utente. Ora ogni volta che una pagina viene caricata, controllo se l'utente è connesso o meno e se è loggato, controllo se l'agente utente è cambiato o è sempre lo stesso per prevenire il dirottamento. Se è cambiato, chiamo la mia funzione logOut() :

function logOut($conn) 
{
    $sql = "UPDATE Users SET logged='no' WHERE username='" . $_SESSION['username'] ."'";
    $conn->query($sql); 

    // Unset all session values 
    $_SESSION = array();

    // get session parameters 
    $params = session_get_cookie_params();

    // Delete the actual cookie. 
    setcookie(session_name(), '', time() - 42000, 
    $params["path"], 
    $params["domain"], 
    $params["secure"], 
    $params["httponly"]);

    // Destroy session 
  session_destroy();    
}

Ora il problema è che l'utente giusto può ancora navigare nel mio sito web come connesso mentre vorrei che si disconnettesse. Quale potrebbe essere il problema?

Per testare il mio codice ho effettuato l'accesso utilizzando Mozilla Firefox e ho copiato il valore del cookie in Chrome e ricaricato la home page e come previsto non riesco ad accedere con Chrome ma se ricarico la pagina in Mozilla è ancora connesso. Se rimuovo il controllo di user-agent, sono in grado di accedere alla pagina come effettuato l'accesso in Chrome, quindi il mio codice funziona a metà.

    
posta user3535688 14.12.2014 - 11:02
fonte

3 risposte

4

Il tuo schema è problematico dal punto di vista dell'UX e della sicurezza.

Bad UX , se implementato correttamente, un utente che accede al proprio telefono verrà immediatamente disconnesso dal proprio computer o altro. Ci sono molti altri casi problematici in cui gli utenti che non dovrebbero essere disconnessi sono disconnessi. Non è orribile, ma a seconda dell'uso della tua applicazione può essere davvero fastidioso

Sicurezza : in primo luogo, il tuo codice è vulnerabile all'iniezione SQL.

$sql = "UPDATE Users SET logged='no' WHERE username='" . $_SESSION['username'] ."'";

Il mio nome utente è USERNAME' or '1'='1

Se questo è consentito nella tua politica del nome utente, un utente malintenzionato può forzare la disconnessione di tutti gli utenti (o qualsiasi altro SQL che desiderano). Utilizza query con parametri o se sei testardo, correggi il criterio della password.

Infine, i controlli UserAgent non sono probabilmente super efficaci. Le stringhe User Agent non sono super uniche. Ad esempio, se il tuo sito web ha 1 milione di utenti che subiscono il sequestro della sessione, l'hacker utilizzerà probabilmente lo stesso browser di una porzione piuttosto ampia di essi (senza nemmeno tentare di aggirare la soluzione di sicurezza).

Per rispondere alla tua domanda effettiva , session_unset() o session_destroy() farà ciò che desideri, ma solo dopo aver chiamato session_start() .

    
risposta data 15.12.2014 - 01:21
fonte
0

questo è semplice. per prima cosa impostare HttpOnly sul cookie di sessione usa TLS ssl, significa che hai tutto criptato e le modifiche sono state rilevate imposta cookie.secure prevenire qualsiasi iniezione di XSS, sql o qualsiasi altra iniezione  allora dovresti generare una nuova sessione ad ogni accesso e invalida le vecchie sessioni

che dovrebbe essere tutto contro il dirottamento di sessione

    
risposta data 14.12.2014 - 23:29
fonte
-3

il modo migliore è seguire un tutorial

link

per distruggere in sicurezza

session_unset();
session_destroy();
    
risposta data 14.12.2014 - 15:57
fonte

Leggi altre domande sui tag