2010-06-28 12 views
6

Sto solo imparando a conoscere le sessioni e, per i miei scopi, voglio creare qualcosa che su ogni richiesta del client, il server autentica quell'utente, e solo allora esegue la gestione dei dati per quell'utente.Aiuto sessione CodeIgniter, i cookie non sono sicuri?

Tuttavia, ho visto un sacco di esempi con CodeIgniter in cui la sessione è impostato come in tal modo:

$this->load->library('session'); 

$newdata = array(
       'username' => 'johndoe', 
       'email'  => '[email protected]', 
       'logged_in' => TRUE 
      ); 

$this->session->set_userdata($newdata); 

Tuttavia, non poteva qualcuno solo creare un cookie sul proprio computer con un nome utente comune e la lo stato 'logged_in' è true, e improvvisamente sei autenticato senza password? Questo mi sembra un difetto di sicurezza, ma vedo così tanti esempi come questo.

Qual è il modo corretto di autenticare l'utente per ogni richiesta?

+0

Chiedendo la stessa cosa: perché IC non usa solo le sessioni di php e fornisce una sorta di interfaccia CI-ish ad esso? È vero che puoi usare il database, ma cosa c'è di sbagliato nelle sessioni "normali" in primo luogo? –

+1

La libreria di sessione di CodeIgniter è pronta per rendere le sessioni più flessibili e per eliminare le sessioni di gestione. Funziona molto bene e se si memorizzano le sessioni nel database forza la convalida di un ID sessione univoco. Codeigniter gestisce in modo trasparente sia l'impostazione che il controllo dell'ID di sessione. C'è un'interfaccia alle sessioni native per codigniter qui: http://codeigniter.com/wiki/Native_session/ – DRL

+0

"Session" non significa "Cookie". Sessione esiste solo sul server e fuori portata diretta di un utente malintenzionato. Il cookie contiene solo un sessionid, che è una stringa opaca e casuale. Il server utilizza il sessionid per cercare l'oggetto di sessione per l'utente corrente. In breve, il cookie non contiene i flag user name/email/logged_in, e quindi un attacker non può modificarli direttamente –

risposta

9

Nel file application/config/config.php dell'installazione di codificatore, è possibile scegliere di crittografare i cookie.

$config['sess_cookie_name'] = 'ci_session'; 
$config['sess_expiration'] = 7200; 
$config['sess_encrypt_cookie'] = TRUE; // set from false to TRUE 

Una volta impostata la set_userdata() e datiutente() metodi in modo trasparente di gestire codificare e decodificare i dati di sessione.

Una lista completa delle opzioni di configurazione di sessione codeigniter è in fondo a questa pagina:

http://codeigniter.com/user_guide/libraries/sessions.html

+0

Va bene, suona bene. L'unica cosa che mi chiedo è sicura quanto la memorizzazione dei dati di sessione in un database? Se qualcuno interrompe la crittografia dei cookie, può ora creare un cookie per qualsiasi utente (indovinando i nomi utente) anziché accedere semplicemente all'account di un utente. – Nick

+2

Se è un problema, perché non usi il database per memorizzare le sessioni? In questo modo puoi convalidare l'ID di sessione oltre a far crittografare il cookie. Se sei preoccupato per la sicurezza, dovresti * usare * il database. Vedere * Salvataggio dei dati della sessione in una sezione Database * della guida dell'utente della CI: http://demos.softaculous.com/CodeIgniter/user_guide/libraries/sessions.html – stormdrain

2

se si desidera una maggiore sicurezza, è possibile scegliere di memorizzare i dati di sessione nel database modificando il seguendo le linee all'interno del vostro CodeIgniter config.php:

$config['sess_use_database'] = TRUE; 
$config['sess_table_name']  = 'ci_sessions'; 

Quindi, è sufficiente creare la seguente tabella:

CREATE TABLE IF NOT EXISTS `ci_sessions` (
    session_id varchar(40) DEFAULT '0' NOT NULL, 
    ip_address varchar(16) DEFAULT '0' NOT NULL, 
    user_agent varchar(120) NOT NULL, 
    last_activity int(10) unsigned DEFAULT 0 NOT NULL, 
    user_data text NOT NULL, 
    PRIMARY KEY (session_id), 
    KEY `last_activity_idx` (`last_activity`) 
); 
+0

Una bella spiegazione qui: http: // christopherickes.com/web-app-development/3-codeigniter-sessions-best-practice/che suggerisce anche di cambiare: $ config ['sess_cookie_name'] = 'ci_session'; a $ config ['sess_cookie_name'] = 'cisession'; per compatibilità IE –