Quản lý session và bảo mật (CSRF, XSS)
Bảo mật là một trong những yếu tố quan trọng nhất khi phát triển ứng dụng web. CodeIgniter cung cấp các cơ chế để quản lý Session, Cookie và bảo vệ ứng dụng khỏi CSRF (Cross-Site Request Forgery) cũng như XSS (Cross-Site Scripting).
Mục tiêu bài học:
- Làm việc với Session và Cookie trong CodeIgniter.
- Hiểu và bảo vệ ứng dụng khỏi CSRF.
- Ngăn chặn XSS khi xử lý dữ liệu đầu vào của người dùng.
- Thực hành: Bảo vệ form đăng nhập khỏi CSRF và XSS.

Quản lý session và bảo mật
1. Làm việc với Session và Cookie trong CodeIgniter
Khởi tạo và sử dụng Session
CodeIgniter hỗ trợ Session để lưu trạng thái người dùng trong ứng dụng.
Cấu hình session:
File cấu hình session nằm trong app/Config/Session.php
(CI4) hoặc application/config/config.php
(CI3).
Mặc định, CodeIgniter sử dụng session lưu trên file, có thể đổi sang database để bảo mật hơn:
public $driver = 'database'; // Thay vì 'file'
public $savePath = 'ci_sessions'; // Tên bảng trong database
Cần tạo bảng ci_sessions
nếu dùng database để lưu session.
Lưu và truy xuất dữ liệu từ Session
Lưu thông tin vào Session:
session()->set([
'user_id' => 1,
'username' => 'admin',
'logged_in' => true
]);
Lấy dữ liệu từ Session:
$username = session()->get('username');
echo "Xin chào, $username!";
Xóa session (Đăng xuất):
session()->destroy();
Quản lý Cookie trong CodeIgniter
Tạo Cookie:
setcookie("username", "admin", time() + 3600, "/");
Lấy Cookie:
echo $_COOKIE['username'];
Xóa Cookie:
setcookie("username", "", time() - 3600, "/");
Lưu ý: Tránh lưu thông tin nhạy cảm như mật khẩu trong Cookie vì dễ bị đánh cắp.
2. Bảo vệ ứng dụng khỏi CSRF (Cross-Site Request Forgery)
CSRF là gì?
CSRF (Cross-Site Request Forgery) là kiểu tấn công trong đó hacker gửi yêu cầu giả mạo thay mặt người dùng mà không có sự đồng ý của họ.
Kích hoạt bảo vệ CSRF trong CodeIgniter
Trong CodeIgniter 4, CSRF được kích hoạt mặc định trong app/Config/Filters.php
:
public $globals = [
'before' => [
'csrf' // Bật CSRF protection
]
];
Nếu sử dụng CodeIgniter 3, mở application/config/config.php
và bật CSRF:
$config['csrf_protection'] = TRUE;
Thêm CSRF Token vào Form
Khi CSRF protection bật, cần thêm token vào form:
Ví dụ: Form đăng nhập có CSRF token
<form action="<?= base_url('login') ?>" method="post">
<?= csrf_field(); ?> <!-- Tạo CSRF Token -->
<label>Email:</label>
<input type="email" name="email" required>
<label>Password:</label>
<input type="password" name="password" required>
<button type="submit">Đăng nhập</button>
</form>
3. Ngăn chặn XSS (Cross-Site Scripting)
XSS là gì?
XSS (Cross-Site Scripting) là cuộc tấn công trong đó hacker chèn mã JavaScript độc hại vào trang web của bạn.
Ví dụ XSS Attack:
<input type="text" name="comment" value="<script>alert('Hacked!');</script>">
Nếu trang web không lọc đầu vào, đoạn JavaScript trên sẽ được chạy và có thể đánh cắp cookie của người dùng.
Cách chống XSS trong CodeIgniter
Lọc dữ liệu đầu vào bằng esc()
$username = esc($this->request->getPost('username'));
Dùng htmlspecialchars()
để mã hóa ký tự đặc biệt
$username = htmlspecialchars($this->request->getPost('username'), ENT_QUOTES, 'UTF-8');
Bật bảo vệ XSS khi tải dữ liệu (CI3)
Trong application/config/config.php
, bật bảo vệ XSS:
$config['global_xss_filtering'] = TRUE;
Sử dụng phương thức purify()
với HTML Purifier để làm sạch dữ liệu
Cài đặt HTML Purifier qua Composer:
composer require ezyang/htmlpurifier
Sử dụng:
use HTMLPurifier;
use HTMLPurifier_Config;
$config = HTMLPurifier_Config::createDefault();
$purifier = new HTMLPurifier($config);
$clean_data = $purifier->purify($this->request->getPost('comment'));
Cách này dùng khi cần cho phép nhập HTML an toàn (VD: bài viết, bình luận).
4. Thực hành: Bảo vệ form đăng nhập khỏi CSRF và XSS
1. Bảo vệ CSRF:
-
Bật CSRF protection trong
Filters.php
. -
Thêm
csrf_field()
vào form đăng nhập.
2. Ngăn chặn XSS:
-
Lọc dữ liệu đầu vào bằng
esc()
. -
Dùng
htmlspecialchars()
để xử lý đầu vào. - Sử dụng HTML Purifier để làm sạch dữ liệu HTML.
Kết luận
Tóm tắt nội dung chính
- Quản lý Session và Cookie trong CodeIgniter.
- Bảo vệ ứng dụng khỏi CSRF bằng CSRF Token.
- Ngăn chặn XSS bằng cách lọc dữ liệu đầu vào.
- Thực hành bảo vệ form đăng nhập khỏi CSRF & XSS.

Với hơn 10 năm kinh nghiệm lập trình web và từng làm việc với nhiều framework, ngôn ngữ như PHP, JavaScript, React, jQuery, CSS, HTML, CakePHP, Laravel..., tôi hy vọng những kiến thức được chia sẻ tại đây sẽ hữu ích và thiết thực cho các bạn.
Xem thêm

Chào, tôi là Vũ. Đây là blog hướng dẫn lập trình của tôi.
Liên hệ công việc qua email dưới đây.
lhvuctu@gmail.com