Hướng dẫn
Quảng cáo

Hướng dẫn chi tiết về PHP Sessions

Bạn chưa bao giờ sử dụng PHP Sessions và bạn muốn bắt đầu? Hoặc có thể bạn đã sử dụng chúng nhưng bạn muốn hiểu rõ hơn về cách chúng hoạt động?

Nếu như vậy thì hướng dẫn này chính là dành cho bạn.

Trong bài đăng này, bạn sẽ tìm thấy phần giới thiệu đơn giản nhưng đầy đủ về Session trong PHP với một số ví dụ về cách sử dụng chúng, phân tích sâu hơn về các chức năng quan trọng nhất và một số thông tin thực tế về bảo mật mà bạn nên biết.

PHP SESSION LÀ GÌ VÀ BẠN CÓ THỂ LÀM GÌ VỚI CHÚNG? 

Trước khi xem tiếp bạn có thể đọc qua bài hướng dẫn về Session trong PHP trong phần hướng dẫn lập trình PHP

Mục đích chính của PHP Sessions là thiết lập liên kết trạng thái giữa trang web và máy khách từ xa, với khả năng lưu giữ thông tin trên các kết nối máy khách tiếp theo.

Bằng cách sử dụng Sessions (Phiên), bạn có thể liên kết một tập hợp các biến với máy khách đang truy cập tập lệnh PHP của mình và tự động khôi phục các biến tương tự vào lần tiếp theo cùng một máy khách sẽ kết nối lại.

Ví dụ: Sessions có thể được sử dụng trong các trang web thương mại điện tử để ghi nhớ những mặt hàng mà mỗi khách hàng đã bỏ vào giỏ hàng hoặc trong các trang web được bảo vệ bằng mật khẩu để biết liệu khách hàng đang cố truy cập trang web đã được xác thực hay chưa.

Trong những trường hợp ví dụ này, lần đầu tiên khách hàng truy cập trang web, Sessionsmới sẽ được bắt đầu . Sau đó, tập lệnh PHP của trang web có thể lưu một số biến cùng với Sessions, ví dụ: những mặt hàng nào đã được đưa vào giỏ hàng hoặc giá trị boolean cho biết liệu thông tin xác thực hợp lệ có được khách hàng cung cấp hay không.

Lần tiếp theo cùng một khách hàng truy cập vào trang web, Sessionscủa nó sẽ được khôi phục cùng với tất cả các biến đã lưu trước đó. Điều này có nghĩa là các tập lệnh PHP của trang web sẽ biết mặt hàng nào đã được đưa vào giỏ hàng hoặc liệu khách hàng có được phép truy cập trang web được bảo vệ hay không.

Bây giờ hãy xem cách sử dụng Session trong thực tế.

CƠ BẢN VỀ PHP SESSIONS

Sessions được bật theo mặc định trong hầu hết các cài đặt PHP. Mọi tập lệnh PHP đều có thể sử dụng Sessions, tập lệnh dòng lệnh (command line scripts) là ngoại lệ duy nhất có liên quan (lý do là Sessions sử dụng cookie để xác định người dùng từ xa, không có sẵn trong môi trường CLI ).

Sử dụng Sessions rất đơn giản.

Điều đầu tiên bạn cần làm trong tập lệnh PHP của mình là bắt đầu Sessions bằng hàm session_start() . Mỗi máy khách từ xa đều có Sessions riêng và  session_start()  sẽ đảm nhiệm việc kiểm tra xem Sessions đã được bắt đầu cho máy khách hiện được kết nối hay chưa; trong trường hợp đó Sessions của nó được khôi phục, nếu không thì một Sessions (phiên) mới sẽ được tạo.

Sau khi bắt đầu Sessions, mảng siêu toàn cầu $_SESSION sẽ khả dụng . Đây là nơi bạn có thể lưu trữ tất cả các biến liên quan của Sessions , vì tất cả các biến trong mảng này sẽ được lưu và truy xuất vào lần tiếp theo cùng một máy khách sẽ kết nối.

Về cơ bản, đây là tất cả những gì bạn cần biết để bắt đầu sử dụng Sessions , ít nhất là khi bắt đầu.

Bây giờ hãy xem một ví dụ cơ bản.

