1. PHP Filters là gì?

Trong PHP, filters (bộ lọc) là công cụ mạnh mẽ giúp bạn lọcxác thực dữ liệu. Điều này rất quan trọng khi xử lý dữ liệu đầu vào từ người dùng, như form, API, hoặc từ bất kỳ nguồn không đáng tin cậy nào. Việc kiểm tra và làm sạch dữ liệu không chỉ đảm bảo tính hợp lệ mà còn tăng cường bảo mật, giúp ngăn ngừa các lỗi bảo mật như SQL Injection hoặc Cross-Site Scripting (XSS).

PHP cung cấp các hàm tích hợp để xử lý việc lọc và xác thực dữ liệu, trong đó phổ biến nhất là filter_var()filter_input().

Tính năng của PHP Filters:

  • Xác thực dữ liệu: Kiểm tra xem dữ liệu có hợp lệ không (ví dụ: email, số nguyên, URL).
  • Làm sạch dữ liệu: Loại bỏ hoặc chuyển đổi các ký tự không mong muốn từ dữ liệu đầu vào.

2. Sử dụng filter_var()

Hàm filter_var() là công cụ chính để kiểm tra và lọc dữ liệu trong PHP. Nó có thể được sử dụng để kiểm tra dữ liệu (validation) hoặc làm sạch dữ liệu (sanitization).

Cú pháp của filter_var():

php
filter_var($variable, $filter, $options);
  • $variable: Biến cần lọc.
  • $filter: Loại bộ lọc cần áp dụng. PHP cung cấp các hằng số filter như FILTER_VALIDATE_EMAIL, FILTER_SANITIZE_STRING, v.v.
  • $options: Một mảng tùy chọn bổ sung, tùy thuộc vào filter.

3. Validation Filters (Bộ Lọc Xác Thực)

Validation filters được sử dụng để kiểm tra tính hợp lệ của dữ liệu. Một số filter phổ biến bao gồm:

  • FILTER_VALIDATE_EMAIL: Kiểm tra xem chuỗi có phải là email hợp lệ không.
  • FILTER_VALIDATE_URL: Kiểm tra xem chuỗi có phải là URL hợp lệ không.
  • FILTER_VALIDATE_INT: Kiểm tra xem giá trị có phải là số nguyên không.
  • FILTER_VALIDATE_BOOLEAN: Kiểm tra xem giá trị có phải là giá trị boolean hợp lệ không.

Ví dụ 1: Kiểm tra email hợp lệ

php
$email = "user@example.com";

if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo "Email hợp lệ.";
} else {
    echo "Email không hợp lệ.";
}

Kết quả:

shell
Email hợp lệ.

Ví dụ 2: Kiểm tra URL hợp lệ

php
$url = "https://codetuthub.com";

if (filter_var($url, FILTER_VALIDATE_URL)) {
    echo "URL hợp lệ.";
} else {
    echo "URL không hợp lệ.";
}

Kết quả:

shell
URL hợp lệ.

Ví dụ 3: Kiểm tra số nguyên hợp lệ

php
$number = "123";

if (filter_var($number, FILTER_VALIDATE_INT)) {
    echo "Đây là số nguyên.";
} else {
    echo "Đây không phải là số nguyên.";
}

Kết quả:

shell
Đây là số nguyên.<br>

4. Sanitize Filters (Bộ Lọc Làm Sạch)

Sanitize filters được sử dụng để làm sạch dữ liệu, loại bỏ các ký tự không hợp lệ hoặc nguy hiểm từ chuỗi.

  • FILTER_SANITIZE_STRING: Loại bỏ các ký tự HTML và JavaScript không mong muốn.
  • FILTER_SANITIZE_EMAIL: Làm sạch một chuỗi email.
  • FILTER_SANITIZE_URL: Loại bỏ các ký tự không hợp lệ trong URL.
  • FILTER_SANITIZE_NUMBER_INT: Loại bỏ tất cả các ký tự không phải số và dấu trừ (-).

Ví dụ 4: Làm sạch chuỗi

php
$string = "<h1>Hello World!</h1> <script>alert('Hack');</script>";
$clean_string = filter_var($string, FILTER_SANITIZE_STRING);

echo $clean_string;

Kết quả:

shell
Hello World! alert('Hack');

Trong ví dụ trên, các thẻ HTML và script đã bị loại bỏ để bảo vệ khỏi các cuộc tấn công XSS.

Ví dụ 5: Làm sạch email

