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:
Filter Name
Filter ID
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 |
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ụ
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ụ
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ụ
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ụ
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ụ
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ụ
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ự !#$%&'*+-=?^_`{|}[email protected][].
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ụ
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 //. 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ặcmailto:
. 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.