Trong CodeIgniter, thư viện Session giúp bạn dễ dàng lưu trữ và truy xuất thông tin về người dùng giữa các yêu cầu HTTP. Thư viện này hoạt động tương tự như các session trong PHP, nhưng cung cấp một số tính năng mở rộng giúp việc quản lý session an toàn và linh hoạt hơn.

Trong bài viết này, chúng ta sẽ tìm hiểu cách sử dụng thư viện Session của CodeIgniter bao gồm các khái niệm, cách cài đặt, và các ví dụ cụ thể.


1. Cấu hình thư viện Session trong CodeIgniter

Mặc định, CodeIgniter sử dụng session theo kiểu Cookie-based, nghĩa là toàn bộ dữ liệu session được lưu trữ trong cookie của trình duyệt. Bạn cũng có thể cấu hình để lưu session vào cơ sở dữ liệu, điều này giúp dữ liệu session an toàn hơn và dễ quản lý hơn khi bạn muốn chia sẻ session giữa nhiều server.

Các bước cấu hình:

  • Mở file /application/config/config.php.
  • Tìm đến cấu hình liên quan đến session.

Dưới đây là một số cài đặt cơ bản trong file config.php:

$config['sess_driver'] = 'files';          // Kiểu lưu trữ session: files, database, redis, memcached
$config['sess_cookie_name'] = 'ci_session'; // Tên cookie session
$config['sess_expiration'] = 7200;          // Thời gian session hết hạn (giây)
$config['sess_save_path'] = NULL;           // Đường dẫn lưu trữ file session
$config['sess_match_ip'] = FALSE;           // Có so khớp IP không (thêm bảo mật)
$config['sess_time_to_update'] = 300;       // Thời gian (giây) để cập nhật ID session
$config['sess_regenerate_destroy'] = FALSE; // Có hủy dữ liệu session cũ khi ID thay đổi không

Sử dụng cơ sở dữ liệu để lưu trữ session

Nếu bạn muốn lưu trữ session vào cơ sở dữ liệu, bạn cần thực hiện những bước sau:

  1. Cấu hình sess_driver thành 'database'.
  2. Đảm bảo bạn có một bảng trong cơ sở dữ liệu để lưu session. Dưới đây là lệnh SQL tạo bảng session:
CREATE TABLE `ci_sessions` (
  `id` varchar(128) NOT NULL,
  `ip_address` varchar(45) NOT NULL,
  `timestamp` int(10) unsigned DEFAULT 0 NOT NULL,
  `data` blob NOT NULL,
  PRIMARY KEY (id),
  KEY `ci_sessions_timestamp` (`timestamp`)
);

  1. Cập nhật cấu hình sess_save_path trong config.php với tên bảng đã tạo:
$config['sess_save_path'] = 'ci_sessions';  // Tên bảng lưu trữ session


2. Khởi tạo Session

CodeIgniter tự động tải thư viện session, nhưng nếu bạn muốn tải thư viện này một cách thủ công, bạn có thể thêm dòng sau vào controller của mình:

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

Thường thì bạn không cần phải thực hiện thao tác này vì thư viện session đã được tải mặc định.


3. Các phương thức thao tác với session

3.1 Thiết lập dữ liệu session

Để lưu trữ dữ liệu vào session, bạn có thể sử dụng phương thức set_userdata().

// Lưu trữ một giá trị vào session
$this->session->set_userdata('username', 'nguyenvanA');

// Lưu trữ nhiều giá trị vào session
$session_data = array(
    'username' => 'nguyenvanA',
    'email'    => '[email protected]',
    'logged_in'=> TRUE
);
$this->session->set_userdata($session_data);

3.2 Truy xuất dữ liệu session

Để truy xuất dữ liệu đã lưu trong session, bạn có thể sử dụng phương thức userdata().

// Truy xuất một giá trị từ session
$username = $this->session->userdata('username');
echo $username;  // In ra: nguyenvanA

// Kiểm tra nếu người dùng đã đăng nhập
if ($this->session->userdata('logged_in')) {
    echo "Người dùng đã đăng nhập";
}

3.3 Xóa dữ liệu session

Để xóa một hoặc nhiều giá trị trong session, bạn có thể sử dụng phương thức unset_userdata().

// Xóa một giá trị session
$this->session->unset_userdata('username');

// Xóa nhiều giá trị session
$this->session->unset_userdata(array('username', 'email'));

3.4 Xóa tất cả dữ liệu session

Để xóa toàn bộ dữ liệu session và làm mới session, bạn có thể sử dụng phương thức sess_destroy().

$this->session->sess_destroy();

Lệnh này sẽ xóa tất cả dữ liệu session và khởi động lại session mới.


4. Flashdata

Flashdata là một tính năng đặc biệt trong CodeIgniter cho phép bạn lưu trữ dữ liệu session chỉ tồn tại trong yêu cầu HTTP kế tiếp, sau đó nó sẽ tự động bị xóa. Điều này rất hữu ích khi bạn cần truyền thông báo (message) hoặc dữ liệu tạm thời giữa các trang mà không muốn dữ liệu này tồn tại lâu hơn.