php
$email = "user@@example.com";
$clean_email = filter_var($email, FILTER_SANITIZE_EMAIL);

echo $clean_email;

Kết quả:

shell
user@example.com

Ví dụ 6: Làm sạch số nguyên

php
$number = "12abc34";
$clean_number = filter_var($number, FILTER_SANITIZE_NUMBER_INT);

echo $clean_number;

Kết quả:

shell
1234

5. Sử dụng filter_input()

Hàm filter_input() được sử dụng để lọc và xác thực dữ liệu đầu vào từ các biến toàn cục như $_GET, $_POST, $_COOKIE, $_SERVER. Nó giúp xử lý dữ liệu đầu vào trực tiếp từ các form, URL, cookie, hoặc biến môi trường.

Cú pháp của filter_input():

php
filter_input($type, $variable_name, $filter, $options);
  • $type: Loại biến cần lọc (INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER).
  • $variable_name: Tên của biến cần lọc (tên biến trong form hoặc URL).
  • $filter: Loại bộ lọc cần áp dụng.
  • $options: Tùy chọn bổ sung (không bắt buộc).

Ví dụ 7: Kiểm tra giá trị từ form POST

php
// Kiểm tra email được gửi qua phương thức POST
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);

if ($email) {
    echo "Email hợp lệ: " . $email;
} else {
    echo "Email không hợp lệ.";
}

Trong ví dụ này, chúng ta đang lấy dữ liệu từ một form gửi bằng phương thức POST và kiểm tra xem email có hợp lệ không.

6. Lọc dữ liệu mảng với filter_var_array()

Nếu bạn cần lọc nhiều giá trị cùng một lúc, có thể sử dụng filter_var_array(). Hàm này cho phép lọc nhiều biến trong một mảng dữ liệu.

Cú pháp của filter_var_array():

php
filter_var_array($array, $filters);
  • $array: Mảng dữ liệu cần lọc.
  • $filters: Một mảng các bộ lọc áp dụng cho từng phần tử của mảng.

Ví dụ 8: Lọc nhiều giá trị từ mảng

php
$data = [
    'name' => '<h1>John Doe</h1>',
    'email' => 'john@@example.com',
    'age' => '25abc'
];

$filters = [
    'name' => FILTER_SANITIZE_STRING,
    'email' => FILTER_VALIDATE_EMAIL,
    'age' => FILTER_SANITIZE_NUMBER_INT
];

$clean_data = filter_var_array($data, $filters);

print_r($clean_data);

Kết quả:

php
Array
(
    [name] => John Doe
    [email] => 
    [age] => 25
)

Trong ví dụ trên:

  • name được làm sạch khỏi các thẻ HTML.
  • email không hợp lệ nên kết quả trả về false.
  • age đã được làm sạch để chỉ chứa số nguyên.

7. Sử dụng filter_input_array()

Tương tự như filter_var_array(), hàm filter_input_array() dùng để lọc nhiều giá trị đầu vào từ $_GET, $_POST, $_COOKIE, v.v.

Ví dụ 9: Lọc nhiều giá trị từ $_POST

php
$filters = [
    'name' => FILTER_SANITIZE_STRING,
    'email' => FILTER_VALIDATE_EMAIL,
    'age' => [
        'filter' => FILTER_VALIDATE_INT,
        'options' => ['min_range' => 18, 'max_range' => 100]
    ]
];

$clean_data = filter_input_array(INPUT_POST, $filters);

print_r($clean_data);

Trong ví dụ này, chúng ta lọc nhiều giá trị từ form POST. Bộ lọc kiểm tra xem:

  • name được làm sạch khỏi thẻ HTML.
  • email được kiểm tra xem có hợp lệ không.
  • age được xác thực là số nguyên nằm trong khoảng từ 18 đến 100.

8. Kết luận

Bộ lọc trong PHP cung cấp một cách hiệu quả và dễ dàng để làm sạch và xác thực dữ liệu từ người dùng. Việc sử dụng PHP Filters giúp tăng cường tính bảo mật và đảm bảo dữ liệu đầu vào có định dạng đúng trước khi sử dụng trong ứng dụng.

Hãy ghi nhớ:

  • Sử dụng filter_var() để kiểm tra và lọc các biến đơn lẻ.
  • Sử dụng filter_input() để lọc dữ liệu từ các biến toàn cục như $_GET, $_POST, $_COOKIE.
  • Lọc nhiều giá trị cùng một lúc bằng cách sử dụng filter_var_array() hoặc filter_input_array().