PHP - Lọc khi unserialize()
Giới thiệu
Xin chào! Chào mừng bạn đến với hành trình vào thế giới lập trình PHP. Hôm nay, chúng ta sẽ cùng tìm hiểu sâu về một chủ đề có thể rất thú vị và đôi khi hơi đáng sợ đối với người mới bắt đầu: unserialize()
với bộ lọc. Nhưng đừng lo lắng, tôi sẽ hướng dẫn bạn từng bước, đảm bảo bạn hiểu rõ mọi thứ trên đường đi.
serialization là gì?
Trước khi chúng ta nhảy vào unserialize()
, hãy cùng hiểu qua về serialization là gì. Serialization là quá trình chuyển đổi một đối tượng hoặc cấu trúc dữ liệu thành định dạng có thể lưu trữ hoặc truyền tải và sau đó khôi phục lại. Trong PHP, điều này thường được thực hiện bằng cách sử dụng hàm serialize()
.
$data = array('a', 'b', 'c');
$serialized_data = serialize($data);
echo $serialized_data; // Xuất: a:3:{i:0;s:1:"a";i:1;s:1:"b";i:2;s:1:"c";}
Trong ví dụ trên, chúng ta có một mảng $data
được serialize thành một chuỗi bằng serialize()
. Chuỗi kết quả sau đó có thể được lưu trữ trong cơ sở dữ liệu hoặc gửi qua mạng.
Unserialization là gì?
Unserialization là quá trình ngược lại của serialization. Nó lấy một chuỗi đã được serialize và chuyển đổi nó trở lại thành hình thức ban đầu. Trong PHP, điều này được thực hiện bằng cách sử dụng hàm unserialize()
.
$serialized_data = 'a:3:{i:0;s:1:"a";i:1;s:1:"b";i:2;s:1:"c";}';
$data = unserialize($serialized_data);
print_r($data); // Xuất: Array ( [0] => a [1] => b [2] => c )
Trong ví dụ này, chúng ta lấy chuỗi đã được serialize $serialized_data
và chuyển đổi nó trở lại thành một mảng bằng unserialize()
.
Bộ lọc là gì?
Bây giờ, hãy nói về bộ lọc. Khi bạn làm việc với dữ liệu đã được unserialize, việc đảm bảo dữ liệu an toàn và hợp lệ là rất quan trọng. Đây là lúc các bộ lọc vào cuộc. Bộ lọc cho phép bạn chỉ định các quy tắc bổ sung về cách dữ liệu nên được xử lý trong quá trình unserialize.
Có hai loại bộ lọc chính có sẵn trong PHP:
-
Options: Những này được sử dụng để kiểm soát hành vi của
unserialize()
. Ví dụ, bạn có thể sử dụng tùy chọnUNSERIALIZE_THROW_ON_INVALID
để ném một ngoại lệ nếu dữ liệu không thể được unserialize. - Callbacks: Những này là các hàm do người dùng xác định có thể được sử dụng để thực hiện việc xác minh hoặc chuyển đổi tùy chỉnh trên dữ liệu đã được unserialize.
Sử dụng bộ lọc với unserialize()
Bây giờ chúng ta đã hiểu qua các kiến thức cơ bản, hãy xem cách chúng ta có thể sử dụng bộ lọc với unserialize()
. Chúng ta sẽ bắt đầu với bộ lọc tùy chọn.
Bộ lọc Tùy chọn
Tùy chọn UNSERIALIZE_OPTIONS
cho phép bạn chỉ định các cờ bổ sung kiểm soát hành vi của unserialize()
. Dưới đây là một ví dụ:
$serialized_data = 'a:3:{i:0;s:1:"a";i:1;s:1:"b";i:2;s:1:"c";}';
$options = ['options' => ['allowed_classes' => false]];
$data = unserialize($serialized_data, $options);
Trong ví dụ này, chúng ta đã đặt tùy chọn allowed_classes
thành false
, có nghĩa là chỉ các lớp bản địa của PHP sẽ được phép unserialize. Nếu dữ liệu đã được serialize chứa bất kỳ lớp nào khác, một lỗi sẽ được ném ra.
Bộ lọc Callback
Bộ lọc callback là một tính năng nâng cao hơn cho phép bạn xác định logic xác minh hoặc chuyển đổi tùy chỉnh. Dưới đây là một ví dụ:
function my_callback($class, $data, $filter) {
if ($class === 'MyClass') {
return new MyClass($data);
}
return false;
}
$serialized_data = 'O:8:"MyClass":1:{s:4:"name";s:5:"Alice";}';
$data = unserialize($serialized_data, ['callback' => 'my_callback']);
Trong ví dụ này, chúng ta đã xác định một hàm callback my_callback()
kiểm tra xem lớp đang được unserialize có phải là MyClass
hay không. Nếu có, nó tạo một instance mới của MyClass
với dữ liệu được cung cấp. Nếu không, nó trả về false
, điều này sẽ làm cho unserialize()
thất bại.
Kết luận
Uf! Đó là một chuyến đi dài, phải không? Tôi hy vọng bạn bây giờ đã có một sự hiểu biết tốt hơn về serialization, unserialization, và cách sử dụng bộ lọc với unserialize()
trong PHP. Nhớ rằng, thực hành là chìa khóa của thành công, vì vậy hãy thử các khái niệm này với một số dữ liệu mẫu. Và đừng quên vui vẻ trên đường đi!
Credits: Image by storyset