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:

Ở 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 = "[email protected]";
// 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ả:
[email protected] 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!