Bộ lọc dữ liệu - data filter trong php


tự học php nâng cao 22/07/2015 Cùng chuyên mục

Mọi dữ liệu nhận được từ bên ngoài mã nguồn - còn gọi là external input - đều ẩn chứa các nguy cơ gây ra lỗi hệ thống. Sử dụng bộ lọc dữ liệu giúp cho dữ liệu đầu vào chính xác - đúng quy chuẩn.

Công việc lọc dữ liệu đầu vào có 2 phần:

- Xác thực tính đúng đắn - hợp lệ của dữ liệu (validating data)
- Loại bỏ các ký tự trái phép ra khỏi dữ liệu (sanitizing data) 

Các nguồn dữ liệu từ bên ngoài gửi đến trang xử lý có thể từ:

  • Form nhập liệu của người dùng
  • Dữ liệu cookie gửi lên từ trình duyệt
  • Giá trị trả ra từ cơ sở dữ liệu
  • Giá trị nhận được từ dịch vụ web  (webservice)
  • Giá trị nhận được từ các biến của server (các biến toàn cục)

Lọc dữ liệu với hàm filter_var():

Hàm filter_var() sử dụng được cho cả 2 chức năng: xác thực dữ liệu và loại bỏ ký tự trái phép

Loại bỏ các ký tự đặc biệt ra khỏi chuỗi:

<?php
$str = "A nice day!";
$new_str = filter_var($str,FILTER_SANITIZE_STRING);
echo $new_str;
?>

Tương tự cho:
- Số nguyên: FILTER_SANITIZE_NUMBER_INT
- Số thực: FILTER_SANITIZE_NUMBER_FLOAT
- EMAIL: FILTER_SANITIZE_EMAIL
- URL: FILTER_SANITIZE_URL

Xác thực có phải là số nguyên:

Sử dụng hàm filter_var() - với tham số truyền vào là FILTER_VALIDATE_INT

<?php
$in = 10;
if(!filter_var($in,FILTER_VALIDATE_INT) === false)
{
echo 'Là số nguyên';
}
else
{
echo 'không phải là số nguyên - hãy kiểm tra lại';
}
?>

Tương tự cho việc xác thực: 

- Số thực: FILTER_VALIDATE_FLOAT
- Địa chỉ IP: FILTER_VALIDATE_IP
- EMAIL: FILTER_VALIDATE_EMAIL
- URL: FILTER_VALIDATE_URL
...

Ví dụ: Loại bỏ các ký tự trái phép và xác thực email

<?php
	$email = "my_email@example.com";
	//loại bỏ các ký tự trái phép
	$email = filter_var($email,FILTER_SANITIZE_EMAIL);
	//kiểm tra tính hợp lệ của email
	if(!filter_var($email,FILTER_VALIDATE_EMAIL) === false)
	{
		echo "Địa chỉ {$email} hợp lệ";		
	}
	else
	{
		echo 'Địa chỉ email không hợp lệ';
	}
	//Kết quả: Địa chỉ my_email@example.com hợp lệ
?>

Xác thực số nguyên với miền giá trị:

Thêm tham số min_rangemax_range vào hàm filter_var().
Ví dụ: xác thực số nguyên nằm trong khoảng từ 1 đến 1000

<?php
	$in = 99;
	$min_range = 1;
	$max_range = 1000;
	if(!filter_var($in, array("option" => array("min_range" => min_range, "max_range" => 
	maxrange))) === false)
	{
		echo 'Là số nguyên - nằm trong miền giá trị cho phép';
	}
	else
	{
		echo 'Không phải là số nguyên - không nằm trong miền giá trị cho phép';
	}
?>

TỔNG KẾT

Sau bài này, các bạn cần chú ý đến các điểm sau:
- Chú ý luôn lọc dữ liệu khi nhận từ form, cookie,... và luôn ghi nhớ "All Data is Evil" - "mọi dữ liệu đều có thể gây nguy hiểm".



Bài liên quan:



Bình luận: