Cookie và Session trong PHP
- 09-03-2023
- Toanngo92
- 0 Comments
Mục lục
Khái niệm cookie
Một cookie trong thế giới Web và mạng máy tính, là một đoạn dữ liệu nhỏ chứa thông tin hữu ích (có thể hình dung đây là một chuỗi). Cookie cho phép Trang web lưu trữ thông tin người dùng.
Các trang web lưu trữ thông tin người dùng trong cơ sở dữ liệu để theo dõi các lượt truy cập của họ. Tuy nhiên, có những người dùng không đăng ký với Trang web nhưng thường xuyên truy cập Trang web. Cookies được sử dụng để lưu trữ thông tin tạm thời của những khách truy cập đó.
Một ví dụ khác là trang web mua sắm trực tuyến, nơi người dùng chọn một vài sản phẩm và thêm chúng vào giỏ hàng. Sau đó, người dùng điều hướng đến trang tiếp theo và chọn các sản phẩm bổ sung. Trong tình huống như vậy, lựa chọn của người dùng phải được lưu trữ trước khi người dùng điều hướng đến trang tiếp theo. Mặc dù người dùng chưa hoàn thành giao dịch, Trang web lưu trữ dữ liệu trong một biến gọi là cookie.
Thông thường, cookie là một mẩu dữ liệu nhỏ chỉ xác định thông tin của người dùng nơi người dùng được kết nối với mạng máy tính. Các giá trị trong cookie có thể được tạo và truy xuất thông qua PHP hoặc javascript. Chúng được tạo ở phía máy chủ Web hoặc máy khách và được lưu trữ ở trình duyệt Web của máy khách.
Các trang web lưu trữ hai loại dữ liệu là tạm thời và vĩnh viễn. Thông tin tạm thời được lưu trữ trong cookie trong một khoảng thời gian quy định. Dữ liệu vĩnh viễn được lưu trữ trong cookie trong một khoảng thời gian nhất định và sau đó, thông tin cần thiết sẽ được lưu trong cơ sở dữ liệu. Các trang web sử dụng hai loại cookie như sau:
persistent (lâu dài) | non-persistent (tạm thời/không lâu dài) |
Tồn tại trong trình duyệt Web trong một khoảng thời gian được chỉ định tại thời điểm tạo ra nó | Bị xóa khỏi trình duyệt Web ngay khi người dùng thoát khỏi trình duyệt |
Vì cookie là các tệp văn bản được lưu trên máy khách nên chúng rất hữu ích cho mục đích theo dõi.
Các bước xác định người dùng cũ:
B1: Các tập lệnh máy chủ web gửi qua một bộ cookie tới Trình duyệt web. Ví dụ: tên người dùng, tuổi, sản phẩm yêu thích, giỏ hàng … | B2: Trình duyệt web lưu dữ liệu nhận được (cookie) trên máy cục bộ của người dùng | B3: Sau đó, khi máy chủ web nhận được yêu cầu từ trình duyệt web, nó sẽ xác định người dùng bằng cookie đã lưu được chia sẻ trước đó. |
Các trang web có thể sử dụng cookie để xác định:
- Số lần người dùng đã truy cập Website
- Số lượng khách truy cập mới
- Số lượng người dùng thường xuyên
- Tần suất người dùng truy cập Website
- Ngày người dùng truy cập Trang web lần cuối
- Cài đặt trang web tùy chỉnh cho người dùng (vd: light mode/dark mode)
Khi người dùng truy cập Trang web lần đầu tiên, máy chủ Web sẽ tạo một ID duy nhất và gửi ID trong cookie tới trình duyệt Web. Trình duyệt lưu trữ cookie và gửi lại trang web trong các yêu cầu tiếp theo. Máy chủ Web chỉ có thể đọc thông tin được lưu trữ trong cookie khi nó liên quan đến Trang web. Tuổi thọ của cookie phụ thuộc vào ngày và giờ hết hạn. Cookie được lưu trữ trên ổ cứng trong trình duyệt của máy tính người dùng. Điều này cho phép Trang web theo dõi người dùng truy cập Trang web. Thông tin về người dùng thường được lưu trữ trong cặp name-value.
PHP hỗ trợ cookie HTTP. Lưu ý: phải luôn sử dụng cookie PHP trước thẻ HTML
Cài đặt cookie với PHP
Cookie được kết hợp trong response header và HTTP request. Cài đặt cookie có nghĩa là gửi cookie tới trình duyệt. Xem thêm bài viết Services communicate và khái niệm REST API để hiểu hơn về HTTP Request.
Máy chủ web và trình duyệt Web gửi cookie cho nhau trong HTTP Headers. Máy chủ web gửi cookie đến trình duyệt trong trường header set_cookie. Trường này là một phần của HTTP response. Trình duyệt Web lưu trữ cookie và sử dụng cookie đó trong các request tiếp theo tới cùng một máy chủ Web.
Nói chung, các HTTP headers được sử dụng để cài đặt cookie. Chúng cũng có thể được cài đặt trực tiếp trên trình duyệt Web với sự trợ giúp của JavaScript.
Ví dụ cách header được gửi qua tập lệnh PHP có thể cài đặt cookie:
HTTP/1.1 200 OK
Date: Wed, 08 Dec 2021 21:03:38 GMT
Server: Apache/1.3.9 (UNIX) PHP/4.0b3
Set-Cookie: name=examplecookie; expires=Wednesday, 08-Dec-21 22:0:
GMT
path=/; domain=example.com
Connection: close
Content-Type: text/html
Phần Set-Cookie của header này chứa cặp name-value (cả hai đều được mã hóa URL), ngày GMT, đường dẫn và miền (domain).
Trình duyệt Web, khi được định cấu hình để lưu cookie, sẽ lưu giữ dữ liệu cho đến một ngày nhất định (Wednesday, 08-Dec-2021 21:03:38 GMT). Nó sẽ quên thông tin này sau khi hết thời gian quy định. Trường hết hạn chứa ngày cho đến khi dữ liệu phải được trình duyệt ghi nhớ. Cookie sẽ được gửi lại máy chủ, nếu người dùng trỏ trình duyệt Web vào bất kỳ trang Web nào giống với đường dẫn cookie và tên miền.
Ví dụ cách header hiển thị cookie như sau:
GET /HTTP/1.0
Connection: Keep-Alive
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X x.
xv:42.0) Gecko/20100101 Firefox/42.0Host: hype.viz.co.uk:1126
Accept: image/jpeg, */*
Accept-Encoding: gzip
Accept-Language: en
Accept-Charset: iso-8859-1,*,utf-8
Cookie: name=examplecookie
Khi tiêu đề trình duyệt Web được cài đặt, tập lệnh PHP sẽ có quyền truy cập vào cookie trong các biến môi trường. $_COOKIE hoặc $_HTTP_COOKTE _VARS[]) là một biến siêu toàn cục chứa tất cả các tên và giá trị cookie. Quyền truy cập vào cookie hiển thị ở ví dụ này có thể được cung cấp bằng cách sử dụng $HTTP_COOKIE_VARS[‘name’]
Hàm setcookie() trong PHP
Trong PHP, cookie có thể được đặt bằng phản hồi HTTP bằng cách sử dụng hàm setcookie(). Khi cookie được đặt, biến siêu toàn cầu $_COOKIE được sử dụng để truy cập cookie. Sau đây là cú pháp để thiết lập cookie:
Cú pháp:
setcookie ( string Sname [, string $value [, int $expire = 0 [,
string $path{, string $domain [, bool $secure = false [, bool $h
ttponly = false ]]]]}] )
Ví dụ về hàm setcookie() để xác định tên và giá trị như sau:
setcookie("sale_item", "Denim Jeans");
Ví dụ sau cho thấy cách đặt thời hạn cho cookie bằng hàm time():
setcookie("sale_item", "JohnDoe", time() + 3600, "/");
Truy xuất giá trị cookie bằng PHP $_COOKIE
Trong những cách PHP cho phép truy cập vào cookie, cách đơn giản nhất là sử dụng biến $_COOKIE hoặc biến $HTTP_COOKIE_VARS. $_COOKIES là một biến siêu toàn cục trong PHP và được sử dụng để truy xuất giá trị của cookie.
Cú pháp:
$val = $_COOKIE["cookie_name"];
Ví dụ:
if (isset($_COOKIE["sale_item"])) {
echo "The value of the sale_item cookie is: " . $_COOKIE["sale_item"];
} else {
echo "The sale_item cookie has not been set.";
}
// output: JohnDoe
Lưu ý: để cookie được nhận, chúng ta cần tải lại trang nếu tác vụ set cookie và get cookie thực hiện trên cùng 1 trang. Lý do: khi khởi tạo cookie bằng ngôn ngữ PHP, cookie được gửi từ trình duyệt lên server. Tuy nhiên lúc này tất cả mã nguồn đã được tải và tới dòng lệnh kiểm tra cookie, cookie vẫn chưa tồn tại vì chưa có bước server kiểm tra lại cookie của trình duyệt.
Làm việc với Cookies trong PHP.
Bên cạnh việc tạo cookie như trong các ví dụ được mô tả, chúng ta cũng có thể sửa đổi và xóa cookie bằng các hàm khác nhau.
Sửa đổi Cookie
Hàm setcookie() không chỉ được sử dụng để tạo cookie mà còn có thể được sử dụng để sửa đổi cookie. Cú pháp:
setcookie (name, value, expire, path, domain, secure, httponly);
Khi bạn muốn cập nhật một cookie hiện có với một giá trị mới, bạn nên thêm ‘/’ vào đối số thứ tư là đối số ‘path’, để ngăn việc tạo một cookie khác có cùng tên.
// Set the initial value of the cookie
setcookie("sale_item", "JohnDoe", time() + 3600, "/");
// Modify the value and expiration time of the cookie
setcookie("sale_item", "JaneDoe", time() + 7200, "/");
Xóa Cookie:
Hàm setcookie() cũng được sử dụng để xóa cookie trong PHP với ngày hết hạn đã qua (cookie quá hạn). Sau một khoảng thời gian nhất định, cookie được đề cập bên trong hàm setcookie() sẽ tự động bị xóa.
Ví dụ:
setcookie("sale_item", "", time() - 3600, "/");
Kiểm tra xem Cookie có tồn tại hay không
Đôi khi, một số trình duyệt nhất định có thể được định cấu hình để tắt cookie. Ngày nay, do những lo ngại về quyền riêng tư, người dùng cuối có thể không đồng ý lưu trữ cookie trên máy của họ. Điều này có nghĩa là nếu họ từ chối quyền truy cập để lưu trữ cookie, thì tập lệnh PHP có cookie của bạn sẽ không hoạt động.
Hàm isset() hoặc empty() được sử dụng để kiểm tra xem cookie có tồn tại hoặc đã được đặt hay không. Nếu được đặt, cookie sẽ được bật bởi trình duyệt. Nếu không, trình duyệt sẽ vô hiệu hóa cookie.
if(isset($_COOKIE["sale_item"])){
echo "Cookie named 'sale_item' exists!";
} else {
echo "Cookie named 'sale_item' does not exist!";
}
Làm việc với Session (Phiên) trong PHP
Xét tình huống người dùng mở một ứng dụng, thực hiện một số chỉnh sửa và sau đó đóng ứng dụng. Điều này tương tự như phiên Web dành cho người dùng. Máy tính xác định người dùng là ai và khoảng thời gian mà người dùng đã đăng nhập, trong khi người dùng đang làm việc trên một ứng dụng.
Tuy nhiên, trên Internet, vì địa chỉ HTTP không duy trì trạng thái này, máy chủ Web không thể nhận ra người dùng và chi tiết sử dụng. Để ghi lại dữ liệu này, PHP cung cấp khái niệm session giúp lưu trữ và chuyển thông tin từ trang con này sang trang con khác cùng miền cho đến khi người dùng đóng trang web/trình duyệt.
Cookie và Session
Cookie cho phép lưu trữ dữ liệu vào một biến và truy cập nó trên tất cả các trang của Trang web. Cookie dễ gặp rủi ro bảo mật vì thông tin người dùng được lưu ở đầu máy khách. Rủi ro liên quan sẽ lớn hơn khi người dùng truy cập Trang web từ máy tính công cộng hoặc máy tính dùng chung.
Ngoài ra, một số nhược điểm khác của việc sử dụng cookie như sau:
- Xóa cookie – Người dùng có thể dễ dàng xóa cookie khỏi trình duyệt máy khách, vì Cookie được tạo trong các thư mục tệp tạm thời. Người dùng thường xóa các tệp Internet tạm thời để cải thiện hiệu suất của hệ thống. Khi đó, website cần cấp phát một cookie mới cho người dùng.
- Nhiều cookie cho cùng một người dùng – Cookie cho phép Trang web xác định người dùng theo máy tính của họ. Trang web phân bổ một cookie khác cho cùng một người mỗi khi người dùng truy cập Trang web từ các máy tính khác nhau.
- Số liệu thống kê của Trang web ghi lại một mục nhập người dùng mới cho cùng một người sử dụng một máy tính khác. Ngoài ra, người dùng phải đặt lại tất cả các tùy chọn trên các máy tính khác nhau để truy cập cùng một Trang web.
- Kích thước của cookie – Lượng thông tin được lưu trữ trong cookie xác định kích thước của cookie. Kích thước của cookie ảnh hưởng tới kích thước của trang Web khi trình duyệt tải trang. Do đó, kích thước của trang Web tăng lên khi một lượng lớn thông tin được lưu trữ trong cookie. Việc tăng kích thước tệp của trang Web dẫn đến hiệu suất kém.
- Cookies bị vô hiệu hóa – Trang web lưu trữ cookie trên đĩa cứng của khách hàng. Điều này làm giảm hiệu suất của máy tính có dung lượng bộ nhớ thấp. Để cải thiện hiệu suất của những máy tính như vậy, người dùng tắt cookie. Điều này làm cho quá trình chỉ định cookie trở nên vô nghĩa.
Sự khác biệt chính giữa cookie và session là cookie thích hợp lưu trữ thông tin trên máy tính cục bộ, trong khi phiên cho phép PHP lưu trữ thông tin trên máy chủ Web. Bảng dưới đây mô tả sự khác biệt giữa cookie và session:
Cookies | Sessions |
Lưu trữ thông tin người dùng trên hệ thống máy khách (Web Browser) | Lưu trữ thông tin người dùng trên máy chủ (Web Server) |
Khả dụng ngay cả sau khi người dùng thoát khỏi trình duyệt Web | Bị hủy khi người dùng thoát khỏi trình duyệt Web |
Người dùng có thể tắt cookie | Người dùng không thể tắt session |
Có giới hạn kích thước | Không giới hạn kích thước |
Sử dụng session
Cách tiếp cận sử dụng các session PHP là phổ biến trong các trang web mua sắm bán lẻ nơi thông tin được lưu trữ thường xuyên và thông tin về giỏ hàng được chuyển từ trang này sang trang khác. Ví dụ: tên người dùng, các sản phẩm được chọn vào giỏ hàng, v.v. được lưu trữ và chuyển từ trang con này sang trang con khác cùng miền.
Đối với mọi trình duyệt Web, một id người dùng duy nhất được tạo bởi một phiên PHP, để ghi nhớ và nhận dạng người dùng, đồng thời để tránh tranh chấp/xung đột giữa nhiều trình duyệt Web.
Các biến session lưu thông tin người dùng để sử dụng trên nhiều trang con và chúng được duy trì cho đến khi người dùng đóng trình duyệt Web. Đối với một ứng dụng, các biến session có sẵn cho tất cả các trang. Họ lưu thông tin về một người dùng.
Các biến session đăng đăng ký và các giá trị của chúng được lưu trữ trong một file (tệp tin) được tạo bởi một phiên. Tệp này được tạo trong một thư mục tạm thời trên máy chủ Web. Dữ liệu được lưu sẽ có sẵn cho tất cả các trang trên trang web trong lần truy cập đó. Có thể lấy vị trí của tệp tạm thời này bằng cách đặt đường dẫn có tên là session_path.save trong tệp php.ini. Đường dẫn này cần được thiết lập trước khi sử dụng bất kỳ biến session nào.
Các tác vụ xảy ra khi một phiên bắt đầu:
B1: PHP tạo một mã định danh duy nhất cho phiên; Đây là một chuỗi ngẫu nhiên gồm 32 chữ số thập lục phân. Ví dụ: 4ad52c3f7d1e98b9168ecb1fa528235a | B2: Cookie PHPSESSID được tự động gửi đến máy tính của người dùng để lưu chuỗi định danh phiên duy nhất | B3: Một tệp được tạo tự động trên máy chủ Web trong thư mục tạm thời được chỉ định mang tên của mã định danh duy nhất. Ví dụ: sess_4ad52c3f7d1e98b9168ecb1fa528235a |
PHP tự động truy xuất chuỗi mã định danh phiên duy nhất từ cookie PHPSESSID khi tập lệnh PHP yêu cầu một giá trị từ biến session.
Sau đó, nó kiểm tra trong thư mục tạm thời của nó để tìm tệp có cùng tên để có thể thực hiện xác minh bằng cách đối chiếu cả hai giá trị. Máy chủ Web thường kết thúc một phiên làm việc sau một khoảng thời gian định trước (thường là 30 phút) nếu người dùng không làm mới trang Web trong ứng dụng. Một phiên cũng bị chấm dứt khi người dùng mất kết nối trình duyệt Web hoặc rời khỏi trang Web.
Vòng đời session PHP
3 giai đoạn trong vòng đời của một phiên dựa trên giao tiếp giữa trình duyệt Web và máy chủ Web, như sau:
- bắt đầu session
- Đăng ký biến session
- kết thúc session
Bắt đầu session & đăng ký biến session
Một phiên PHP bắt đầu bằng việc gọi hàm session_start(). Trước tiên, chức năng này kiểm tra xem một phiên đã bắt đầu chưa, nếu chưa thì nó sẽ bắt đầu một phiên.
Lệnh gọi hàm session_start() nên được đặt ở đầu trang Web (khi cấu trúc html chưa được tải).
Mảng associative $_SESSION[] lưu các biến session như các phần tử con của mảng, có thể được truy cập trong suốt thời gian tồn tại của phiên thông qua key(index).
Mỗi khi trang Web được truy cập trong phiên, biến được gọi là counter sẽ tăng lên. Biến này được đăng ký vào đầu phiên.
Hàm isset() hoặc empty() có thể sử dụng kiểm tra xem biến session đã được đặt chưa.
Cú pháp:
bool session_start(void)
Biến toàn cục $_SESSION được sử dụng để truy vấn các biến session được lưu trữ. Ví dụ:
<?php
// start the session
session_start();
// set a session variable
$_SESSION["username"] = "john";
// retrieve the session variable
$username = $_SESSION["username"];
// unset a session variable
unset($_SESSION["username"]);
// destroy the session
session_destroy();
?>
Trong ví dụ này, chúng ta bắt đầu phiên sử dụng hàm session_start(). Sau đó, chúng ta đặt một biến phiên gọi là “tên người dùng” bằng cách sử dụng mảng siêu toàn cục $_SESSION. Chúng ta lấy giá trị của tên người dùng bằng cách gán nó cho một biến có tên $username.
Để hủy biến phiên, chúng ta sử dụng hàm unset() và truyền vào tên của biến mà chúng ta muốn hủy làm tham số.
Cuối cùng, để hủy phiên hoàn toàn và xóa tất cả dữ liệu liên quan, chúng ta sử dụng hàm session_destroy().
Ví dụ 2:
<?php
session_start(); //Starting the session
// Checking if session variable is already set
if(isset($_SESSION['username'])){
echo "Welcome back " . $_SESSION['username']; // Displaying the welcome message
} else {
header("location: login.php"); // Redirecting to login page
}
?>
<!-- Sample HTML code after checking sessions -->
<!DOCTYPE html>
<html>
<head>
<title>Welcome</title>
</head>
<body>
<h1>Welcome Page</h1>
<p>Access granted. You are now logged in.</p>
<a href="logout.php">Logout</a>
</body>
</html>
Lưu ý: Câu lệnh gọi hàm session_start() phải luôn là câu lệnh đầu tiên của tệp php, xuất hiện trước khi viết bất kỳ thẻ HTML nào.
Truy xuất giá trị biến session
Ví dụ cách truy xuất giá trị biến session:
<?php
session_start(); // This begins the session
// Retrieve the session variable values
$studentname = $_SESSION["studentname"];
$studentid = $_SESSION["studentid"];
?>
<html>
<body>
<?php
echo "Student name is: ".$studentname."<br/>";
echo "Student id is: ".$studentid; // $ missing here
?>
</body>
</html>
Trong tình huống này, hàm session_start() được gọi mặc dù không có biến mới nào được đặt trong biến session. Lý do là, session_start() khởi tạo một phiên mới (hoặc tìm nạp phiên đang diễn ra nếu đã bắt đầu), Biến toàn cầu $_SESSION được sử dụng để đặt các giá trị mới vào phiên hoặc trả về các giá trị đã lưu.
Hủy session – kết thúc session
Hàm dựng sẵn session_unset() loại bỏ tất cả các giá trị đã lưu khỏi biến phiên và làm sạch biến phiên. Tuy nhiên, bản thân phiên sẽ vẫn hoạt động. Hàm session_destroy() hủy toàn bộ phiên hiện tại.
Ví dụ session_unset():
// Start session
session_start();
// Set session variables
$_SESSION['name'] = 'John';
$_SESSION['age'] = 30;
// Unset a session variable
unset($_SESSION['age']);
// Display the remaining session variable(s)
echo "Name: ".$_SESSION['name'];
echo "Name: ".$_SESSION['age'];
// output:
// Name: John
// Notice: Undefined index: age in /path/to/your/file.php on line 11
Ví dụ session_destroy():
// Start session
session_start();
// Set session variables
$_SESSION['name'] = 'John';
$_SESSION['age'] = 30;
// Destroy the session
session_destroy();
// Attempt to display a session variable
echo "Name: ".$_SESSION['name'];
//output:
// Notice: Undefined variable: _SESSION
Sửa đổi biến session
Việc cập nhật/sửa đổi một giá trị được lưu hoặc lưu trữ trong biến session khá dễ dàng. Bắt đầu phiên bằng cách gọi hàm session_start() và sau đó, chỉ cần ghi đè giá trị mới lên giá trị cũ trong biến session.
Ví dụ:
// Start the session
session_start();
// Set some initial values
$_SESSION['username'] = 'johndoe';
$_SESSION['email'] = 'johndoe@example.com';
// Modify the session values
$_SESSION['username'] = 'janedoe';
$_SESSION['email'] = 'janedoe@example.com';
// Display the updated values
echo "Username: ".$_SESSION['username']."<br>";
echo "Email: ".$_SESSION['email'];
Bật phiên tự động
PHP tạo điều kiện tự động bắt đầu phiên thông qua cài đặt biến boolean tích hợp, session.auto_start. Giá trị của biến này chỉ định liệu module session có tự động bắt đầu phiên theo yêu cầu trang hay không.
Khi người dùng truy cập một Trang web, nếu session.auto_start đã được cài đặt thì phiên sẽ tự động bắt đầu và không cần gọi hàm start_session() để bắt đầu phiên.
Theo mặc định, nó được đặt thành 0, có nghĩa là tính năng bắt đầu phiên tự động bị tắt.
Sử dụng Session khi không bật Cookie
Nếu người dùng không muốn cookie được lưu trữ trên máy cục bộ của mình, thì ID phiên (SID) có thể được gửi tới trình duyệt thông qua một phương pháp thay thế. Hằng số SID là một chuỗi chứa tên phiên và ID được xác định khi phiên bắt đầu có thể được sử dụng trong những trường hợp như vậy. Hàm tích hợp session_id() có thể truy xuất id phiên cho phiên hiện tại. Nó có thể được nhúng vào URL như cách truyền tham số thông thường.
Ví dụ:
<?php
error_reporting(0);
$sess_id = session_id();
if (empty($sess_id)) {
session_start();
}
if (!isset($_SESSION['counter'])) {
$_SESSION['counter'] = 1;
} else {
$_SESSION['counter']++;
}
$msg = "Number of times you checked this page in this session: ".$_SESSION['counter'];
echo $msg;
?>
<p>
<a href="example.php?id=<?php echo htmlspecialchars(session_id()); ?>">Click this link to continue</a>
</p>
Bài tập
Bài tập:
1. Xây dựng 1 bảng products, users và thêm khoảng 10 bản ghi mẫu cho products, 1 bản ghi lưu user admin
2. Trang chủ giao diện như hình
3. Trong admin có tính năng thêm/sửa/xóa dữ liệu sản phẩm
4.Có các tính năng giỏ hàng, mua hàng