PHP – Filters

Điều quan trọng là dữ liệu đầu vào nhận được từ yêu cầu của khách hàng phải được xác thực trước khi xử lý trong một ứng dụng PHP. Để thực hiện xác thực đầu vào, phần mở rộng lọc trong PHP cung cấp một số hàm lọc, được hỗ trợ bởi các hằng số và cờ lọc được định nghĩa trước. Phần mở rộng lọc của thư viện PHP cũng giúp làm sạch dữ liệu đầu vào nhận được qua phương thức GET hoặc POST.

Mở rộng bộ lọc là một tính năng mạnh mẽ giúp ngăn chặn các lỗ hổng bảo mật, chẳng hạn như tấn công SQL injection và cross-site scripting. Mở rộng này có hai loại bộ lọc −

Validation Filters

Các bộ lọc xác thực kiểm tra xem dữ liệu có đáp ứng các tiêu chí nhất định hay không. Ví dụ, bạn muốn đảm bảo rằng người dùng đã nhập đúng trường email trong biểu mẫu HTML. Bộ lọc FILTER_VALIDATE_EMAIL sẽ xác định xem dữ liệu có phải là một địa chỉ email hợp lệ hay không. Tuy nhiên, các bộ lọc xác thực sẽ không thay đổi dữ liệu chính nó.

Sanitization Filters

Sanitization đề cập đến quá trình loại bỏ các ký tự không mong muốn từ đầu vào. Do đó, nó có thể làm thay đổi dữ liệu bằng cách loại bỏ các ký tự không mong muốn. Ví dụ, việc sử dụng FILTER_SANITIZE_EMAIL sẽ loại bỏ các ký tự không phù hợp mà một địa chỉ email không nên có, mà không thực hiện xác thực.

Filter Flags

Mở rộng bộ lọc trong PHP định nghĩa một số filter flags như sau −

