Trong môi trường trình duyệt Internet Explorer (ở mức bảo mật mặc định), các thẻ như <iframe>, <img>, hay <link> chỉ gửi cookie thuộc miền gốc (first-party cookies), trong khi tự động chặn cookie từ miền khác (third-party cookies). Khi một thẻ như vậy trỏ đến tài nguyên trên miền khác — ví dụ: tải một script từ www.a.com trong trang của www.b.com — trình duyệt sẽ thực hiện yêu cầu HTTP GET, nhưng bất kỳ header Set-Cookie nào trả về từ miền đích đều bị IE bỏ qua nếu thiếu cơ chế chấp thuận chính sách riêng tư.
Đây là lúc tiêu chuẩn P3P (Platform for Privacy Preferences) phát huy tác dụng. Bằng cách gửi header P3P hợp lệ trong phản hồi HTTP, IE sẽ coi yêu cầu là "đáng tin cậy" hơn và cho phép thiết lập cookie ngay cả khi nguồn yêu cầu nằm ngoài miền hiện tại.
Ví dụ triển khai cụ thể
Miền phụ www.b.com — nơi khởi tạo yêu cầu:
<?php
// Tạo chuỗi nhận dạng mã hóa (không phải hash một chiều) để truyền thông tin đăng nhập
$authToken = base64_encode('user:secret123'); // hoặc dùng openssl_encrypt với khóa cố định
echo "<script src='http://www.a.com/set_auth.php?token={$authToken}'></script>";
?>Miền chính www.a.com — xử lý và thiết lập cookie:
<?php
// set_auth.php
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
header('Content-Type: application/javascript');
if (isset($_GET['token'])) {
$raw = base64_decode($_GET['token']);
list($username, $password) = explode(':', $raw, 2);
// Lưu vào cookie với domain chung (nếu có cấu hình *.a.com hoặc dùng domain cha)
setcookie('auth_user', $username, [
'expires' => time() + 3600,
'path' => '/',
'domain' => '.a.com', // chú ý dấu chấm đầu để áp dụng cho tất cả subdomain
'secure' => false, // bật nếu dùng HTTPS
'httponly' => true,
'samesite' => 'None'
]);
}
?>Kiểm tra kết quả trên www.a.com/index.php:
<?php
print_r($_COOKIE); // Sẽ hiển thị 'auth_user' nếu thiết lập thành công
?>Lưu ý: P3P chỉ còn hiệu lực trên các phiên bản cũ của IE (IE6–IE11) và đã bị loại bỏ hoàn toàn trong Edge hiện đại cũng như Chrome/Firefox. Giải pháp thay thế hiện đại nên dựa vào SameSite=None; Secure, CORS kết hợp với xác thực qua JWT hoặc session token được chia sẻ qua backend (ví dụ: dùng Redis hoặc database tập trung).