Chức năng filters trong php

Trong các bài đọc trước, chúng ta đã biết phương pháp xác thực dữ liệu form bằng PHP, chúng ta cũng biết cách sử dụng các hàm xác thực dữ liệu của PHP (như preg_match(), preg_match_all(), preg_reply(), ...) để kiểm tra dữ liệu đầu vào nhập từ người dùng.

Trong bài đọc này, chúng ta sẽ làm quen thêm một phương pháp để lọc dữ liệu người dùng, đó là sử dụng các chức năng filters trong PHP.

Tại sao nên sử dụng filters?


Khi xây dựng một ứng dụng website có tương tác với người dùng, website của chúng ta thường xuyên phải gửi, nhận và xử lý dữ liệu. Các dữ liệu đó có thể là:

  • Người dùng nhập dữ liệu từ một biểu mẫu form
  • Dữ liệu cookie máy chủ nhận lại từ máy tính người dùng
  • Dữ liệu từ dịch vụ máy chủ server
  • Các biến server
  • Dữ liệu nhận từ các kết quả truy vấn cơ sở dữ liệu database
  • ...

Các dữ liệu nhận và gửi nếu không được xử lý xác thực, sẽ dẫn đến các vấn đề bảo mật, ảnh hưởng tới cấu trúc website của chúng ta.

Bằng cách sử dụng các chức năng filter của PHP, chúng ta luôn đảm bảo rằng các dữ liệu gửi và nhận được từ bên ngoài là phù hợp và chính xác cho các quá trình xử lý dữ liệu của website.

Filters extension PHP


PHP cung cấp nhiều chức năng filters cần thiết để chúng ta 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 một cách dễ dàng và nhanh chóng hơn.

Ví dụ sau dùng hàm filter_list() để in ra bảng danh sách tên các filters và ID của chúng mà PHP cung cấp cho chúng ta:

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

Xem kết quả

Filter Name Filter ID
int 257
boolean 258
float 259
validate_regexp 272
validate_domain 277
validate_url 273
validate_email 274
validate_ip 275
validate_mac 276
string 513
stripped 513
encoded 514
special_chars 515
full_special_chars 522
unsafe_raw 516
email 517
url 518
number_int 519
number_float 520
add_slashes 523
callback 1024

Hàm filter_var() trong PHP


Hàm filter_var() thường được sử dụng để lọc hoặc làm sạch dữ liệu đầu vào từ người dùng

Hàm filter_var() cần cung cấp dữ liệu đầu vào là một biến cần kiểm tra và loại type để kiểm tra biến đó

Ví dụ 1: Dùng hàm filter_var() xóa các thẻ HTML ra khỏi một chuỗi

Ví dụ

<?php
$str = '<h1>Dùng Filter trong PHP.</h1>';
$newstr = filter_var($str, FILTER_SANITIZE_STRING);
echo $newstr;
?>

Xem kết quả

FILTER_SANITIZE_STRING thuộc bộ lọc string

Bộ lọc này sẽ xóa tất cả các thẻ và mã thoát HTML, một số các ký tự đặc biệt trong chuỗi.

Ví dụ 2: sử dụng hàm filter_var() để kiểm tra xem biến $int có phải là một số nguyên hay không. Nếu đúng thì xuất ra màn hình thông báo "Biến $int là số nguyên". Ngược lại thì "Biến $int không phải là số nguyên".

Ví dụ

<?php
$int = 100;

if(!filter_var($int,FILTER_VALIDATE_INT) === false) {
  echo 'Biến $int là số nguyên';
} else {
  echo 'Biến $int không phải là số nguyên';
}
?>

Xem kết quả

Ở ví dụ trên, nếu biến $int có giá trị là 0 thì kết quả biểu thức trên sẽ là "Biến $int không phải là số nguyên". Để xử lý vấn đề trên, ta điều chỉnh lại đoạn code như sau:

Ví dụ

<?php
$int = 0;

if(filter_var($int,FILTER_VALIDATE_INT) === 0 || !filter_var($int,FILTER_VALIDATE_INT) === false) {
  echo 'Biến $int là số nguyên';
} else {
  echo 'Biến $int không phải là số nguyên';
}
?>

Xem kết quả

