2010-06-28 35 views
6

Tôi chỉ tìm hiểu về phiên và cho mục đích của mình, tôi muốn tạo thứ gì đó theo yêu cầu của khách hàng, máy chủ xác thực người dùng đó và chỉ thực hiện xử lý dữ liệu cho người dùng đó.Trợ giúp phiên CodeIgniter, cookie không an toàn?

Tuy nhiên, tôi đã thấy rất nhiều ví dụ với CodeIgniter hợp phiên được thiết lập là như sau:

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

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

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

Tuy nhiên, không thể một người nào đó chỉ cần tạo một cookie trên máy tính của họ với tên người dùng thông thường và trạng thái 'logged_in' thành true và đột nhiên bạn được xác thực mà không có mật khẩu? Điều này có vẻ như một lỗ hổng bảo mật đối với tôi, nhưng tôi thấy rất nhiều ví dụ như thế này.

Cách thích hợp để xác thực người dùng trên mỗi yêu cầu là gì?

+0

Tự hỏi điều tương tự: tại sao CI không sử dụng phiên php và cung cấp một số loại giao diện CI-ish cho nó? Đúng là bạn có thể sử dụng cơ sở dữ liệu, nhưng có gì sai với các phiên 'bình thường' ngay từ đầu? –

+1

Thư viện phiên mã lệnh có sẵn để làm cho các phiên dễ đọc hơn và mất công việc trong các phiên xử lý. Nó hoạt động rất tốt và nếu bạn lưu trữ các phiên trong việc xác thực lực lượng cơ sở dữ liệu của một ID phiên duy nhất. Codeigniter xử lý minh bạch cả cài đặt và kiểm tra id phiên. Có một giao diện cho phiên bản gốc cho người viết mã tại đây: http://codeigniter.com/wiki/Native_session/ – DRL

+0

"Phiên" không có nghĩa là "Cookie". Phiên chỉ tồn tại trên máy chủ và phạm vi tiếp cận ngoài tầm với của kẻ tấn công. Cookie chỉ chứa một sessionid, là một chuỗi mờ và ngẫu nhiên. Máy chủ sử dụng sessionid để tra cứu đối tượng phiên cho người dùng hiện tại. Tóm lại, cookie không chứa tên người dùng/email/log_in cờ, và do đó kẻ tấn công không thể sửa đổi chúng trực tiếp –

Trả lời

9

Trong tệp ứng dụng/config/config.php của trình cài đặt mã hóa của bạn, bạn có thể chọn mã hóa cookie của mình.

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

Khi điều này được đặt, phương thức set_userdata() và userdata() sẽ xử lý minh bạch mã hóa và giải mã dữ liệu phiên.

Một danh sách đầy đủ các tùy chọn cấu hình phiên CodeIgniter là ở dưới cùng của trang này:

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

+0

Được rồi, điều đó nghe hay đấy. Điều duy nhất tôi tự hỏi là điều này là an toàn như lưu trữ dữ liệu phiên trong cơ sở dữ liệu? Nếu ai đó bẻ khóa mã hóa cookie, giờ đây họ có thể giả mạo cookie cho bất kỳ người dùng nào (đoán tên người dùng) thay vì chỉ truy cập tài khoản của một người dùng. – Nick

+2

Nếu nó là một mối quan tâm, tại sao bạn không sử dụng cơ sở dữ liệu để lưu trữ phiên? Bằng cách này, bạn có thể xác thực ID phiên cùng với việc mã hóa cookie. Nếu bạn lo lắng về bảo mật, bạn thực sự * nên * đang sử dụng cơ sở dữ liệu. Xem phần * Lưu dữ liệu phiên vào cơ sở dữ liệu * của hướng dẫn sử dụng CI: http://demos.softaculous.com/CodeIgniter/user_guide/libraries/sessions.html – stormdrain

2

Nếu bạn muốn tăng bảo mật, bạn có thể chọn để lưu trữ dữ liệu phiên trong cơ sở dữ liệu bằng cách sửa đổi dòng sau trong CodeIgniter bạn config.php:

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

sau đó, chỉ cần tạo bảng sau:

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

Một lời giải thích thú vị ở đây: http: // christopherickes.com/web-app-development/3-codeigniter-sessions-best-practices/cũng đề xuất thay đổi: $ config ['sess_cookie_name'] = 'ci_session'; tới $ config ['sess_cookie_name'] = 'cisession'; cho khả năng tương thích IE –

Các vấn đề liên quan