Giả sử bạn muốn biết khách hàng hiện đang kết nối đã truy cập trang của bạn bao nhiêu lần. Để làm được điều đó, trước tiên bạn cần xác định khách hàng, sau đó bạn cần theo dõi xem chính khách hàng đó đã kết nối với trang của bạn bao nhiêu lần.

Việc nhận dạng khách hàng từ xa được thực hiện tự động chỉ bằng cách bắt đầu Sessions với session_start() .

Điều đó cũng sẽ tạo ra mảng siêu toàn cầu $_SESSION , một nơi mà tất cả dữ liệu của Sessions có thể được lưu trữ và truy xuất. Mỗi máy khách từ xa khác nhau có mảng $_SESSION riêng , được tạo và điền đúng cách mỗi khi cùng một máy khách truy cập trang của bạn.

Việc theo dõi các lần truy cập trang của từng khách hàng chỉ là vấn đề bắt đầu Sessions và sử dụng biến số bên trong mảng $_SESSION . Ví dụ: bạn có thể sử dụng $_SESSION['visits'] cho mục đích đó.

Việc sử dụng một biến thông thường như $visits sẽ không hiệu quả vì nó sẽ bị hủy khi kết thúc quá trình thực thi tập lệnh và không bao giờ được truy xuất.

Lần đầu tiên khách hàng truy cập trang, mảng $_SESSION sẽ trống và khóa 'visits' sẽ không tồn tại. Trong trường hợp này bạn cần khởi tạo nó thành 0, nếu không bạn chỉ cần tăng nó lên 1.

Ví dụ

<?php
/* Start the Session */
session_start();
/* Check whether we already set 'visits' for this remote client */
if (!array_key_exists('visits', $_SESSION))
{
   $_SESSION['visits'] = 0;
}
echo 'You visited this page ' . $_SESSION['visits']++ . ' times.';

Rất dễ dàng phải không?

Hãy xem một ví dụ cơ bản khác. Giả sử bạn có một trang riêng tư và bạn chỉ muốn hiển thị nội dung của nó cho những khách hàng được ủy quyền. Máy khách từ xa phải cung cấp người dùng và mật khẩu thích hợp để xem nội dung của trang.

Nếu máy khách từ xa không được xác thực thì tập lệnh PHP sẽ hiển thị biểu mẫu đăng nhập, nếu không nó sẽ hiển thị nội dung riêng tư.

Một cách để làm điều đó là luôn  kiểm tra người dùng và mật khẩu, nhưng điều đó sẽ buộc khách hàng phải cung cấp chúng trong chuỗi yêu cầu mỗi khi truy cập trang.
Thay vào đó, bạn muốn khách hàng cung cấp thông tin xác thực chỉ một lần và sau đó có thể truy cập trực tiếp vào nội dung riêng tư.

Điều này có thể được thực hiện dễ dàng với Phiên

 

Ghi chú: Đây không phải là cách thích hợp để xác thực người dùng mà chỉ là một ví dụ về cách Phiên hoạt động!

Ví dụ

<?php
/* Start the Session */
session_start();
/* Is the client authenticated? */
$auth = FALSE;
/* Check the Session array to see if this client is already authenticated */
if (array_key_exists('auth', $_SESSION))
{
   $auth = TRUE;
}
else
{
   /* Check the request string for user and password */
   $user = '';
   $passwd = '';
   
   if (array_key_exists('user', $_REQUEST))
   {
      $user = $_REQUEST['user'];
   }
   
   if (array_key_exists('passwd', $_REQUEST))
   {
      $passwd = $_REQUEST['passwd'];
   }
   
   /* Example authentication */
   if (($user == 'user') && ($passwd == 'passwd'))
   {
      $auth = TRUE;
      
      /* Save the authorized state in the Session array */
      $_SESSION['auth'] = TRUE;
   }
}
if ($auth)
{
   echo 'Here is your private content.';
}
else
{
   /* Show the login form */
   ?>
   
   Please login:<br>
   <form method="POST">
   <input type="text" name="user">
   <input type="password" name="passwd">
   <input type="submit" value="Log-in">
   </form>
   
   <?php
}

 

Trong ví dụ này, biến boolean $auth được đặt thành TRUE nếu máy khách từ xa được phép truy cập nội dung riêng tư. Điều đó xảy ra trong hai trường hợp: khi máy khách thực sự gửi chuỗi yêu cầu người dùng và mật khẩu và khi biến Phiên $_SESSION['auth'] được đặt.

