Quản lý session và bảo mật (CSRF, XSS)

Tạo bởi Hoàng Vũ, chỉnh sửa cuối lúc 3 tháng 4, 2025

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 CSRFXSS.

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.
Website Logo

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.

Bình luận

Website Logo

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

Chúng Tôi Trên

Bạn đang muốn học về lập trình website?

Bạn cần nâng cao kiến thức chuyên nghiệp hơn để nâng cao cơ hội nghề nghiệp? Liên hệ