2010-06-28 13 views
6

Po prostu uczę się o sesjach i dla moich celów chcę stworzyć coś, co na każde żądanie klienta, serwer uwierzytelnia tego użytkownika, a dopiero potem wykonuje obsługę danych dla tego użytkownika.Pomoc sesji CodeIgniter, pliki cookie nie są bezpieczne?

Jednak Widziałem wiele przykładów z CodeIgniter gdzie sesja jest skonfigurowana jako sposób:

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

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

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

Jednak nie może ktoś po prostu utworzyć plik cookie na komputerze ze wspólną nazwę użytkownika i "logged_in" oznacza true i nagle jesteś uwierzytelniony bez hasła? To wydaje mi się wadą bezpieczeństwa, ale widzę wiele takich przykładów.

Jaki jest właściwy sposób uwierzytelnienia użytkownika przy każdym żądaniu?

+0

Zastanawiasz się nad tym samym: dlaczego CI nie używa tylko sesji php i nie zapewnia mu jakiegoś interfejsu CI-ish? Prawdą jest, że możesz korzystać z bazy danych, ale co jest nie tak z "normalnymi" sesjami? –

+1

Biblioteka sesji kodowania jest po to, aby sesje stały się bardziej elastyczne i przerobić sesje obsługi. Działa bardzo dobrze i jeśli przechowujesz sesje w bazie danych, wymusza walidację unikalnego identyfikatora sesji. Codeigniter obsługuje przezroczysto zarówno ustawianie, jak i sprawdzanie identyfikatora sesji. Istnieje interfejs do sesji natywnych dla codignitera tutaj: http://codeigniter.com/wiki/Native_session/ – DRL

+0

"Sesja" nie oznacza "Cookie". Sesja istnieje tylko na serwerze i poza zasięgiem bezpośredniego napastnika. Plik Cookie zawiera właśnie sessionid, który jest nieprzezroczystym i losowym ciągiem znaków. Serwer używa obiektu sessionid do wyszukiwania obiektu sesji dla bieżącego użytkownika. W skrócie, plik cookie nie zawiera nazw użytkownika/email/logged_in flag, a zatem atakujący nie może ich bezpośrednio modyfikować. –

Odpowiedz

9

W pliku application/config/config.php instalacji codigniter możesz wybrać szyfrowanie plików cookie.

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

Gdy to ustawienie set_userdata() i UserData() metody będą przejrzyście obsługi szyfrowania i deszyfrowania danych sesji.

Pełna lista opcji konfiguracyjnych sesji codeigniter jest na dole tej strony:

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

+0

Dobra, to brzmi dobrze. Zastanawiam się tylko, czy jest to tak bezpieczne, jak przechowywanie danych sesji w bazie danych? Jeśli ktoś złamie szyfrowanie plików cookie, może teraz utworzyć plik cookie dla dowolnego użytkownika (zgadywanie nazwy użytkownika) zamiast po prostu uzyskać dostęp do konta jednego użytkownika. – Nick

+2

Jeśli jest to problemem, dlaczego nie używasz bazy danych do przechowywania sesji? W ten sposób możesz potwierdzić identyfikatory sesji oprócz tego, że pliki cookie są zaszyfrowane. Jeśli martwisz się bezpieczeństwem, rzeczywiście * powinieneś * używać bazy danych. Zobacz sekcję * Zapisywanie danych sesji w bazie danych * w przewodniku użytkownika CI: http://demos.softaculous.com/CodeIgniter/user_guide/libraries/sessions.html – stormdrain

2

Jeśli chcesz zwiększyć bezpieczeństwo, można wybrać do przechowywania danych sesji w bazie danych przez modyfikowanie następujące linie w swoim CodeIgniter config.php:

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

Następnie wystarczy utworzyć poniższej tabeli:

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

Ładne wyjaśnienie tutaj: http: // christopherickes.com/tworzenie aplikacji WWW/3-codeigniter-sessions-best-practices/co również sugeruje zmianę: $ config ['sess_cookie_name'] = 'ci_session'; do $ config ['sess_cookie_name'] = 'posisession'; dla kompatybilności IE –

Powiązane problemy