2010-12-12 8 views
6

Sto sviluppando un sito Web (con un carrello acquisti) sopra Codeigniter e voglio utilizzare l'impostazione sess_use_database per rendere più difficile agli utenti l'hacking di un carrello della spesa sessione.Codeigniter: come evitare la memorizzazione nella cache del database per le sessioni

ho anche decidere di utilizzare la cache del database per velocizzare le richieste di DB comuni (come ad esempio 'ottenere categorie' come la maggior parte del contenuto DB non cambierà regolarmente), quindi mi hanno permesso questa impostazione:

$db['development']['cache_on'] = TRUE; 
//where 'development' is my environment 

di conseguenza, mi sto trovando che i contenuti di sessione non vengono aggiornati, ad esempio, su tale richiesta

$this->basket_contents = array_values($this->session->userdata('basket_contents')); 

Inoltre, ho provato questo:

$this->db->cache_off(); 

... prima della richiesta di sessione, ma non risolve il problema (presumo perché non è una richiesta DB diretta).

miei setings sessione sono i seguenti:

$config['sess_cookie_name']  = 'str_session'; 
$config['sess_expiration']  = 7200; 
$config['sess_encrypt_cookie'] = FALSE; 
$config['sess_use_database'] = TRUE; 
$config['sess_table_name']  = 'ci_sessions'; 
$config['sess_match_ip']  = FALSE; 
$config['sess_match_useragent'] = TRUE; 
$config['sess_time_to_update'] = 300; 

Posso evitare la memorizzazione nella cache delle richieste DB relativi alla sessione? O impedire che alcune tabelle vengano memorizzate nella cache?

O c'è un'altra soluzione (probabilmente ovvia) a cui non ho pensato?

Grazie in anticipo.

risposta

3

Nella cache CodeIgniter è una soluzione tutto-o-niente, non è possibile abilitarlo per le singole tabelle.

ci sono due opzioni che posso pensare:

  • non utilizzano la cache generica di CI, ma utilizzare una libreria di cache come http://philsturgeon.co.uk/code/codeigniter-cache
  • mod db_driver.php. Alla riga 265 (CI 1.7.2) controlla se la memorizzazione nella cache è abilitata. Alterare quella linea in modo che non lo faccia quando è un SELEZIONA nella tabella delle sessioni.
+0

Grande, grazie. Inizierò con la prima opzione. – Ade

1

In versione 2.2.1 fino a ci potrebbe essere una soluzione semplice: la linea

nel file system/librerie/Session.php

ritrovamento con la stringa "$ query = $ this-> CI-> DB-> get ($ this-> sess_table_name);"

  1. prima della linea di put:

    // saving cache_on 
    $cache_on = $this->CI->db->cache_on; 
    $this->CI->db->cache_on = false; 
    
  2. dopo la linea messa:

    // restoring cache_on 
    $this->CI->db->cache_on = $cache_on; 
    

Questo consentirà di evitare mysql caching per questa query esatto della sessione, lasciando la logica della cache così com'è.

Ricorda che questa modifica riguarda il file di sistema framework, quindi se si aggiorna l'elemento di configurazione alla versione superiore, questo trucco andrà perso.

Problemi correlati