Khi máy khách từ xa tự xác thực bằng người dùng và mật khẩu, tập lệnh sẽ đặt biến xác thực của Phiên $_SESSION['auth'] . Bằng cách này, khi cùng một khách hàng truy cập lại trang, nó sẽ không phải gửi lại người dùng và mật khẩu, nhưng trạng thái Phiên của nó sẽ “ghi nhớ” rằng nó đã được cấp phép.

Tất nhiên, việc bỏ cài đặt $_SESSION['auth'] sẽ buộc máy khách từ xa gửi lại thông tin đăng nhập của nó.

Bây giờ bạn đã có ý tưởng về cách Session hoạt động trong thực tế.  Hãy chuyển sang phần tiếp theo.

 MỘT SỐ SỰ THẬT QUAN TRỌNG VỀ CÁC PHIÊN

Có một số thông tin quan trọng về Phiên mà bạn nên biết trước khi sử dụng chúng:

  • Các loại biến $_SESSION ($_SESSION variable types): Bạn có thể lưu trữ tất cả các loại biến bên trong mảng toàn cục $_SESSION miễn là chúng có thể tuần tự hóa được . Các loại không thể tuần tự hóa bao gồm các trình xử lý tệp cục bộ và từ xa, tài nguyên kết nối cơ sở dữ liệu,  v.v. Các loại biến này không thể được lưu trữ và truy xuất trong các lần truy cập máy khách tiếp theo.
  • $_SESSION phạm vi ($_SESSION scope):   $_SESSION là một mảng siêu toàn cầu : điều này có nghĩa là nó có thể truy cập được từ mọi nơi bên trong tập lệnh PHP của bạn (bao gồm từ các hàm và lớp bên trong) mà không cần phải khai báo nó trên toàn cục.
  • Cookies: Phiên sử dụng cookie để xác định khách hàng từ xa. Điều đó có nghĩa là Phiên sẽ không hoạt động nếu trình duyệt web của khách hàng không chấp nhận cookie.
  • Khóa phiên (Session locking):  PHP giữ dữ liệu của Phiên bên trong các tệp. Các tập lệnh PHP cần có một khóa độc quyền trên tệp dữ liệu liên quan đến Phiên hiện tại và các tập lệnh khác (hoặc các phiên bản khác của cùng một tập lệnh) không thể có được cùng một khóa trước khi nó được phát hành. Nói cách khác, các tập lệnh được thực thi bởi cùng một máy khách từ xa không thể sử dụng Phiên cùng lúc mà phải đợi tập lệnh trước đó kết thúc. Điều này có thể gây ra sự chậm trễ trong một số trường hợp, chẳng hạn như khi một trang web gửi nhiều kết nối AJAX đồng thời. Trong trường hợp đó, mọi chương trình phụ trợ AJAX (nếu sử dụng Phiên) cần phải đợi phiên trước đó kết thúc trước khi có thể tạo Phiên của riêng mình. Trong chương tiếp theo, bạn sẽ thấy tình trạng này có thể được giảm nhẹ như thế nào.
  • Thời gian tồn tại của cookie phiên (Sessions cookie lifetime):  Một phiên kéo dài bao lâu? Thời gian tồn tại của Phiên là khoảng thời gian tối đa kể từ khi Phiên được tạo lần đầu tiên cho đến khi hết hạn. Khi Phiên hết hạn, tất cả các biến bên trong $_SESSION sẽ bị hủy và mất, đồng thời cookie được sử dụng để nhận dạng khách hàng không còn hợp lệ. Do đó, một Phiên mới phải được tạo. Một máy khách từ xa mới chưa có Phiên và một máy khách từ xa có Phiên hết hạn có thể được xử lý giống nhau miễn là có liên quan đến mã PHP, vì trong cả hai trường hợp, không có Phiên nào tồn tại cho máy khách đó và một phiên mới phải được tạo . Theo mặc định, Phiên sẽ chỉ kéo dài cho đến khi máy khách từ xa đóng trình duyệt của nó. Đây có thể hoặc không phải là cài đặt tốt nhất cho ứng dụng của bạn, tùy thuộc vào cách bạn muốn sử dụng Phiên. Trong chương tiếp theo, bạn sẽ thấy cách thay đổi giá trị này.


HÀM VÀ CÀI ĐẶT PHIÊN