4.1 Thiết lập Flashdata

Để thiết lập flashdata, bạn sử dụng phương thức set_flashdata().

// Thiết lập flashdata
$this->session->set_flashdata('message', 'Đăng nhập thành công');

4.2 Truy xuất Flashdata

Để truy xuất flashdata, bạn sử dụng phương thức flashdata().

// Truy xuất flashdata
$message = $this->session->flashdata('message');
echo $message;  // In ra: Đăng nhập thành công

4.3 Giữ flashdata cho yêu cầu tiếp theo

Nếu bạn muốn giữ flashdata tồn tại thêm một yêu cầu HTTP nữa, bạn có thể sử dụng phương thức keep_flashdata().

$this->session->keep_flashdata('message');


5. Cấu hình bảo mật cho session

5.1 Xác thực IP

CodeIgniter có thể kiểm tra địa chỉ IP của người dùng để đảm bảo rằng session không bị chiếm dụng từ một địa chỉ IP khác. Điều này có thể được bật trong file config.php:

$config['sess_match_ip'] = TRUE;

5.2 Mã hóa dữ liệu session

Để tăng tính bảo mật, bạn có thể mã hóa dữ liệu session trước khi lưu trữ vào cookie. Điều này được bật sẵn trong CodeIgniter nếu bạn sử dụng session dựa trên cơ sở dữ liệu hoặc memcached/redis.

5.3 Thay đổi ID session

Để tránh tấn công session fixation, bạn có thể cấu hình để thay đổi ID session định kỳ, đảm bảo rằng ID session của người dùng không bị cố định. Bạn có thể cấu hình điều này trong file config.php:

$config['sess_time_to_update'] = 300;  // Đổi ID session sau mỗi 300 giây


6. Các tình huống sử dụng thư viện Session

6.1 Lưu trữ thông tin đăng nhập

Session thường được sử dụng để lưu trữ thông tin người dùng đã đăng nhập, chẳng hạn như ID người dùng, tên đăng nhập, và trạng thái đăng nhập (logged_in).

// Thiết lập thông tin người dùng sau khi đăng nhập thành công
$session_data = array(
    'user_id'   => $user_id,
    'username'  => $username,
    'logged_in' => TRUE
);
$this->session->set_userdata($session_data);

6.2 Lưu trữ giỏ hàng trong thương mại điện tử

Một ứng dụng phổ biến khác của session là lưu trữ dữ liệu giỏ hàng cho các ứng dụng thương mại điện tử.

// Thêm sản phẩm vào giỏ hàng
$cart = $this->session->userdata('cart');
$cart[] = array(
    'product_id' => 123,
    'quantity'   => 2,
    'price'      => 50000
);
$this->session->set_userdata('cart', $cart);


7. Tóm lại là

Thư viện Session trong CodeIgniter là một công cụ mạnh mẽ và linh hoạt giúp bạn dễ dàng quản lý dữ liệu phiên người dùng. Từ việc lưu trữ thông tin đăng nhập, giỏ hàng cho đến quản lý flashdata, thư viện này cung cấp đầy đủ các tính năng cần thiết để làm việc với session trong các ứng dụng web.

Bạn có thể mở rộng và tùy chỉnh session theo nhu cầu của mình bằng cách cấu hình và sử dụng các phương thức phù hợp. Điều quan trọng là luôn luôn đảm bảo rằng session của bạn được bảo mật, đặc biệt là trong các ứng dụng yêu cầu đăng nhập hoặc quản lý thông tin nhạy cảm.

Xử lý xoá Cookie Session mặc định tạo bởi Request từ trình duyệt

Để xử lý vấn đề về việc session lưu trong thư mục ../php/sessions có thể làm đầy dung lượng sau một thời gian sử dụng, bạn có thể thay đổi tên cookie session mặc định từ ci_session sang một tên khác (ví dụ: vne_session) mà không ảnh hưởng đến session đăng nhập của người dùng. Điều này giúp bạn quản lý session tốt hơn và tránh việc cookie mặc định (ci_session) gây đầy dung lượng.

Dưới đây là hướng dẫn chi tiết cách thực hiện:


1. Thay đổi tên Cookie Session mặc định

CodeIgniter sử dụng một cấu hình session cookie mặc định có tên là ci_session. Bạn có thể thay đổi tên này trong file /application/config/config.php.

  • Mở file /application/config/config.php và tìm đến dòng cấu hình sess_cookie_name:
$config['sess_cookie_name'] = 'ci_session';  // Tên mặc định của session cookie

  • Để thay đổi tên của session cookie, bạn chỉ cần thay đổi giá trị này thành một tên khác, chẳng hạn như vne_session:
$config['sess_cookie_name'] = 'vne_session'; // Đổi tên session cookie thành vne_session

Với việc thay đổi này, CodeIgniter sẽ sử dụng vne_session làm tên cookie mới cho session, giúp phân biệt các phiên đăng nhập của người dùng với các session mặc định.


