Trong bài Xác thực biểu mẫu với form chúng ta đã tìm hiểu cách xác thực dữ liệu người dùng nhập vào biểu mẫu. Và như trước đây chúng ta cũng đã tìm hiểu về việc sử dụng biểu thức chính quy (Regular Expression) để kiểm tra định dạng dữ liệu thì nó khá là phức tạp một chút. Còn bài này sẽ cho chúng ta biết về việc sử dụng bộ lọc để lọc và kiểm tra sự hợp lệ của email và địa chỉ web.

1. Bộ lọc trong PHP là gì?

Đầu tiên mình muốn nó là việc làm sạch và xác thực dữ liệu đầu vào của người dùng là một trong những nhiệm vụ phổ biến nhất trong khi lập trình web. Để làm cho nhiệm vụ này dễ dàng hơn, PHP cung cấp tiện ích mở rộng filters mà bạn có thể sử dụng để làm sạch hoặc xác thực dữ liệu như địa chỉ email, URL, địa chỉ IP,…

Bộ lọc trong PHP – PHP Filters giống như là một phần mở rộng được tích hợp sẵn vào thư viện của PHP. Nó là một thư viện để kiểm tra tính hợp lệ của dữ liệu (validate data), lọc và xóa đi những ký tự trùng hợp ( Sanitizing data). Nếu như dịch theo đúng cái tên cũng chính là ý nghĩa của nó. Thông thường chúng ta hay sử dụng PHP Filters để kiểm tra định dạng dữ liệu vì nó tương đối đơn giản.

Ở bài này thì mình có 2 thuật ngữ mà ta nên chú ý:

  • Xác thực dữ liệu : là việc xác định xem dữ liệu có hợp lệ hay không.
  • Lọc dữ liệu : là việc loại bỏ bất kỳ ký tự không hợp lệ nào khỏi dữ liệu.

2. Bộ lọc PHP mở rộng

Bộ lọc PHP được sử dụng để xác thực và làm sạch đầu vào bên ngoài. Phần mở rộng bộ lọc PHP có nhiều chức năng cần thiết để kiểm tra thông tin đầu vào của người dùng và được thiết kế để giúp xác thực dữ liệu dễ dàng và nhanh chóng hơn.

Các hàm filter_list() có thể được sử dụng để danh sách những gì các bộ lọc PHP mở rộng cung cấp, ví dụ:

<table>
  <tr>
    <td>Filter Name</td>
    <td>Filter ID</td>
  </tr>
  <?php
  foreach (filter_list() as $id =>$filter) {
    echo '<tr><td>' . $filter . '</td><td>' . filter_id($filter) . '</td></tr>';
  }
  ?>
</table>

Sẽ có một số bộ lọc PHP nhưng 2 bộ lọc dưới đây ta sẽ sử dụng thường xuyên nhất:

  • Xác thực: được sử dụng để xác thực hoặc kiểm tra xem dữ liệu có đáp ứng các tiêu chuẩn nhất định hay không. Ví dụ: chuyển vào FILTER_VALIDATE_URL sẽ xác định xem dữ liệu có phải là url hợp lệ hay không, nhưng nó sẽ không tự thay đổi dữ liệu hiện có.
  • Sanitization (Vệ sinh): không giống như xác thực, Sanitization sẽ làm sạch dữ liệu để đảm bảo rằng không có ký tự không mong muốn nào bằng cách xóa hoặc thay đổi dữ liệu. Ví dụ: chuyển các dữ liệu vào FILTER_SANITIZE_EMAIL sẽ xóa tất cả các ký tự không thích hợp cho một địa chỉ email. Có nghĩa là các địa chỉ này cũng sẽ không được xác thực

3. Tạo sao nên sử dụng bộ lọc trong PHP

Hiện nay đa số các web nhận dữ liệu đầu vào từ bên ngoài. Dữ liệu từ bên ngoài có thể là:

  • Dữ liệu từ người dùng từ một biểu mẫu
  • Cookie
  • Dữ liệu web service
  • Các biên môi trường của server
  • Kết quả truy vấn cơ sở dữ liệu

Khác với các bộ lọc mà ta thường nghe trong ứng dụng chỉnh sửa hình ảnh, bộ lọc trong PHP đóng vai trò quan trọng trong việc bảo mật dữ liệu của lập trình viên, cùng với đó là rất hữu ích trong việc xử lý bảo mật dữ liệu và quản lý dữ liệu. Bảo mật dữ liệu và quản lý dữ liệu là mối quan tâm lớn trong tất cả các ứng dụng PHP. Quản lý dữ liệu đề cập đến việc xử lý dữ liệu và duy trì nó để sử dụng và xử lý ứng dụng trong PHP.

Dữ liệu cho một ứng dụng trong các chương trình PHP có thể có hai nguồn, một có thể là tổ chức nội bộ chạy ứng dụng và một có thể là dữ liệu bên ngoài. Dữ liệu từ tổ chức nội bộ dễ dàng xử lý vì nó được sắp xếp trước theo các định dạng cần thiết. Thách thức chính phải đối mặt khi làm việc với dữ liệu bên ngoài. Dữ liệu được gửi không hợp lệ có thể dẫn đến các vấn đề bảo mật và phá vỡ trang web của bạn! Bằng cách sử dụng các bộ lọc PHP, bạn có thể chắc chắn rằng ứng dụng của mình nhận được đầu vào chính xác!

4. Chức năng của bộ lọc trong PHP

Dưới đây sẽ là một số chức năng cụ thể của từng bộ lọc filter trong PHP:

  • filter_var() : Lọc một biến cụ thể
  • filter_var_array() : Lọc nhiều biến tức là mảng biến
  • filter_has_var() : Kiểm tra xem biến của các loại đầu vào cụ thể có tồn tại hay không
  • filter_id() : giúp lấy id bộ lọc của tên bộ lọc được chỉ định
  • filter_list() : Trả về danh sách tên bộ lọc được hỗ trợ ở dạng mảng.
  • filter_input() : Nhận một biến bên ngoài và lọc nó
  • filter_input_array() : giống như filter_input() nhưng ở đây lấy các mảng biến và lọc chúng.

5. Hằng số bộ lọc được xác định trước trong PHP

Mình sẽ liệt kê một số hằng số xác định trước dưới đây:

5.1. Xác thực các hằng số bộ lọc

  • FILTER_VALIDATE_BOOLEAN : Xác thực boolean
  • FILTER_VALIDATE_INT : Xác thực một số nguyên
  • FILTER_VALIDATE_FLOAT : Xác thực một float
  • FILTER_VALIDATE_REGEXP : Xác thực một biểu thức chính quy
  • FILTER_VALIDATE_IP : Xác thực địa chỉ IP
  • FILTER_VALIDATE_EMAIL : Xác thực địa chỉ email
  • FILTER_VALIDATE_URL : Xác thực URL

5.2. Vệ sinh hằng số bộ lọc

  • FILTER_SANITIZE_EMAIL : Xóa tất cả các ký tự không hợp lệ khỏi địa chỉ email
  • FILTER_SANITIZE_ENCODED : Xóa / Mã hóa các ký tự đặc biệt
  • FILTER_SANITIZE_MAGIC_QUOTES : Áp dụng hàm addslash()
  • FILTER_SANITIZE_NUMBER_FLOAT : Xóa tất cả các ký tự, trừ các chữ số, + – và tùy chọn., EE
  • FILTER_SANITIZE_NUMBER_INT : Xóa tất cả các ký tự ngoại trừ các chữ số và + –
  • FILTER_SANITIZE_SPECIAL_CHARS : Xóa các ký tự đặc biệt
  • FILTER_SANITIZE_FULL_SPECIAL_CHARS : Có thể tắt báo giá mã hóa bằng cách sử dụng FILTER_FLAG_NO_ENCODE_QUOTES.
  • FILTER_SANITIZE_STRING : Xóa thẻ / ký tự đặc biệt khỏi chuỗi
  • FILTER_SANITIZE_STRIPPED : Bí danh của FILTER_SANITIZE_STRING
  • FILTER_SANITIZE_URL : Xóa tất cả ký tự bất hợp pháp khỏi URL

5.3. Các hằng số bộ lọc khác

  • FILTER_UNSAFE_RAW : Không làm gì cả, tùy chọn dải / mã hóa các ký tự đặc biệt
  • FILTER_CALLBACK : Gọi hàm do người dùng xác định để lọc dữ liệu