Có nhiều hàm liên quan đến Phiên có thể được sử dụng để tùy chỉnh quy trình làm việc của Phiên nhưng chỉ một số chức năng trong số đó thường được sử dụng trong các tình huống thực tế.

Nhiều hàm trong số này giải quyết các nhu cầu rất cụ thể (như session_reset() khởi tạo lại mảng $_SESSION với các giá trị ban đầu của nó) và việc tìm hiểu tất cả chúng ngay từ đầu sẽ không có ý nghĩa gì. Bạn chỉ có thể đi và kiểm tra chúng khi bạn cần.

Một số hàm khác có liên quan đến bảo mật, ví dụ như session_regenerate_id() , nhưng chúng ta sẽ nói về bảo mật trong chương trước.

Các hàm liên quan đến Phiên hữu ích nhất là session_start() , session_name() , session_set_cookie_params()session_write_close() . Đây là những thứ mà bạn có thể sẽ có cơ hội sử dụng.

session_start() 

session_start()  bắt đầu Phiên của máy khách từ xa và cung cấp mảng toàn cục $_SESSION , như đã giải thích. Nếu chưa có Phiên nào tồn tại cho máy khách hiện được kết nối thì một phiên mới sẽ được tạo, nếu không thì phiên hiện tại sẽ được khôi phục.

Hàm này lấy đối số tùy chọn là một mảng các tùy chọn Phiên  ghi đè các tùy chọn mặc định. Chúng ta sẽ sớm xem những lựa chọn nào trong số này đáng được xem xét.

Ngoài ra, mảng tùy chọn được truyền tới session_start() cũng có thể có khóa bổ sung: 'read_and_close' . Nếu tùy chọn này được đặt thành TRUE thì dữ liệu Phiên (tức là mảng $_SESSION ) sẽ ở chế độ chỉ đọc.

Hãy nhớ rằng không thể thực thi nhiều phiên bản của cùng một Phiên cùng một lúc? Tùy chọn này có thể giúp với điều đó. Nếu bạn chỉ cần đọc dữ liệu Session mà không thực hiện bất kỳ thay đổi nào, tùy chọn này sẽ giới hạn thời gian Session lock chỉ ở giai đoạn đọc ban đầu.
Nếu ứng dụng web của bạn có nhiều yêu cầu HTTP đồng thời (thường là lệnh gọi AJAX), thì tùy chọn này có thể hữu ích để tối đa hóa thời gian phản hồi.

Điều quan trọng cần ghi nhớ là session_start() phải được gọi trước khi bất kỳ đầu ra nào được gửi tới trình duyệt . Đây là nguồn lỗi phổ biến, chẳng hạn như nếu tệp PHP có một dòng trống ở đầu.

session_name() 

session_name() thay đổi tên của Phiên hiện tại và tên của Cookie phiên được gửi tới trình duyệt từ xa. Hàm này phải được gọi trước session_start() . Tên mặc định của Phiên là “PHPSESSID”.

Bạn có thể muốn thay đổi tên Phiên của riêng mình để tùy chỉnh giao diện ứng dụng của bạn và cookie mà trình duyệt của khách hàng sẽ nhận được.

Đây là ví dụ về cách đặt tên tùy chỉnh cho Phiên của bạn:  

Ví dụ

<?php
/* Set your Session name */
session_name('MySession');
/* Start the Session */
session_start();
/* Do other things... */

Hãy nhớ rằng khi đóng Phiên (bạn sẽ biết cách thực hiện sau trong bài đăng này), bạn cần xóa cookie thích hợp. Nếu bạn sử dụng tên Phiên tùy chỉnh thì bạn cũng cần sử dụng tên đó để xóa Cookie phiên.

session_set_cookie_params()

