01/10/2018, 15:33

Bài 14: PHP – Sessions

Một cách thay thế để tạo dữ liệu có thể truy cập xuyên qua các page khác nhau trong toàn bộ website là sử dụng Session. Một session tạo một file trong thư mục tạm trên server nơi được đăng ký biến session và giá trị của chúng được lưu trữ. Dữ liệu này có giá trị cho tất cả các page trên site ...

Một cách thay thế để tạo dữ liệu có thể truy cập xuyên qua các page khác nhau trong toàn bộ website là sử dụng Session.

Một session tạo một file trong thư mục tạm trên server nơi được đăng ký biến session và giá trị của chúng được lưu trữ. Dữ liệu này có giá trị cho tất cả các page trên site trong quá trình visit, tức là khi trình duyệt còn mở.

Vị trí file tạm được xác định bằng cách cài đặt trong file php.ini được gọi là session.save_path. Trước khi sử dụng bất kỳ biến session hãy chắc chắn là bạn đã cài đặt đường dẩn lưu trữ nó.

Mặc định khi ta cài server thì nó sẽ có thêm thư mục tạm và file session sẽ được lưu trử trong thư mục đó.

Như mở file php.ini của tôi ra nó cài đặt đường dẩn mặc định như sau: session.save_path=”E:xampp mp”

Bạn nên định lại một nơi an toàn dù chạy local hay trên live site để tránh trường hợp thư mục lưu trử session bị mất dữ liệu vì một nguyên nhân nào khác hay một chức năng khác của hệ thống tác động đến.

Khi một session bắt đầu thì điều gì sẽ xãy ra:

  • Trước tiên PHP sẽ tạo một chuỗi 32 số hexadecimal như : 3c7foj34c3jj973hjkop2fc937e3443
  • Một cookie gọi PHPSESSID một cách tự động gửi tới máy tính người dùng để lưu trữ chuỗi session duy nhất
  • Một file được tạo tự động trên server trong thư mục tạm và mang tên duy nhất với bắt đầu bằng sess_, như trên thì là sess_3c7foj34c3jj973hjkop2fc937e3443

Khi đoạn mã PHP muốn rút trích giá trị từ biến session, PHP tự động lấy chuỗi session duy nhất từ PHPSESSID , sau đó tìm chúng trong thư mục tạm cho tập tin mang tên bạn đưa vào.

Một session sẽ kết thúc khi người dùng đóng trình duyệt or tắt site. Server sẽ kết thúc session sau khi một khoảng thời gian định trước, thường là 30 phút.

Start Session

Với PHP thật dể dàng để start một session bằng cách gọi session_start(). Hàm này trước tiên sẽ kiễm tra nếu session đã start rồi và nếu không thì nó sẽ khởi tạo. Các bạn nên đặt hàm này ở đầu của trang web, thường nằm trong file header, index.

Các biến session được lưu trữ trong mảng kết hợp gọi là $_SESSION[]. Nếu bạn có nhiều session thì khi chúng ta in ra $_SESSION sẽ thấy một mãng dữ liệu session bao gồm các cặp giá trị: tên session và giá trị lưu trữ cho session đó. Biến $_SESSION có thể được truy cập trong thời gian sống của session.

Ví dụ sau start một session sau đó đăng ký một biến gọi là counter để tăng sau mổi lần page được truy cập (visited).

Để chắc chắn session tồn tại khi truy cập ta dùng hàm isset()

Đặt đoạn mã sau trong file php của bạn test.php chẳng hạn và load file này nhiều lần để xem kết quả nhé

<?php

   session_start();

   if( isset( $_SESSION[‘counter’] ) ) {

      $_SESSION[‘counter’] += 1;

   }else {

      $_SESSION[‘counter’] = 1;

   }

   $msg = “You have visited this page “.  $_SESSION[‘counter’];

   $msg .= “in this session.”;

?>

<html>

   <head>

      <title>Setting up a PHP session</title>

   </head>

   <body>

      <?php  echo ( $msg ); ?>

   </body>

</html>

Hủy  Session

PHP cung cấp hàm session_destroy() để hủy toàn bộ session, hàm này không cần đối số j cả. Bạn gọi nó chạy là toàn bộ session sẽ hủy hết. Nếu bạn chỉ muốn hủy một session riêng biệt nào đó thì ta dùng unset(), hàm này bạn phải truyền vào là session bạn muốn hủy.

<?php   unset($_SESSION[‘counter’]);?>

Hủy hết :

<?php   session_destroy();?>

Bật tự động start Session

Nếu chúng ta quên và bật session_start() nhiều lần thì sẽ bị cảnh báo hoặc lổi, để khỏi phải bị như thế có một cách khác để bật session start tự động là ta set nó trong php.ini với session.auto_start =1 . Khi user visit web của mình thì nó sẽ start session lên.

Sessions khi không có cookies

Có thể có trường hợp ở máy user không cho phép lưu trữ cookies, vô tình hay cố ý. Vì thế website của chúng ta sẽ không thể hoạt động session ở những máy đó được, để khắc phục vấn đề này chúng ta sẽ sử dụng hằng số SID thay thế. Hằng số này được định nghĩa nếu session đã start.

Hãy đưa mã SID lên url sẽ khắc phục được vấn đề này.

Như ví dụ ở trên cứ mổi lần bạn reload trình duyệt thì session sẽ được tăng lên 1 đơn vị. Bây giờ bạn vào trong mục cài đặt của trình duyệt và vô hiệu hóa cookie đi, rồi thực hiện lại ví dụ ở trên bạn sẽ thấy biến session không thể hoạt động, tức là nó không tăng lên được.

Giả sử thực hành trên firefox, bạn vô hiệu cookie như màn hình sau:

session

Rồi bây giờ chúng ta thế đoạn mã ví dụ trên bằng đoạn mã sau:

<?php

   session_start();

   if (isset($_SESSION[‘counter’])) {

      $_SESSION[‘counter’] += 1;

   }else {

      $_SESSION[‘counter’] =1;

   } 

   $msg = “You have visited this page “.  $_SESSION[‘counter’];

   $msg .= “in this session.”;  

   echo ( $msg );

?>

<p>

   To continue  click following link <br />

   <a  href = “index.php?<?php echo htmlspecialchars(SID); ?>”>refesh</a>

</p>

Ra trình duyệt reload lại, tốt nhất là đóng trình duyệt rồi mở lại, bạn sẽ thấy giá trị session là 1, reload tiếp vẩn không đổi, nhưng khi nhấn vào link refesh thì giá trị biến session sẽ tăng, vì nó đã đưa hằng số SID lên url, khi cookie không gửi được session id lên server thì nó sẽ đọc hằng số session id đi kèm trên url.

session_1

Ta dùng htmlspecialchars() để khi in SID nhằm ngăn chặn tấn công XSS. Bạn sẽ được học trong bài các cách hack và bảo mật cơ bản với PHP và MySQL.

Như vậy là bạn đã trùm session rồi :).

0