Bộ lọc PHP

Trong bài viết "Xác thực biểu mẫu (form) trong PHP" 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. Trong bài viết này chúng ta cũng đã sử dụng bộ lọc để kiểm tra sự hợp lệ của email và địa chỉ website. Nếu bạn bỏ lỡ bài viết này thì có thể xem ở đây:

Xác thực biểu mẫu (form) trong PHP | Comdy
Hướng dẫn bạn cách xác thực biểu mẫu (form) trong PHP và chống các kiểu tấn công XSS phổ biến.

Ở bài viết này chúng ta sẽ tìm hiểu kỹ hơn về bộ lọc PHP. Có hai thuật ngữ bạn nên chú ý trong bài viết này:

Xác thực dữ liệu = Xác định xem dữ liệu có hợp lệ không.

Lọc dữ liệu = Loại bỏ bất kỳ ký tự không hợp lệ khỏi dữ liệu.

Bộ lọc PHP mở rộng

Các bộ lọc PHP được sử dụng để xác thực và lọc dữ liệu đầu vào từ bên ngoài.

Bộ lọc PHP mở rộng có nhiều chức năng cần thiết để kiểm tra đầ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.

Hàm filter_list() được sử dụng để in ra danh sách các bộ lọc mở rộng mà PHP cung cấp:

<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>

Tại sao nên sử dụng bộ lọc?

Nhiều ứng dụng web nhận dữ liệu đầu vào từ bên ngoài. Dữ liệu đầu vào từ bên ngoài có thể là:

  • Dữ liệu của 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.
Bạn nên xác thực dữ liệu từ 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 bạn có được đầu vào chính xác!

Lọc một chuỗi

Ví dụ sau sử dụng hàm filter_var() để xóa tất cả các thẻ HTML khỏi chuỗi:

<?php
    $str = "<h1>Hello World!</h1>";
    $newstr = filter_var($str, FILTER_SANITIZE_STRING);
    echo $newstr;
?>

Đây là kết quả mà bạn sẽ nhận được:

Hello World!

Xác thực một số nguyên

Ví dụ sau sử dụng hàm filter_var() để kiểm tra xem biến $int có phải là số nguyên không.

Nếu $int là một số nguyên, đầu ra của mã bên dưới sẽ là: "Integer is valid". Nếu $ int không phải là số nguyên, đầu ra sẽ là: "Integer is not valid":

<?php
    $int = 100;

    if (!filter_var($int, FILTER_VALIDATE_INT) === false) {
        echo("Integer is valid");
    } else {
        echo("Integer is not valid");
    }
?>

Đây là kết quả mà bạn sẽ nhận được:

Integer is valid

Trong ví dụ trên, nếu $int được gán thành 0, hàm trên sẽ trả về "Integer is not valid". Để giải quyết vấn đề này, hãy sử dụng mã dưới đây:

<?php
    $int = 0;

    if (filter_var($int, FILTER_VALIDATE_INT) === 0 || 
        !filter_var($int, FILTER_VALIDATE_INT) === false) {
        echo("Integer is valid");
    } else {
        echo("Integer is not valid");
    }
?>

Đây là kết quả:

Integer is valid

Xác thực địa chỉ IP

Ví dụ sau sử dụng hàm filter_var() để kiểm tra xem biến $ip có phải là địa chỉ IP hợp lệ không:

<?php
    $ip = "127.0.0.1";

    if (!filter_var($ip, FILTER_VALIDATE_IP) === false) {
        echo("$ip is a valid IP address");
    } else {
        echo("$ip is not a valid IP address");
    }
?>

Đây là kết quả:

127.0.0.1 is a valid IP address

Lọc và xác thực địa chỉ email

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

<?php
    $email = "john.doe@example.com";

    // Remove all illegal characters from email
    $email = filter_var($email, FILTER_SANITIZE_EMAIL);

    // Validate e-mail
    if (!filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
        echo("$email is a valid email address");
    } else {
        echo("$email is not a valid email address");
    }
?>

Đây là kết quả:

john.doe@example.com is a valid email address

Lọc và xác thực một URL

Ví dụ sau sử dụng hàm filter_var() để xóa tất cả các ký tự không hợp lệ khỏi URL, sau đó kiểm tra xem $url có phải là URL hợp lệ không:

<?php
    $url = "https://tech.comdy.vn";

    // Remove all illegal characters from a url
    $url = filter_var($url, FILTER_SANITIZE_URL);

    // Validate url
    if (!filter_var($url, FILTER_VALIDATE_URL) === false) {
        echo("$url is a valid URL");
    } else {
        echo("$url is not a valid URL");
    }
?>

Đây là kết quả:

https://tech.comdy.vn is a valid URL

Xác thực một số nguyên trong phạm vi

Ví dụ sau sử dụng hàm filter_var() để kiểm tra xem một biến kiểu integer có nằm trong phạm vi từ 1 đến 200 không:

<?php
    $int = 122;
    $min = 1;
    $max = 200;

    if (filter_var($int, FILTER_VALIDATE_INT, array("options" => array("min_range"=>$min, "max_range"=>$max))) === false) {
        echo("Variable value is not within the legal range");
    } else {
        echo("Variable value is within the legal range");
    }
?>

Đây là kết quả:

Variable value is within the legal range

Xác thực địa chỉ IPv6

Ví dụ sau sử dụng hàm filter_var()hàm để kiểm tra xem biến $ip có phải là địa chỉ IPv6 hợp lệ không:

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

    if (!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) === false) {
        echo("$ip is a valid IPv6 address");
    } else {
        echo("$ip is not a valid IPv6 address");
    }
?>

Đây là kết quả:

2001:0db8:85a3:08d3:1319:8a2e:0370:7334 is a valid IPv6 address

Xác thực URL phải chứa QueryString

Ví dụ sau sử dụnghàm filter_var() để kiểm tra xem biến $ url có phải là URL có chuỗi truy vấn không:

<?php
    $url = "https://tech.comdy.vn?page=2";

    if (!filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_QUERY_REQUIRED) === false) {
        echo("$url is a valid URL with a query string");
    } else {
        echo("$url is not a valid URL with a query string");
    }
?>

Đây là kết quả:

https://tech.comdy.vn?page=2 is a valid URL with a query string

Xóa các ký tự ASCII có giá trị > 127

Ví dụ sau sử dụng hàm filter_var() để lọc một chuỗi. Nó sẽ xóa tất cả các thẻ HTML và tất cả các ký tự ASCII có giá trị > 127 khỏi chuỗi:

<?php
    $str = "<h1>Hello WorldÆØÅ!</h1>";

    $newstr = filter_var($str, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);
    echo $newstr;
?>

Đây là kết quả:

Hello World!


Bài viết liên quan:

Hướng dẫn lập trình PHP toàn tập sẽ giúp bạn từng bước tìm hiểu và nắm vững ngôn ngữ lập trình PHP.

Hướng dẫn cách truy xuất, lọc, sắp xếp dữ liệu MySQL trong PHP sử dụng MySQLi và PDO.

MySQL prepared statements trong PHP rất hữu ích để chống lại các cuộc tấn công SQL Injection.