Chức năng này đặt một số tùy chọn cho Phiên hiện tại. Nó có thể thiết lập tối đa 5 tùy chọn:

  1. $lifetime: Thời gian tồn tại, tính bằng giây, của Phiên. Đây là một tùy chọn quan trọng: nó cho biết Phiên này sẽ hoạt động trong bao lâu. Vì vậy, nếu bạn đặt giá trị này thành 3600, Phiên này sẽ hết hạn sau một giờ. Điều này có nghĩa là nếu cùng một máy khách từ xa kết nối sau hơn một giờ, thì Phiên mới sẽ được tạo và mảng $_SESSION sẽ trống. Tùy chọn này rất hữu ích, chẳng hạn như để đặt “thời gian chờ đăng nhập”. Thời gian tồn tại tương đối so với lần đầu tiên phiên được tạo, vì vậy ngay cả khi máy khách từ xa truy cập lại trang thì thời gian chờ của phiên sẽ không thay đổi (để thay đổi, bạn cần phải đóng và bắt đầu lại phiên hoặc tăng thời gian tồn tại giá trị). Đặt tùy chọn này thành 0 (không) có ý nghĩa đặc biệt: Phiên sẽ chỉ có hiệu lực cho đến khi khách hàng đóng trình duyệt. Đây cũng là giá trị mặc định.
  2. $path: Đường dẫn trang web nơi Phiên được bật. Ví dụ: nếu URL ứng dụng web của bạn là www.mysite.com/myapp, việc đặt tham số này thành mặc định (“/”) sẽ làm cho Phiên hợp lệ thông qua miền www.mysite.com. Nếu bạn đặt $path thành “myapp”, thì Phiên sẽ chỉ hợp lệ đối với các trang trong đường dẫn www.mysite.com/myapp.
  3. $domain: Tùy chọn này tương tự như tùy chọn trước, nhưng nó đề cập đến chính miền đó. Thông thường bạn muốn để tham số này về giá trị mặc định (tên miền của máy chủ), nhưng bạn có thể thay đổi nó để hạn chế tên miền.
  4. $secure: Nếu tham số này được đặt thành TRUE thì Phiên sẽ chỉ hoạt động trên các kết nối an toàn (ví dụ: HTTPS). Đây là một ý tưởng hay nếu ứng dụng của bạn xử lý dữ liệu nhạy cảm hoặc quan trọng, vì Cookie phiên được gửi qua kết nối không được mã hóa có thể được đọc và sử dụng để chiếm quyền điều khiển Phiên (xem chương cuối để biết thêm chi tiết).
  5. $httponly: Việc đặt tham số này thành TRUE sẽ gửi yêu cầu tới trình duyệt từ xa để chỉ sử dụng Cookie phiên cho các yêu cầu HTTP(S). Điều này có thể cung cấp cho bạn một chút bảo mật bổ sung.

session_write_close()

Việc khai báo hàm này sẽ đóng Phiên, việc này thường được thực hiện tự động khi tập lệnh kết thúc. Điều này hữu ích cho vấn đề khóa mà chúng ta đã nói đến: chức năng này cho phép tập lệnh “giải phóng” khóa Phiên ngay khi có thể, giảm thiểu thời gian các tập lệnh khác phải chờ lấy khóa.

Bạn nên gọi hàm của này khi không cần làm việc với dữ liệu Phiên nữa và tập lệnh của bạn vẫn còn một chút thời gian thực thi.

Bạn cũng có thể tùy chỉnh hành vi của Phiên chung bằng cách thay đổi một số cài đặt mặc định , trên toàn cầu trong tệp cấu hình PHP (chỉnh sửa tệp php.ini ) hoặc trong thời gian chạy.

Danh sách đầy đủ các tùy chọn khá dài, nhưng đây là những tùy chọn bạn nên quan tâm:

  • session.save_path:Tùy chọn này đặt đường dẫn lưu trữ dữ liệu của Phiên thực tế trên hệ thống tệp. Bạn có thể chỉ cần để lại giá trị mặc định (“/tmp” trên hệ thống Linux và *nix), nhưng bạn nên lưu ý rằng đây có thể không phải là tùy chọn tốt nhất để bảo mật. Chúng ta sẽ nói về điều này trong chương cuối cùng về bảo mật.
  • session.name:Tùy chọn này đặt tham số giống như hàm session_name() . Bạn có thể thay đổi tùy chọn này trên toàn cầu để sử dụng tên Phiên tùy chỉnh của mình theo mặc định.
  • session.cookie_lifetime: Tùy chọn này đặt cùng tham số trọn đời mà bạn có thể đặt bằng session_set_cookie_params() . Theo mặc định, Phiên sẽ chỉ hoạt động cho đến khi máy khách từ xa đóng trình duyệt; mặc dù điều này có thể quá hạn chế trong nhiều trường hợp, nhưng cũng đúng là các ứng dụng web khác nhau cần có Thời gian phiên rất khác nhau. Ví dụ: ứng dụng ngân hàng tại nhà có thể giữ nguyên giá trị mặc định, trong khi một dịch vụ ít quan trọng hơn cũng có thể đặt giá trị kéo dài một tuần. Đề xuất của tôi là giữ nguyên mặc định và thay đổi nó khi cần trong thời gian chạy.
  •  session.cookie_pathsession.cookie_domain: Chúng ta đã thấy tùy chọn này trước đây trong tùy chọn session_start() . Nếu bạn luôn sử dụng các giá trị khác với các giá trị mặc định, bạn nên sửa đổi chúng trong cấu hình chung.