Sr.No ID & Description
1 FILTER_FLAG_STRIP_LOW Strips characters that have a numerical value <32.
2 FILTER_FLAG_STRIP_HIGH Strips characters that have a numerical value >127.
3 FILTER_FLAG_STRIP_BACKTICK Strips backtick characters.
4 FILTER_FLAG_ALLOW_FRACTION Allows a period (.) as a fractional separator in numbers.
5 FILTER_FLAG_ALLOW_THOUSAND Allows a comma (,) as a thousands separator in numbers.
6 FILTER_FLAG_ALLOW_SCIENTIFIC Allows an e or E for scientific notation in numbers.
7 FILTER_FLAG_NO_ENCODE_QUOTES If this flag is present, single (') and double (") quotes will not be encoded.
8 FILTER_FLAG_ENCODE_LOW Encodes all characters with a numerical value <32.
9 FILTER_FLAG_ENCODE_HIGH Encodes all characters with a numerical value >127.
10 FILTER_FLAG_ENCODE_AMP Encodes ampersands (&).
11 FILTER_NULL_ON_FAILURE Returns null for unrecognized values.
12 FILTER_FLAG_ALLOW_OCTAL Regards inputs starting with a zero (0) as octal numbers.
13 FILTER_FLAG_ALLOW_HEX Regards inputs starting with 0x or 0X as hexadecimal numbers.
14 FILTER_FLAG_EMAIL_UNICODE Allows the local part of the email address to contain Unicode characters.
15 FILTER_FLAG_IPV4 Allows the IP address to be in IPv4 format.
16 FILTER_FLAG_IPV6 Allows the IP address to be in IPv6 format.
17 FILTER_FLAG_NO_PRIV_RANGE Fails validation for the following private IPv4 ranges: 10.0.0.0/8, 172.16.0.0/12 and 192.168.0.0/16.
18 FILTER_FLAG_NO_RES_RANGE Fails validation for the following reserved IPv4 ranges: 0.0.0.0/8, 169.254.0.0/16, 127.0.0.0/8 and 240.0.0.0/4. Fails validation for the following reserved IPv6 ranges: ::1/128, ::/128, ::ffff:0:0/96 and fe80::/10.
19 FILTER_FLAG_GLOBAL_RANGE Fails validation for non global IPv4/IPv6 ranges
20 FILTER_FLAG_SCHEME_REQUIRED Requires the URL to contain a scheme part.
21 FILTER_FLAG_HOST_REQUIRED Requires the URL to contain a host part.
22 FILTER_FLAG_PATH_REQUIRED Requires the URL to contain a path part.
23 FILTER_FLAG_QUERY_REQUIRED Requires the URL to contain a query string.
24 FILTER_REQUIRE_SCALAR Requires the value to be scalar.
25 FILTER_REQUIRE_ARRAY Requires the value to be an array.
26 FILTER_FORCE_ARRAY If the value is a scalar, it is treated as array with the scalar value as only element.

Filter Functions

Tiện ích mở rộng bộ lọc bao gồm các filter functions sau:

Sr.No ID & Description
1 filter_has_var() Checks if variable of specified type exists
2 filter_id() Returns the filter ID belonging to a named filter
3 filter_input_array() Gets external variables and optionally filters them
4 filter_input () Gets a specific external variable by name and filters it
5 filter_list() Returns a list of all supported filters
6 filter_var_array() Gets multiple variables and optionally filters them
7 filter_var() Filters a variable with a specified filter

Predefined Constants

Các hàm trên sử dụng một tham số gọi là input_type, đây là một trong những hằng số liệt kê được định nghĩa sẵn, đại diện cho cách mà đầu vào đã được cung cấp cho script PHP để mục đích lọc.

Constant Types
INPUT_POST (int) POST Variables
INPUT_GET (int) GET Variables
INPUT_COOKIE (int) COOKIE Variables
INPUT_ENV (int) ENV Variables
INPUT_SERVER (int) SERVER Variables
INPUT_SESSION (int) SESSION Variables
INPUT_REQUEST (int) REQUEST Variables

filter_has_var() function

Hàm filter_has_var() kiểm tra xem biến của loại được chỉ định có tồn tại hay không.

filter_has_var(int $input_type, string $var_name): bool

input_type là một trong những hằng số được định nghĩa trước INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER hoặc INPUT_ENV; trong khi tham số var_name là tên của một biến để kiểm tra. Hàm này trả về true nếu thành công hoặc false nếu thất bại.

Example

Truy cập vào đoạn mã PHP sau trên máy chủ XAMPP.

<?php
   if (!filter_has_var(INPUT_GET, "email")) {
      echo("Email not found");
   } else {
      echo("Email found");
   }
?>

Nó sẽ tạo ra output

Truy cập http://localhost/hello.php?email=abc@example.com

Email found

filter_input() function

Hàm filter_input() lấy một biến bên ngoài cụ thể theo tên và lọc nó theo hằng số bộ lọc đã áp dụng.

filter_input(
   int $type,
   string $var_name,
   int $filter = FILTER_DEFAULT,
   array|int $options = 0
): mixed

Tham số kiểu là một trong các hằng số INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER hoặc INPUT_ENV. Tham số thứ hai là var_name, tên của biến cần lấy. Bạn có thể sử dụng bộ lọc để áp dụng. Sử dụng bất kỳ cờ bộ lọc đã được định nghĩa trước nào. Nếu bị bỏ qua, FILTER_DEFAULT sẽ được sử dụng.

Hàm trả về giá trị của biến được yêu cầu khi thành công, false nếu bộ lọc không thành công, hoặc null nếu biến var_name không được thiết lập.

Example

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

<?php
   if (!filter_input(INPUT_GET, "email", FILTER_VALIDATE_EMAIL)) {
      echo("Email is not valid");
   } else {
      echo("Email is valid");
   }
?>

Nó sẽ tạo ra output

Nếu bạn sử dụng URL http://localhost/hello.php?email=abc@example.com ,

Email is valid

Nếu URL là http://localhost/hello.php?email=a b c@example.com ,

Email is not valid

Bạn cũng có thể sử dụng loại INPUT_POST để xác thực dữ liệu đầu vào nhận được thông qua phương thức POST −

<?php
   if (!filter_input(INPUT_POST, "email", FILTER_VALIDATE_EMAIL)) {
      echo("Email is not valid");
   } else {
      echo("Email is valid");
   }
?>

Để truyền dữ liệu với yêu cầu POST, hãy mở dấu nhắc lệnh và sử dụng lệnh CURL sau đây.

curl -X POST -d "{\"email\": \"a@b.com\"}" http://localhost/hello.php

filter_list() function

Hàm filter_list() trả về danh sách tất cả các bộ lọc được hỗ trợ.

filter_list(): array

Example

Hàm trả về một mảng chứa tên của tất cả các bộ lọc được hỗ trợ, hoặc mảng rỗng nếu không có bộ lọc nào như vậy.

<?php
   print_r(filter_list());
?>

Nó sẽ tạo ra output

Array
(
   [0] => int
   [1] => boolean
   [2] => float
   [3] => validate_regexp
   [4] => validate_domain
   [5] => validate_url
   [6] => validate_email
   [7] => validate_ip
   [8] => validate_mac
   [9] => string
   [10] => stripped
   [11] => encoded
   [12] => special_chars
   [13] => full_special_chars
   [14] => unsafe_raw
   [15] => email
   [16] => url
   [17] => number_int
   [18] => number_float
   [19] => add_slashes
   [20] => callback
)

filter_input_array() function

Hàm filter_input_array() lấy các biến bên ngoài và tùy chọn lọc chúng.

filter_input_array(int $type, array|int $options = FILTER_DEFAULT, 
   bool $add_empty = true): array|false|null

Hàm này hữu ích cho việc lấy nhiều giá trị mà không cần gọi filter_input() một cách lặp đi lặp lại.

Tham số kiểu là một trong các giá trị INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER hoặc INPUT_ENV.

Tham số options là một mảng định nghĩa các đối số. Một khóa hợp lệ là một chuỗi chứa tên biến và một giá trị hợp lệ là loại bộ lọc, hoặc một mảng tùy chọn chỉ định bộ lọc, cờ và tùy chọn. Tham số này cũng có thể là một số nguyên chứa một hằng số bộ lọc. Sau đó, tất cả các giá trị trong mảng đầu vào sẽ được lọc bởi bộ lọc này.

Hàm trả về một mảng chứa các giá trị của các biến yêu cầu khi thành công. Nếu mảng đầu vào được chỉ định bởi loại không có dữ liệu, hàm sẽ trả về null nếu không có cờ FILTER_NULL_ON_FAILURE, hoặc false trong trường hợp ngược lại. Đối với các lỗi khác, false sẽ được trả về.

Example

Để bao gồm một mảng trong yêu cầu HTTP, chúng ta sử dụng biểu mẫu HTML sau trong "hello.html" và gửi nó bằng phương thức POST.

<!DOCTYPE html>
<html>
<body>
   <h1>Filter Input Array</h1>
   <form action="hello.php" method="POST">
      <p><label for="email">Enter your email:</label>
      <input type="text" id="email" name="email"></p>
      <p><label for="age">Enter your age<label>
      <input type = "text" id="age" name="age"></p>
      <input type="submit">
   </form>
</body>
</html>

Đoạn mã PHP để xác thực mảng đầu vào như sau −

<?php
   $filters = array (
      "age" => array ("filter"=>FILTER_VALIDATE_INT, 	
         "options"=>array("min_range"=>20,"max_range"=>40) ),
      "email" => FILTER_VALIDATE_EMAIL
   );
   print_r(filter_input_array(INPUT_POST, $filters));
?>

Mở biểu mẫu HTML và nhập 30 vào trường tuổi, abc@example.com vào trường email, kết quả sẽ là một mảng, xác thực cả hai đầu vào.

Array ( [age] => 30 [email] => abc@example.com )

Hãy thử cung cấp các đầu vào không hợp lệ như "age=15". Mảng đầu ra sẽ hiển thị giá trị null cho khóa age .

Array ( [age] => [email] => abc@example.com )