2. Xóa session mặc định ci_session

Nếu bạn muốn xóa cookie session mặc định ci_session sau khi đã thay đổi thành tên mới (ví dụ: vne_session), bạn có thể thực hiện điều này một cách thủ công thông qua code. Dưới đây là cách để xóa cookie ci_session nhưng vẫn giữ lại session đăng nhập với tên mới vne_session.

2.1 Xóa session ci_session một cách thủ công

Bạn có thể sử dụng hàm set_cookie() của PHP hoặc của chính CodeIgniter để xóa cookie session ci_session.

Ví dụ trong CodeIgniter, bạn có thể sử dụng hàm set_cookie():

// Xóa cookie 'ci_session'
delete_cookie('ci_session');

Hoặc sử dụng cú pháp PHP để hủy session cookie:

// Xóa cookie PHP session
if (isset($_COOKIE['ci_session'])) {
    unset($_COOKIE['ci_session']); 
    setcookie('ci_session', '', time() - 3600, '/'); // Xóa cookie bằng cách đặt thời gian hết hạn đã qua
}

2.2 Xóa file session trên server

Trong một số trường hợp, nếu bạn cấu hình session để lưu trữ trong file (tức là sử dụng sess_driver = 'files'), bạn có thể cần phải xóa các file session cũ được lưu trữ trong thư mục ../php/sessions. CodeIgniter không tự động xóa các file session cũ, vì vậy bạn có thể sử dụng một cron job để định kỳ xóa chúng.

Ví dụ, sử dụng lệnh sau để xóa các file session cũ hơn 7 ngày trên server:

find /path/to/php/sessions -type f -mtime +7 -delete

Lệnh trên sẽ tìm và xóa tất cả các file session cũ hơn 7 ngày trong thư mục /path/to/php/sessions.


3. Sử dụng Session đăng nhập với tên mới (vne_session)

Sau khi thay đổi tên cookie session thành vne_session, bạn có thể tiếp tục sử dụng session trong ứng dụng của mình như bình thường mà không ảnh hưởng đến hoạt động đăng nhập của người dùng. Tất cả các session liên quan đến người dùng sẽ được lưu trữ trong cookie vne_session.

3.1 Thiết lập session đăng nhập

Bạn vẫn có thể lưu trữ thông tin đăng nhập người dùng trong session với cookie mới vne_session:

// Thiết lập thông tin người dùng sau khi đăng nhập thành công
$session_data = array(
    'user_id'   => $user_id,
    'username'  => $username,
    'logged_in' => TRUE
);
$this->session->set_userdata($session_data);

Dữ liệu session trên sẽ được lưu vào cookie vne_session thay vì ci_session.

3.2 Kiểm tra trạng thái đăng nhập

Để kiểm tra xem người dùng có đang đăng nhập hay không, bạn có thể sử dụng dữ liệu session như bình thường, và session sẽ được lưu trong cookie vne_session:

// Kiểm tra trạng thái đăng nhập
if ($this->session->userdata('logged_in')) {
    echo "Người dùng đã đăng nhập";
}


4. Quản lý Session an toàn và hiệu quả

4.1 Giới hạn thời gian tồn tại của session

Bạn có thể kiểm soát thời gian session tồn tại bằng cách cấu hình sess_expiration trong file config.php. Điều này giúp giảm dung lượng file session lưu trữ trên server:

$config['sess_expiration'] = 7200; // Session sẽ hết hạn sau 2 giờ (7200 giây)

4.2 Thay đổi định kỳ session ID

Để tránh tấn công session fixation (giữ cố định session ID), bạn có thể cấu hình để định kỳ thay đổi ID session, đảm bảo tính bảo mật:

$config['sess_time_to_update'] = 300; // Thay đổi ID session sau mỗi 300 giây

4.3 Sử dụng session dựa trên cơ sở dữ liệu

Thay vì lưu trữ session vào file hệ thống, bạn có thể cấu hình để lưu session vào cơ sở dữ liệu. Điều này giúp bạn dễ dàng quản lý session và tránh làm đầy dung lượng server. Cấu hình trong config.php:

$config['sess_driver'] = 'database';
$config['sess_save_path'] = 'ci_sessions'; // Tên bảng lưu trữ session

Bạn sẽ cần tạo một bảng session trong cơ sở dữ liệu như đã hướng dẫn ở trên.


5. Kết luận

Bằng cách thay đổi tên session cookie từ ci_session thành vne_session, bạn có thể tránh được việc session cookie mặc định làm đầy dung lượng hệ thống. Đồng thời, bạn cũng có thể quản lý session đăng nhập người dùng với tên cookie khác mà vẫn đảm bảo tính bảo mật và hiệu quả.

Ngoài ra, việc xóa cookie session cũ và định kỳ dọn dẹp file session trên server sẽ giúp bạn kiểm soát dung lượng tốt hơn, đặc biệt trong các hệ thống lớn với nhiều người dùng.