CÁCH HỦY MỘT PHIÊN

Phiên sẽ tự động hết hạn sau khi hết thời gian chờ, nhưng bạn cũng có thể muốn đóng phiên đó một cách rõ ràng (ví dụ: khi máy khách “đăng xuất”).

Đóng (hoặc hủy ) Phiên có nghĩa là xóa tất cả các biến bên trong $_SESSION , xóa dữ liệu phía máy chủ (tệp nơi PHP lưu trữ dữ liệu của Phiên) và xóa Cookie phiên khỏi trình duyệt web của khách hàng.

Đây là cách làm:

Ví dụ

<?php
/* First start the Session */
session_start();
/* Unset all $_SESSION variables */
$_SESSION = array();
/* Clear the Session Cookie */
$cookie_par = session_get_cookie_params();
setcookie(session_name(), '', time() - 86400, $cookie_par['path'], $cookie_par['domain'], $cookie_par['secure'], $cookie_par['httponly']);
/* Destroy the session data */
session_destroy();
 

Ghi chú: Lưu ý rằng bạn cần bắt đầu Phiên trước khi có thể hủy phiên.

Việc xóa $_SESSIONS (ở dòng 7) sẽ xóa tất cả các biến Phiên và hàm session_destroy() (ở dòng 14) sẽ xử lý dữ liệu Phiên phía máy chủ.

setcookie() , ở dòng 11, yêu cầu trình duyệt từ xa xóa cookie. Các tham số của cookie được truy xuất bằng  hàm session_get_cookie_params() như được sử dụng trực tiếp trong setcookie() .

 

Ghi chú: Lưu ý rằng việc đặt thời gian chờ của cookie trước đây sẽ khiến trình duyệt từ xa xóa cookie

BẢO MẬT PHIÊN

 Phiên thường được sử dụng cho mục đích xác thực, lưu trữ và cung cấp dữ liệu riêng tư và nhạy cảm cũng như cho các ứng dụng quan trọng khác, vì vậy điều quan trọng là phải hiểu mức độ an toàn thực sự của chúng cũng như cách tối đa hóa bảo mật.

Về vấn đề bảo mật, Phiên có hai điểm yếu lớn: nguy cơ chiếm quyền điều khiển cookie và rò rỉ bộ nhớ.

Hãy xem chúng là loại rủi ro gì và bạn có thể làm gì để giảm thiểu chúng.

Cướp cookie (Cookie Hijacking)

Cướp cookie đề cập đến hành động đánh cắp Cookie phiên và sử dụng nó để truy cập một cách độc hại vào một trang web.

Điều này có thể được thực hiện theo một số cách khác nhau: dò tìm mạng (nếu không sử dụng HTTPS), giành quyền truy cập vật lý hoặc từ xa vào máy tính của khách hàng hoặc khai thác lỗ hổng bảo mật trình duyệt.

Có thể ngăn chặn việc chiếm quyền điều khiển cookie bằng cách sử dụng HTTPS (để tất cả dữ liệu HTTP, bao gồm cả cookie, đều được mã hóa) và bảo mật các máy tính từ xa.

Mặc dù việc sử dụng HTTPS có thể được thực thi bởi chính máy chủ web nhưng bạn không thể làm gì nhiều về bảo mật máy tính của máy khách từ xa.

PHP có một số cách để giảm thiểu vấn đề này, như thay đổi động ID phiên và giữ thời gian tồn tại đủ ngắn.

Một số tùy chọn cấu hình cụ thể có thể giúp tăng cường bảo mật Phiên. Một số trong số chúng đã được đặt theo mặc định, nhưng một số khác thì không. Tôi khuyên bạn nên bật session.use_strict_mode và nếu bạn định chỉ sử dụng HTTPS, thì session.cookie_secure cũng vậy. Hai tùy chọn này (không được bật theo mặc định) sẽ dễ dàng tăng cường bảo mật Phiên mà không có bất kỳ tác dụng phụ liên quan nào.

