PHP – Filtered unserialize()

Trong PHP, hàm tích hợp unserialize() có sẵn từ phiên bản PHP 4 trở đi. Với PHP 7, một điều khoản để truyền danh sách các lớp được phép đã được thêm vào. Điều này cho phép lọc ra các nguồn không đáng tin cậy. Hàm unserialize() chỉ giải mã dữ liệu từ các lớp đáng tin cậy.

Trong PHP, serialization có nghĩa là tạo ra một đại diện có thể lưu trữ của một giá trị. Điều này rất hữu ích cho việc lưu trữ hoặc truyền các giá trị PHP mà không làm mất loại và cấu trúc của chúng. Hàm serialize() được tích hợp sẵn được sử dụng cho mục đích này.

serialize(mixed $value): string

Hàm unserialize() trả về một giá trị PHP từ đại diện đã được tuần tự hóa. Từ PHP 7 trở đi, hàm unserialize() tuân theo định dạng dưới đây −

unserialize(string $data, array $options = [ ]): mixed

Tham số $data là chuỗi đã được tuần tự hóa mà bạn muốn giải tuần tự hóa.

Tham số $options đã được giới thiệu mới. Nó là một mảng liên kết với các khóa sau −

Sr.No Name & Description
1 allowed_classes an array of class names which should be accepted, or false to accept no classes, or true to accept all classes. Omitting this option is the same as defining it as true
2 max_depth The maximum depth of structures permitted during unserialization.

Example

Hãy xem xét ví dụ sau −

<?php
   class MyClass { 
      var int $x;
      function __construct(int $x) {
         $this->x = $x;
      }
   }
   class NewClass {
      var int $y;
      function __construct(int $y) {
         $this->y = $y;
      }
   }

   $obj1 = new MyClass(10);
   $obj2 = new NewClass(20);

   $sob1 = serialize($obj1);
   $sob2 = serialize($obj2);

   // default behaviour that accepts all classes
   // second argument can be ommited.
   // if allowed_classes is passed as false, unserialize converts all objects into __PHP_Incomplete_Class object
   $usob1 = unserialize($sob1 , ["allowed_classes" => true]);

   // converts all objects into __PHP_Incomplete_Class object except those of MyClass and NewClass
   $usob2 = unserialize($sob2 , ["allowed_classes" => ["MyClass", "NewClass"]]);

   echo $usob1->x . PHP_EOL;
   echo $usob2->y . PHP_EOL;
?>

Nó sẽ tạo ra output

10
20