FILTER_VALIDATE_INT thuộc bộ lọc int

Bộ lọc này sẽ xác thực giá trị dưới dạng số nguyên, tùy chọn từ phạm vi được chỉ định và chuyển đổi thành int khi thành công.

Ví dụ 3: dùng hàm filter_var() để kiểm tra xem một địa chỉ IP có hợp lệ hay không

Ví dụ

<?php
$ip = "127.0.0.1";

if(!filter_var($ip, FILTER_VALIDATE_IP) === false){
  echo 'Biến $ip có địa chỉ IP hợp lệ';
}else{
  echo 'Biến $ip có địa chỉ IP không hợp lệ';
}
?>

Xem kết quả

FILTER_VALIDATE_IP thuộc bộ lọc validate_ip

Bộ lọc này sẽ xác thực giá trị dưới dạng địa chỉ IP, tùy chọn chỉ IPv4 hoặc IPv6 hoặc không từ các địa chỉ ip bảo mật.

Ví dụ 3.1 Dùng hàm filter_var() để xác thực một địa chỉ IPv6

Ví dụ

<?php
$ip = "2001:0db8:85a3:08d3:1319:8a2e:0370:7334";

if(!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) === false){
  echo 'Biến $ip là địa chỉ IPv6';
}else{
  echo 'Biến $ip không phải là địa chỉ IPv6';
}
?>

Xem kết quả

Ví dụ 4: Dùng hàm filter_var() để xóa tất cả các ký tự không phù hợp khỏi biến $email và kiểm tra xác thực biến $email xem có địa chỉ email hợp lệ hay không

Ví dụ

<?php
$email = "admin@book-code.com.vn";

// Xóa các ký tự không hợp lệ khỏi biến email
$email = filter_var($email, FILTER_SANITIZE_EMAIL);

// Xác thực địa chỉ e-mail
if(!filter_var($email, FILTER_VALIDATE_EMAIL) === false){
  echo 'Biến $email có địa chỉ email hợp lệ.';
}else{
  echo 'Biến $email có địa chỉ email không hợp lệ.';
}
?>

Xem kết quả

FILTER_SANITIZE_EMAIL thuộc bộ lọc email

Bộ lọc này sẽ xóa tất cả các ký tự trừ ký tự chữ, ký tự số và các ký tự !#$%&'*+-=?^_`{|}~@.[].

FILTER_VALIDATE_EMAIL thuộc bộ lọc validate_email

Bộ lọc này sẽ xác thực xem giá trị có phải là một địa chỉ email hợp lệ hay không, nói chung nó sẽ loại trừ các chuỗi giống như tên miền, có khoản trắng và không có ký tự @ trong chuỗi.

Ví dụ 5: Dùng hàm filter_var() để xóa tất cả các ký tự không phù hợp ra khỏi URL, sau đó kiểm tra xem biến $url có URL hợp lệ hay không.

Ví dụ

<?php
$url = "https://book-code.com.vn";

// Xóa tất cả các ký tự không phù hợp
$url = filter_var($url, FILTER_SANITIZE_URL);

// Xác thực url
if(!filter_var($url, FILTER_VALIDATE_URL) === false){
  echo 'Biến $url có địa chỉ URL hợp lệ';
}else{
  echo 'Biến $url có địa chỉ URL hợp lệ';
}
?>

Xem kết quả

FILTER_SANITIZE_URL thuộc bộ lọc url

Bộ lọc này sẽ xóa tất cả các ký tự trừ ký tự chữ, ký tự số và các ký tự $-_.+!*'(),{}|\\^~[]`<>#%";/?:@&=.

FILTER_VALIDATE_URL thuộc bộ lọc validate_url

Bộ lọc này sẽ xác thực giá trị dưới dạng một url. Tùy chọn với các thành phần bắt buộc. Hãy lưu ý rằng một URL hợp lệ có thể không chỉ định giao thức HTTP http://. Vì vậy, có thể cần phải xác thực thêm để xác định URL sử dụng một giao thức khác, ví dụ: ssh:// hoặc mailto:. Lưu ý rằng hàm sẽ chỉ so khớp các URL ASCII là hợp lệ. Các tên miền quốc tế hóa (chứa các ký tự không phải ASCII) sẽ xác thực không thành công.