PHP cũng có các công cụ phức tạp hơn để tiến xa hơn nữa, ví dụ như thay đổi động ID phiên ở mỗi lần lặp (với session_regenerate_id() ), tuy nhiên, việc đẩy bảo mật đi quá xa có thể gây ra các vấn đề khác. Ví dụ: việc thay đổi động ID phiên có thể gây ra sự cố với AJAX vì ID phiên có thể thay đổi giữa nhiều yêu cầu HTTP không đồng bộ, cắt bỏ một số yêu cầu trong số đó.

Ngay cả với tất cả các tính năng bảo mật mà PHP cung cấp, Phiên chỉ có thể được bảo mật ở một mức nhất định và không thể đạt được mức bảo mật rất cao chỉ sử dụng Phiên.

Nếu ứng dụng của bạn cần mức độ bảo mật cao thì bạn chỉ phải sử dụng một tập hợp con các chức năng của Phiên, ví dụ: chỉ giữ Phiên mở cho đến khi máy khách từ xa đóng trình duyệt của nó. Một số dữ liệu rất quan trọng thậm chí phải được giữ hoàn toàn bên ngoài phạm vi của Phiên và phải yêu cầu truy xuất người dùng và mật khẩu một cách rõ ràng.

Bạn có nhận thấy một số dịch vụ (như Google) yêu cầu lại mật khẩu của bạn khi bạn cố truy cập một số dữ liệu nhạy cảm, ngay cả khi bạn đã đăng nhập không? Điều này xảy ra do cookie mà trình duyệt của bạn sử dụng để đăng nhập không đủ an toàn cho dữ liệu đó và cần phải có xác thực phù hợp (với tên người dùng và mật khẩu).

Rò rỉ lưu trữ

Rủi ro bảo mật lớn thứ hai liên quan đến việc lưu trữ. Theo mặc định, PHP lưu dữ liệu Phiên của nó bên trong /tmp (trên các hệ thống *nix như Linux), đây là thư mục mà mọi người dùng hệ thống đều có thể đọc. Điều này thực sự không an toàn lắm và bạn chỉ nên sử dụng một thư mục mà chỉ máy chủ web có thể đọc được.

Tuy nhiên, bạn nên nhớ rằng dữ liệu Phiên chỉ có thể an toàn như chính máy chủ, vì vậy ngay từ đầu bạn nên tránh giữ dữ liệu nhạy cảm bên trong các biến của Phiên.

Đây cũng là một trong những lý do tôi không thích sử dụng Phiên để xác thực người dùng. Trong hướng dẫn xác thực người dùng, tôi lưu trữ cookie trên cơ sở dữ liệu (mã hóa chúng trong quy trình), do đó không có cách nào lấy cắp cookie đăng nhập từ máy chủ (hoặc thậm chí từ máy chủ SQL, vì chỉ có hàm băm được lưu trữ).

Để tối đa hóa tính bảo mật, dữ liệu của Phiên phải được lưu trữ bên trong một thư mục mà chỉ máy chủ web mới có thể đọc được  và bên ngoài thư mục gốc của web . Điều này rất quan trọng, nếu không các tệp của Phiên có thể được đọc từ Internet. 

Có thể có nhiều cách khác để cải thiện bảo mật lưu trữ, chẳng hạn như sử dụng hệ thống tệp được mã hóa hoặc SAN (mạng vùng lưu trữ), nhưng ý kiến ​​của tôi là nếu bạn đang xử lý các ứng dụng quan trọng như vậy thì tốt hơn hết là không nên dựa vào Phiên trong lần đầu tiên. hơn là cố gắng đảm bảo chúng vượt xa mức có thể hợp lý.

Hướng dẫn này kết thúc ở đây, tôi hy vọng nó có thể hữu ích cho bạn. Nếu bạn có bất kỳ câu hỏi nào, vui lòng hỏi trong phần bình luận bên dưới  và nếu bạn thích hướng dẫn này, vui lòng dành chút thời gian để chia sẻ nó!

Bài viết này đã giúp ích cho bạn?

Bài viết mới

Advertisements