2012-05-02 11 views
7

Non riesco a trovare una risposta semplice a questa domanda. C'è un modo in cui posso costringere un utente connesso a disconnettersi? Il mio sistema di login si basa essenzialmente su una sessione che contiene l'ID univoco dell'utente (che è memorizzato in un database mysql). Quindi, in sostanza solo ...Forza l'utente alla sessione di disconnessione PHP

if (isset($_SESSION['user_id'])) { 
echo "You're logged in!"; 
} else { 
echo "You need to login!"; 
} 

Ma diciamo che voglio mettere al bando questo utente, così posso cambiare il loro status al bandito nel mio database, ma questo non farà nulla fino a quando l'utente si disconnette e tenta di accedere di nuovo in ... Quindi, come faccio a forzare questo utente a uscire? Preferibilmente senza controllare ogni volta che visualizzano una pagina indipendentemente dal fatto che il loro stato sia stato cambiato in "bannato" perché ciò sembra uno stress inutile sul mio server. Ogni aiuto è apprezzato, grazie.

+0

perché non verificare se l'utente è bannato durante il processo di accesso ..? –

+0

Controllo durante la procedura di accesso, ma se non si disconnettono possono continuare ad usare il sito nonostante siano bannati ... Ovviamente li sto bandendo per una ragione, non voglio solo aspettare finché non sono abbastanza gentile da disconnettersi. – Ian

+0

Ian, hai trovato la soluzione dopotutto? – Rossitten

risposta

6

O avete bisogno di controllare ogni volta che caricare una pagina, o forse guardare un chiamata Ajax a intervalli regolari per verificare il loro stato dal DB.

Quindi è possibile utilizzare session_destroy(); per terminare la sessione. Questo distruggerà la loro intera sessione.

In caso contrario è possibile utilizzare unset($_SESSION['user_id']); per disinserire una singola sessione variabile

+1

Hmm, ajax è un'idea interessante ma un utente esperto sarebbe probabilmente in grado di bloccare la chiamata. – Ian

0

È possibile disinserirlo.

unset($_SESSION['user_id']) 
+2

Penso che tu abbia letto male la mia domanda, so come disinserire le sessioni ciò che non so come fare è costringere un utente a disinserire la propria sessione, senza fare riferimento al database ogni volta. – Ian

+0

Immagino che tu voglia sapere se riesci a disinserire una sessione arbitraria. La risposta è no. Lo script PHP che serve loro una pagina deve interrogare per vedere se sono bannati. Dovresti interrogare il DB per le loro informazioni utente di base ogni volta che la pagina esegue il rendering, in ogni caso, nel caso in cui cambino in qualche modo, quindi controlla se sono bannati e non impostati in caso affermativo. – DanRedux

+0

Hmm, quindi dovrei resettare le variabili di sessione ogni volta che la pagina viene visualizzata? Ho resettato le variabili di sessione necessarie se le cambiano (diciamo che cambiano il loro nome utente, che è memorizzato in una variabile di sessione), c'è un motivo di sicurezza specifico (o altro) che dovrei controllare ogni volta che la pagina viene caricata conoscere? – Ian

0

Si potrebbe usare Custom Session Handlers questo modo si ha il pieno controllo dove e come i dati della sessione sono memorizzati sul server.

Quindi è possibile memorizzare i dati di sessione per un particolare utente in un file denominato <user_id>.session ad esempio. Quindi, per disconnettere l'utente, elimina quel file.

+0

Huh, beh, questo è certamente buono a sapersi. Sfortunatamente il mio programma localhost (MAMP) non ha ancora lanciato il supporto per PHP 5.4, quindi penso che avrò intenzione di analizzare questa soluzione fino a che ciò non accadrà. Grazie. – Ian

+0

Anche questa soluzione rallenta ogni pagina eseguendo PHP durante ogni ciclo della vita di una sessione che normalmente verrebbe gestita da un codice precompilato. – DanRedux

+2

