Qual è il modo più attuale, di buona pratica e più semplice per utilizzare le sessioni in PHP?

StackOverflow https://stackoverflow.com/questions/96460

  •  01-07-2019
  •  | 
  •  

Domanda

Le sessioni in PHP sembravano essere cambiate dall'ultima volta che le ho usate, quindi sto cercando un modo semplice di utilizzare le sessioni ma allo stesso tempo che sia relativamente sicuro e una buona pratica comune.

È stato utile?

Soluzione

La gestione della sessione è cambiata qualche tempo fa (penso che fosse intorno alla 4.4).Il vecchio meccanismo funziona ancora, ma è deprecato.È piuttosto confuso, quindi consiglio di starne alla larga.Oggi usi le sessioni accedendo alla variabile globale $_SESSION (è un array).Voi Potere inserisci lì le istanze degli oggetti, ma devi caricare le definizioni delle classi per quegli oggetti prima di iniziare la sessione nella pagina successiva.Utilizzando caricamento automatico può aiutarti qui.

Devi avviare una sessione prima di poter utilizzare $_SESSION.Poiché l'avvio della sessione invia intestazioni, non è possibile avere alcun output prima.Questo può essere risolto in due modi:O inizi sempre la sessione all'inizio dello script.O tu bufferizzare tutto l'output, e inviarlo alla fine dello script.

Una buona idea è rigenerare la sessione ad ogni richiesta.questo rende il dirottamento molto meno probabile.

Questo è (leggermente) un cattivo consiglio, poiché può rendere il sito inaccessibile.Dovresti rigenerare l'id di sessione ogni volta che i privilegi di un utente cambiano.In generale ciò significa ogni volta che accedono.Questo serve a prevenire la fissazione della sessione (una forma di dirottamento della sessione).Vedere questo thread recente su Sitepoint per ulteriori informazioni sull'argomento.

Utilizzo di sessioni basate su cookie soltanto va bene, ma se rigeneri gli ID di sessione all'accesso, non aggiunge alcuna sicurezza aggiuntiva e riduce leggermente l'accessibilità.

Altri suggerimenti

Per quanto riguarda la semplicità, non c'è niente di meglio di:

# Start the session manager
session_start(); 

# Set a var
$_SESSION['foo'] = 'whatever';

# Access the var
print $_SESSION['foo'];

Anche se il database potrebbe essere più sicuro per le sessioni, dovresti concentrarti innanzitutto su ciò che stai memorizzando nella sessione: in realtà non dovrebbe contenere altro che un ID per identificare l'utente (e FORSE un nome o una variabile temporanea tra le pagine ).

Suggerirei semplicemente di utilizzare l'impostazione predefinita, i cookie.Le sessioni del database danno un vantaggio in più SU OGNI PAGINA e, anche se non tutti i siti sono slashdot, non c'è nulla di male nel pre-ottimizzare qualcosa di così semplice.

Per l'utilizzo, consiglierei la variabile globale standard:

$_SESSION['yourvar'] = 'somevalue';

Se utilizzi questo metodo in tutto il tuo codice, puoi facilmente modificare il back-end in un secondo momento tramite l'uso di session_set_save_handler, che offre un modo unificato di implementare i backend delle sessioni.Tieni presente che puoi utilizzare un oggetto per contenere tutta la gestione della sessione, fornendo semplicemente degli array a ciascuna voce: array('Staticclass', 'staticmethod').

Per un utilizzo più approfondito, ti consiglio di dare un'occhiata a come vengono gestite le sessioni KohanaPHP.

È possibile archiviare sessioni PHP nel database, come descritto in Questolibro.Ho utilizzato questo metodo e lo trovo sicuro e facile da implementare, quindi lo consiglierei.

Incapsula l'array $SESSION in un oggetto Session() che ti consente di ottenere variabili dalla sessione, get e post in modo simile (ma dissociabile), inclusi filtri di sicurezza automatici, variabili flash (var che vengono utilizzate una volta e poi distrutte), e setter di valori predefiniti.

Dai un'occhiata al comportamento di Symfony su questo punto, è molto utile.

Le sessioni sono state una parte fondamentale della mia conoscenza di PHP perché mi hanno aiutato a risolvere il mio problema di autenticazione di accesso quando stavo sviluppando la mia prima applicazione web.

session_start();
if( isset($_POST['username']) && isset($_POST['password']) )
{
    if( auth($_POST['username'], $_POST['password']) )
    {
        //Authentication passed
        $_SESSION['user'] = $_POST['username'];
        // redirect to required page
        header( "Location: index.php" );
    } 
    else 
    {
       //Authentication failed redirect to login
       header( "Location: loginform.html" );
    }
} 
else 
{
      //Username and Password are required
      header( "Location: loginform.html" );
}

Prima di tutto, utilizza solo i cookie, a meno che tu non abbia un valido motivo commerciale molto specifico per non farlo.Avevo un cliente che insisteva per sessioni basate su URL solo per un progetto.molto insicuro ed è difficile lavorare con lui.

Una buona idea è rigenerare la sessione ad ogni richiesta.questo rende il dirottamento molto meno probabile.Per esempio.

session_start();
$old_sessionid = session_id();
session_regenerate_id();
$new_sessionid = session_id();

Un'altra cosa che è buona pratica è se si sta eseguendo una sorta di accesso utente come parte del sistema, invalidare completamente e svuotare i dati della sessione al momento della disconnessione per assicurarsi che l'utente sia veramente disconnesso dal sistema.Ho visto sistemi in cui il logout viene effettuato semplicemente rimuovendo il cookie di sessione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top