0

PHP và MySQL Bài 15: Cookie trong PHP - Lưu trữ dữ liệu phía trình duyệt và Bài toán "Nhớ mặt" người dùng

Trong thế giới mạng, giao thức HTTP hoạt động theo nguyên tắc "Không trạng thái" (Stateless). Điều này có nghĩa là mỗi khi bạn gửi một yêu cầu lên máy chủ (click vào một link, submit một form), máy chủ sẽ xử lý, trả về kết quả, và sau đó... quên sạch bạn là ai.

Đối với máy chủ, mỗi cú click chuột của bạn giống như một người hoàn toàn xa lạ vừa mới bước vào cửa hàng. Vậy làm thế nào để các hệ thống web có thể nhớ được bạn đã đăng nhập, nhớ được ngôn ngữ bạn chọn, hay nhớ được giao diện Dark Mode mà bạn đã cài đặt?

Giải pháp đầu tiên chính là Cookie.


1. Cookie là gì và Hoạt động như thế nào?

Cookie là một mẩu dữ liệu nhỏ (thường dưới 4KB) được máy chủ (Server) tạo ra và gửi về cho trình duyệt (Client). Trình duyệt sẽ lưu mẩu dữ liệu này vào ổ cứng của máy tính người dùng.

Từ thời điểm đó trở đi, mỗi khi trình duyệt gửi một yêu cầu mới lên cùng một trang web, nó sẽ tự động "đính kèm" gói Cookie đó mang theo. Nhờ vậy, máy chủ đọc được Cookie và nhận ra: "À, đây là anh khách quen vừa đổi giao diện sang màu tối".


2. Cách khởi tạo Cookie bằng setcookie()

Trong PHP, chúng ta sử dụng hàm setcookie() để ra lệnh cho trình duyệt lưu trữ một Cookie.

Cú pháp đầy đủ: setcookie(name, value, expire, path, domain, secure, httponly);

  • name (Bắt buộc): Tên của Cookie.
  • value (Bắt buộc): Giá trị lưu trữ.
  • expire: Thời điểm Cookie bị hủy (định dạng Unix Timestamp). Nếu bỏ trống, Cookie sẽ tự xóa khi người dùng đóng trình duyệt.
  • path: Thư mục trên server mà Cookie có hiệu lực (thường để "/" để dùng cho toàn trang).
  • domain: Tên miền (Ví dụ: example.com).
  • secure: Nếu true, Cookie chỉ được truyền qua đường dẫn mã hóa HTTPS.
  • httponly: Nếu true, Cookie sẽ không thể bị đánh cắp bởi mã độc JavaScript (Chống XSS).

Ví dụ: Lưu lại tùy chọn giao diện (Theme) trên hệ thống Dashboard giám sát của người dùng.

<?php
    // Lưu ý cực kỳ quan trọng: setcookie() PHẢI được gọi trước khi 
    // có bất kỳ đoạn mã HTML hoặc lệnh echo nào được in ra màn hình.

    $tenCookie = "dashboard_theme";
    $giaTri = "dark_mode";
    
    // Đặt thời gian sống cho Cookie là 30 ngày (30 ngày * 24 giờ * 60 phút * 60 giây)
    $thoiGianSong = time() + (30 * 24 * 60 * 60);
    
    // Bật cờ HttpOnly để bảo mật
    setcookie($tenCookie, $giaTri, $thoiGianSong, "/", "", false, true);
    
    echo "Đã lưu tùy chọn giao diện thành công!";
?>

3. Cách đọc Cookie với $_COOKIE

Khi trình duyệt gửi Cookie lên, PHP sẽ tự động gom tất cả chúng vào một biến siêu toàn cục (Superglobal) là mảng $_COOKIE. Bạn chỉ cần dùng tên Cookie làm "Khóa" (Key) để lấy ra giá trị.

<?php
    // Luôn phải kiểm tra xem Cookie có tồn tại không trước khi đọc
    if (isset($_COOKIE["dashboard_theme"])) {
        $giaoDienHienTai = $_COOKIE["dashboard_theme"];
        
        if ($giaoDienHienTai === "dark_mode") {
            echo "<body style='background-color: #333; color: white;'>";
            echo "<h1>Hệ thống đang ở chế độ ban đêm.</h1>";
        } else {
            echo "<body style='background-color: #FFF; color: black;'>";
            echo "<h1>Hệ thống đang ở chế độ ban ngày.</h1>";
        }
    } else {
        echo "Bạn chưa cài đặt giao diện, hệ thống sử dụng mặc định.";
    }
?>

4. Cách xóa Cookie

Máy chủ không thể chủ động "chọc" vào máy tính của người dùng để xóa file Cookie. Cách duy nhất để xóa một Cookie là ghi đè lên nó bằng một Cookie cùng tên, nhưng thiết lập thời gian sống (expire) lùi về quá khứ.

Khi trình duyệt nhận được một Cookie có thời gian sống ở quá khứ, nó sẽ tự động tiêu hủy file đó ngay lập tức.

<?php
    // Ghi đè Cookie 'dashboard_theme' với thời gian lùi về 1 giờ trước (-3600 giây)
    setcookie("dashboard_theme", "", time() - 3600, "/");
    
    echo "Đã khôi phục giao diện về mặc định (Xóa Cookie).";
?>

5. Những giới hạn chết người của Cookie (Cảnh báo Bảo mật)

Là một Backend Developer, bạn tuyệt đối không được lạm dụng Cookie vì những lý do sau:

  • Người dùng có thể sửa đổi: Cookie được lưu trữ hoàn toàn trên máy tính của người dùng dưới dạng văn bản thuần túy (Plain text). Họ có thể dễ dàng bấm F12 > tab Application và sửa đổi giá trị bên trong.
  • Quy tắc tử thần: TUYỆT ĐỐI KHÔNG lưu trữ thông tin nhạy cảm như Mật khẩu, Số dư tài khoản, Quyền hạn (Admin/User), hay ID của người dùng trực tiếp vào Cookie. Nếu bạn lưu role=user vào Cookie, hacker chỉ việc đổi thành role=admin là chiếm được quyền hệ thống.
  • Giới hạn dung lượng: Mỗi Cookie chỉ lưu được khoảng 4KB dữ liệu. Trình duyệt cũng giới hạn mỗi trang web chỉ được tạo tối đa từ 20-50 Cookies.
  • Tốn băng thông: Bất kỳ tệp tin tĩnh nào (hình ảnh, CSS, JS) khi được trình duyệt yêu cầu tải về, nó đều gửi kèm toàn bộ mảng Cookie lên Server. Nếu Cookie quá lớn, đường truyền mạng của hệ thống sẽ bị lãng phí nghiêm trọng.

Tổng kết Bài 15

Cookie là công cụ tuyệt vời để lưu các "tùy chọn cá nhân không quan trọng" (như ngôn ngữ, giao diện, sản phẩm vừa xem) vì nó giúp giảm tải cho cơ sở dữ liệu của Server.

Tuy nhiên, với hạn chế chết người về mặt bảo mật, chúng ta không thể dùng Cookie để duy trì trạng thái đăng nhập bảo mật cho hệ thống. Để giải quyết bài toán cốt lõi này, các lập trình viên sử dụng một kỹ thuật lưu trữ an toàn hơn nằm ở phía máy chủ.

Đó chính là nội dung của bài học tiếp theo: Bài 16: Session trong PHP - Quản lý đăng nhập và phiên làm việc bảo mật.


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.