2012-09-16 17 views
7

ho wnat di impostare cookie con un nome csrf_cookie_name con un valore da questa funzione $ this-> Sicurezza-> get_csrf_hash(); ma, non funziona.impostazioni dei cookie non funziona in CodeIgniter

ho questo nel mio controller:

$csrf_cookie_value = $this->security->get_csrf_hash(); 
    $this->input->set_cookie('csrf_cookie_name', $csrf_cookie_value); 
    echo $this->input->cookie('csrf_cookie_name'); 
    die(); 

Ma non funziona e nulla fa eco fuori.

Se provo solo questo:

$csrf_cookie_value = $this->security->get_csrf_hash(); 
echo $csrf_cookie_value; 

opere di I e di una stringa generata fa eco fuori.

Quindi, presumo che qualcosa all'interno di questi prossimi 2 linee è sbagliato:

$this->input->set_cookie('csrf_cookie_name', $csrf_cookie_value); 
echo $this->input->cookie('csrf_cookie_name'); 

Grazie per i vostri consigli.

+2

Non sono sicuro di come funzioni in PHP, ma suppongo che quando provi a leggere il cookie esso stia leggendo dalle intestazioni di richiesta e ovviamente non sarà lì dato che il cookie non è stato impostato quando è stata fatta la richiesta. controllare una volta inviata la risposta se il cookie è impostato nel browser. ulteriori richieste dovrebbero leggere correttamente il valore del cookie. Nota Potrei sbagliarmi .. – Baz1nga

+0

L'ho impostato con $ this-> input-> set_cookie ('csrf_cookie_name', $ csrf_cookie_value); prima ho cercato di farlo eco. – Derfder

+0

So che hai .. considera di leggere la richiesta e risposta HTTP e come funzionano i cookie .. – Baz1nga

risposta

7

Il motivo non si è trovato un fece eco cookie è perché la funzione $this->input->cookie() legge direttamente dalla $_COOKIE gamma globale e $this->input->set_cookie() non inserisce subito la matrice $_COOKIE sul server. Invece, $this->input->set_cookie() accoda il cookie da inviare indietro e archiviato nel browser. Solo sulla successiva richiesta HTTP degli utenti sarai in grado di osservare nuovamente questo cookie.

In secondo luogo, e forse ancora più importante, è che penso che si stia utilizzando il cookie csrf in modo improprio. Per proteggersi dalla falsificazione di richieste cross site, è necessario solo abilitarlo e impostare le sue proprietà in config/config.php. È così. Non è necessario leggerlo e scriverlo nei controller.

+0

Lo sto utilizzando in collegamenti non in moduli, quindi ho bisogno di accedervi direttamente. – Derfder

19

È necessario specificare una durata per il cookie. 0 sarà un cookie di sessione e qualsiasi altra cosa verrà aggiunta a time().

Se non si specifica un tempo di vita, CI interpreterà che si desidera eliminare il cookie. E questo è esattamente ciò che fa :)

$this->input->set_cookie('name', 'value', 0); //expires when the browser window closes 
$this->input->set_cookie('name', 'value', 3600); //expires in one hour 
$this->input->set_cookie('name', 'value');  //will delete the cookie (if the cookie does not exist, you will not notice anything happening) 
+1

Questo è corretto, è necessaria una data di scadenza. Se non ne imposti uno (o non invii un valore non numerico) la libreria di input imposterà una data di scadenza nel passato (che per quanto posso dire è la stessa di non impostarla affatto) –

3

Il cookie è già lì. Puoi consultare via Javascript con:

$.cookie("<?php echo $this->config->item("csrf_cookie_name"); ?>"); 

Spero di essere utile.

Problemi correlati