@Ian: funziona anche con PHP4 (si veda: [session_set_save_handler] (http://www.php.net/manual/en/function.session-set-save-handler.php)) solo il nuovo [SessionHandlerInterface] (http://www.php.net/manual/en/class.sessionhandlerinterface.php) ha bisogno di PHP> = 5.4.0 questo è solo un altro modo di fare la stessa cosa. – stewe

5

Preferibilmente senza verificare ogni volta che visualizzano una pagina indipendentemente dal fatto che il loro stato sia stato impostato su "bannato" perché ciò sembra uno stress inutile sul mio server.

Caricare l'utente dal database su ogni caricamento della pagina, piuttosto che archiviare una copia dell'utente nella sessione, è una soluzione perfettamente ragionevole. Impedisce inoltre all'utente di non sincronizzarsi con la copia nel database (in modo tale che, ad esempio, è possibile modificare le proprietà o le autorizzazioni di un utente senza che debbano disconnettersi e rientrare).

+0

+1. "sembra uno stress inutile sul mio server." = ottimizzazione prematura. –

0

Le chiamate Ajax in un intervallo aumentano il carico del server. Se si desidera una risposta in tempo reale alle proprie azioni (ad esempio, l'utente verrà disconnesso direttamente al momento della loro esclusione dal back-end di sistema), è necessario esaminare qualcosa come Server Push.

L'idea è di mantenere un tunnel aperto dal server al browser ogni volta che un utente naviga nel tuo sito Web, in modo da poter comunicare con loro anche dal lato server. Se vuoi che vengano bannati, invia una richiesta di logout e il processo nella tua pagina (es. Forzare il logout disinserendo la sessione).

0

Prova a mettere questo su ogni pagina ...

if (isset($_SESSION['user_id'])) { 

    $sql = "SELECT from tbl where status='banned' and user_id=$_SESSION['user_id'] "; 
    $query = mysql_query($sql); 

    if(!empty(mysql_num_rows($query))){ // found the banned user 
     //redirect to logout or 
     //session_destroy(); 
    } 

} else { 
echo "You need to login!"; 
} 

se l'utente è ancora connesso in ... controlla se il suo/la sua condizione è vietato o no ... se vietato .. poi logout

-1

Ci sono alcuni modi per fare questo il meglio a mio parere in base alla sicurezza è: NOTA: QUESTO È VERAMENTE ROUGH ....So che la sintassi è sbagliata, è solo per farti avere un'idea.

$con = mysql_connect("localhost","sampleuser","samplepass"); 
if (!$con) 
{ 
$error = "Could not connect to server"; 
} 
mysql_select_db("sampledb", $con); 
$result = mysql_query("SELECT * FROM `sampletable` WHERE `username`='".$_SESSION['user_id']."'"); 
$userdeets = mysql_fetch_array($result); 
if($_SESSION['sessionvalue'] != $userdeets['sessionvalue']) 
{ 
session_destroy(); 
Header('Location: logout.php'); 
} 
else 
{ 
$result2 = mysql_query("UPDATE `sessionvalue` WHERE `username`='".$_SESSION['user_id']."' SET `sessionvalue` = RANDOMVALUE''"); 
$sesval = mysql_fetch_array($result2); 
$_SESSION['sessionvalue'] = $seshval 
} 

Ora so quello non è il codice molto ma in sostanza che cosa dovete fare per essere sicuri e avere questa capacità è:

  • Ogni volta che un caricamento della pagina controllare un valore di sessione corrisponde un valore in il DB.
  • Ogni volta che una pagina carica imposta un nuovo valore di sessione in base a un valore DB generato casualmente. sarà necessario memorizzare il nome utente anche in una sessione.
  • se l'ID sessione non corrisponde, distruggi la sessione e reindirizzali.
  • se corrisponde fa il nuovo ID di sessione.

se si desidera escludere un utente, è possibile impostare il valore di sessione nel DB su un valore come "BANNED". questo valore non consentirà loro di accedere in entrambi. in questo modo puoi controllare l'utente attraverso un semplice modulo web e puoi anche generare facilmente elenchi di utenti vietati, ecc. Vorrei avere più tempo per spiegarlo Spero che questo aiuti.

0

Questo ha funzionato per me sto usando pHP 5.4 include 'connect.php';

session_start(); 
    if(session_destroy()) 
    { 
    header("Location: login.php"); 
    } 
0

È possibile utilizzare session_save_path() per trovare il percorso in cui PHP salva i file di sessione, e quindi eliminarle utilizzando unlink().

Una volta eliminato il file di sessione memorizzato nel server, il cookie del lato client PHPSESSID non sarà più valido per l'autenticazione e l'utente verrà automaticamente disconnesso dall'applicazione.

Si prega di prestare molta attenzione durante l'utilizzo di questo approccio, se il percorso in questione risulta essere la directory globale/tmp! Ci sono altri processi oltre a PHP che memorizzano i dati temporanei lì. Se PHP ha una propria directory riservata ai dati di sessione, dovrebbe essere abbastanza sicura.

Problemi correlati