Xác thực dữ liệu là một phần không thể thiếu khi làm việc với biểu mẫu. Dữ liệu được gửi không hợp lệ không chỉ có thể dẫn đến các vấn đề về bảo mật mà còn có thể phá vỡ trang web của bạn. Hôm nay, chúng ta sẽ xem cách loại bỏ các ký tự không hợp lệ và xác thực dữ liệu bằng cách sử dụng hàm filter_var
.
Tầm quan trọng của việc làm sạch dữ liệu
Làm sạch dữ liệu rất quan trọng để ngăn chặn các lỗ hổng bảo mật như SQL SQL, tập lệnh chéo trang (XSS) và các cuộc tấn công độc hại khác. Nó đảm bảo rằng dữ liệu đầu vào của người dùng được làm sạch và xác thực trước khi được ứng dụng xử lý.
Dưới đây là một số lý do tại sao bạn phải chọn vệ sinh dữ liệu trong PHP:
Ngăn chặn SQL Injection
Một trong những mối đe dọa bảo mật quan trọng nhất đối với các ứng dụng web là SQL SQL. Người dùng độc hại sử dụng tính năng chèn SQL để có quyền truy cập trái phép vào cơ sở dữ liệu hoặc thao túng dữ liệu. Bằng cách làm sạch dữ liệu đầu vào của người dùng, nhà phát triển có thể ngăn chặn các cuộc tấn công tiêm nhiễm SQL như vậy.
Bảo vệ chống lại các cuộc tấn công XSS (Cross-Site Scripting)
Cross-site scripting (XSS) là một lỗ hổng bảo mật lớn khác trong các ứng dụng web. Những kiểu tấn công này cho phép tin tặc dễ dàng đưa các tập lệnh độc hại vào các trang web và đánh cắp dữ liệu nhạy cảm của người dùng như cookie. Bằng cách làm sạch dữ liệu đầu vào của người dùng, nhà phát triển có thể ngăn chặn các cuộc tấn công XSS.
Làm sạch dữ liệu
làm sạch dữ liệu đảm bảo rằng dữ liệu do người dùng nhập là chính xác và nhất quán. Nó giúp loại bỏ bất kỳ ký tự hoặc thẻ không mong muốn nào có thể gây ra lỗi và dẫn đến dữ liệu không nhất quán.
Ví dụ không có làm sạch dữ liệu
Hãy xem nhanh một ví dụ với thông tin đầu vào độc hại của người dùng.
Giả sử chúng ta có một biểu mẫu đăng nhập trên một trang web nơi người dùng có thể nhập tên người dùng và mật khẩu để truy cập vào tài khoản của họ. Mã PHP có thể trông giống như thế này:
Ví dụ
// Kiểm tra xem tên người dùng và mật khẩu có hợp lệ không
$sql = "SELECT * FROM users WHERE username='$username' AND password='$password'";
$result = mysqli_query($conn, $sql);
Trong đoạn mã trên, dữ liệu đầu vào của người dùng được sử dụng để chuẩn bị một truy vấn SQL nhằm kiểm tra xem tên người dùng và mật khẩu mà người dùng nhập có khớp với người dùng hợp lệ trong cơ sở dữ liệu hay không.
Tuy nhiên, nếu tin tặc nhập dữ liệu đầu vào độc hại như thế này:
Ví dụ
' OR '1'='1
Câu lệnh SQL thu được sẽ như thế này:
Ví dụ
SELECT * FROM users WHERE username='' OR '1'='1' AND password='';
Như bạn có thể thấy, truy vấn sẽ luôn đánh giá thành TRUE
, điều đó có nghĩa là truy vấn SQL sẽ trả về tất cả người dùng trong cơ sở dữ liệu, cấp cho hacker quyền truy cập vào tất cả tài khoản người dùng một cách hiệu quả.
Đây chỉ là một ví dụ về cách đầu vào độc hại có thể xâm phạm tính bảo mật của ứng dụng của bạn. Vì vậy, điều thực sự quan trọng là phải làm sạch và xác thực thông tin đầu vào của người dùng để ngăn chặn các cuộc tấn công như vậy.
Tại sao các nhà phát triển có xu hướng bỏ qua việc làm sạch dữ liệu
Hầu hết mọi người có xu hướng nghĩ việc xác thực dữ liệu là một quá trình vô cùng tẻ nhạt trong đó:
- So sánh dữ liệu họ muốn xác thực với mọi sự kết hợp có thể mà họ có thể nghĩ ra
- Cố gắng tìm một biểu thức chính quy vàng phù hợp với mọi kết hợp có thể
- Hoặc kết hợp cả hai
Có những vấn đề rõ ràng với những điều trên:
- Nó rất tốn thời gian
- Có khả năng xảy ra lỗi rất cao
May mắn thay, với các phiên bản PHP mới nhất, có một chức năng được gọi là filter_var
giúp loại bỏ sự khó khăn trong việc xác thực dữ liệu.
Cú pháp của hàm filter_var
Trong PHP, hàm filter_var()
này là một công cụ thực sự mạnh mẽ để dọn dẹp và xác thực dữ liệu đầu vào của người dùng. Nó được sử dụng để lọc một biến với bộ lọc được chỉ định, có thể là một trong nhiều bộ lọc được xác định trước. Trên thực tế, bạn cũng có thể sử dụng bộ lọc tùy chỉnh với sự trợ giúp của chức năng gọi lại.
Chúng ta hãy nhanh chóng đi qua cú pháp của hàm filter_var
$variable
: Biến mà bạn muốn lọc.$filter
: ID của bộ lọc mà bạn muốn áp dụng cho tệp$variable
. Nó có thể là bất kỳ bộ lọc được xác định trước nào có sẵn trong PHP hoặc bộ lọc tùy chỉnh của bạn.$options
: Một tham số tùy chọn được sử dụng để chỉ định các tùy chọn bổ sung cho bộ lọc đang được áp dụng. Nó phụ thuộc vào bộ lọc cụ thể mà bạn đang sử dụng.
Hàm filter_var()
trả về giá trị đã lọc nếu bộ lọc thành công hoặc FALSE
nếu bộ lọc thất bại.
Cách làm sạch bằng hàm filter_var
Trong phần này, chúng ta sẽ thảo luận cách bạn có thể làm sạch dữ liệu bằng hàm filter_var
Cách làm sạch email
Bộ lọc FILTER_SANITIZE_EMAIL
được sử dụng để xóa bất kỳ ký tự không hợp lệ nào khỏi địa chỉ email. Nó rất hữu ích trong việc vệ sinh đầu vào của người dùng trước khi nó được lưu trữ hoặc hiển thị.
Chúng ta hãy xem ví dụ sau:
Ví dụ
$email = "test@example.com<script>alert('hello')</script>";
$sanitizedEmail = filter_var($email, FILTER_SANITIZE_EMAIL);
Trong ví dụ trên, biến $email
chứa một địa chỉ email có tập lệnh độc hại được chèn vào đó. Hàm filter_var()
được sử dụng với bộ lọc FILTER_SANITIZE_EMAIL
để loại bỏ bất kỳ ký tự không hợp lệ nào khỏi địa chỉ email. Do đó, địa chỉ email đã được làm sạch thu được sẽ được lưu trữ trong biến $sanitizedEmail
. Nếu bạn cố in nó bằng cách sử dụng echo
, thẻ script và nội dung của nó sẽ bị xóa, chỉ để lại địa chỉ email hợp lệ.
Cách làm sạch URL
Bộ lọc FILTER_SANITIZE_URL
được sử dụng để xóa bất kỳ ký tự không hợp lệ nào khỏi URL. Bộ lọc này hữu ích để lọc dữ liệu đầu vào của người dùng trước khi nó được lưu trữ hoặc hiển thị.
Chúng ta hãy xem ví dụ sau:
Ví dụ
$url = "https://www.example.com/?q=<script>alert('hello')</script>";
$sanitizedUrl = filter_var($url, FILTER_SANITIZE_URL);
Trong ví dụ này, biến $url
chứa một URL có tập lệnh độc hại được đưa vào chuỗi truy vấn. Hàm filter_var()
được sử dụng với bộ lọc FILTER_SANITIZE_URL
để xóa bất kỳ ký tự không hợp lệ nào khỏi URL. Sau đó, URL đã được làm sạch sẽ được lưu trữ trong biến$sanitizedUrl
. Khi URL đã được làm sạch được in bằng cách sử dụng echo
, thẻ script và nội dung của nó sẽ bị xóa.
Cách xác thực bằng hàm filter_var
Trong phần này, chúng ta sẽ thảo luận cách bạn có thể xác thực dữ liệu bằng hàm filter_var
.
Cách xác thực địa chỉ IP
Chúng ta hãy xem ví dụ sau.
Ví dụ
$ip = "127.0.0.1";
if (filter_var($ip, FILTER_VALIDATE_IP)) {
// Valid IP address
} else {
// Invalid IP address
}
Trong ví dụ trên, bộ lọc FILTER_VALIDATE_IP
được sử dụng để kiểm tra xem biến$ip
có chứa địa chỉ IP hợp lệ hay không.
Cách xác thực số nguyên
Chúng ta hãy xem ví dụ sau.
Ví dụ
$foo = "123";
if (filter_var($foo, FILTER_VALIDATE_INT)) {
// Valid integer
} else {
// Invalid integer
}
Trong ví dụ trên, bộ lọc FILTER_VALIDATE_INT
được sử dụng để kiểm tra xem biến $foo
có chứa số nguyên hợp lệ hay không.
Kết hợp tất cả trong Biểu mẫu gửi email
Sau khi đề cập đến các khái niệm về làm sạch và xác thực dữ liệu, chúng ta sẽ sử dụng những kỹ năng này để tạo một biểu mẫu gửi email đơn giản. Mặc dù biểu mẫu sẽ không đạt chất lượng sản xuất nhưng nó sẽ đủ để làm ví dụ cho hướng dẫn này. Biểu mẫu sẽ yêu cầu bốn thông tin:
- Tên
- Địa chỉ email
- Trang chủ
- Tin nhắn
Chúng tôi sẽ làm sạch và xác thực tất cả bốn phần dữ liệu và chỉ gửi email nếu tất cả chúng đều hợp lệ. Nếu bất cứ điều gì không hợp lệ hoặc bất kỳ trường nào bị bỏ trống, chúng tôi sẽ hiển thị biểu mẫu cho người dùng cùng với danh sách các mục cần sửa. Chúng tôi cũng sẽ trả lại dữ liệu đã được lọc sạch cho người dùng trong trường hợp họ không biết ký tự nào là bất hợp pháp.
Bước 1. Tạo biểu mẫu
Đối với bước đầu tiên, chỉ cần tạo một thành phần biểu mẫu có năm trường: bốn trường được liệt kê ở trên và nút gửi.
Ví dụ
<form name="form1" method="post" action="form-email.php">
Name: <br/>
<input type="text" name="name" value="<?php echo $_POST['name']; ?>" size="50" /><br/><br/>
Địa chỉ Email: <br/>
<input type="text" name="email" value="<?php echo $_POST['email']; ?>" size="50"/> <br/><br/>
Trang chủ: <br/>
<input type="text" name="homepage" value="<?php echo $_POST['homepage']; ?>" size="50" /> <br/><br/>
Tin nhắn: <br/>
<textarea name="message" rows="5" cols="50"><?php echo $_POST['message']; ?></textarea>
<br/>
<input type="submit" name="Gửi" />
</form>
Bước 2. Xử lý việc gửi biểu mẫu
Khi biểu mẫu được gửi, dữ liệu sẽ được gửi đến tệp form-email.php .
Hãy tạo tệp form-email.php với nội dung sau.
Ví dụ
<?php
if (isset($_POST['Submit'])) {
if ($_POST['name'] != "") {
$_POST['name'] = filter_var($_POST['name'], FILTER_SANITIZE_STRING);
if ($_POST['name'] == "") {
$errors .= 'Vui lòng nhập tên hợp lệ.<br/><br/>';
}
} else {
$errors .= 'Vui lòng nhập tên của bạn.<br/>';
}
if ($_POST['email'] != "") {
$email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$errors .= "$email <strong>KHÔNG</strong> phải là email hợp lệ.<br/><br/>";
}
} else {
$errors .= 'Vui lòng nhập địa chỉ email của bạn.<br/>';
}
if ($_POST['homepage'] != "") {
$homepage = filter_var($_POST['homepage'], FILTER_SANITIZE_URL);
if (!filter_var($homepage, FILTER_VALIDATE_URL)) {
$errors .= "$homepage <strong>KHÔNG</strong> phải là URL hợp lệ<br/><br/>";
}
} else {
$errors .= 'Vui lòng nhập trang chủ của bạn.<br/>';
}
if ($_POST['message'] != "") {
$_POST['message'] = filter_var($_POST['message'], FILTER_SANITIZE_STRING);
if ($_POST['message'] == "") {
$errors .= 'Vui lòng nhập nội dung tin nhắn để gửi đi.<br/>';
}
} else {
$errors .= 'Vui lòng nhập nội dung tin nhắn để gửi đi.<br/>';
}
Đầu tiên, chúng tôi kiểm tra xem biểu mẫu đã được gửi chưa bằng hàm isset()
. Nếu biểu mẫu đã được gửi, mã xác thực và làm sạch sẽ được thực thi. Chúng tôi kiểm tra từng trường biểu mẫu để xem nó đã được đặt chưa và nếu có, chúng tôi sẽ làm sạch nó bằng các hàm lọc thích hợp từ filter_var()
. Nếu đầu vào của người dùng không hợp lệ hoặc trống, thông báo lỗi tương ứng sẽ được thêm vào biến$errors
.
Ví dụ
if (!$errors) {
$mail_to = 'minhcn@vzn.vn';
$subject = 'Thư mới từ việc gửi biểu mẫu';
$message = 'Từ: ' . $_POST['name'] . "\n";
$message .= 'Địa chỉ Email: ' . $_POST['email'] . "\n";
$message .= 'Trang chủ: ' . $_POST['homepage'] . "\n";
$message .= "Tin nhắn:\n" . $_POST['message'] . "\n\n";
mail($to, $subject, $message);
echo "Cảm ơn vì lá thư của bạn!<br/><br/>";
} else {
echo '<div style="color: red">' . $errors . '<br/></div>';
}
}
?>
Nếu không có lỗi, một email sẽ được gửi bằng hàm mail()
với dữ liệu đầu vào của người dùng đã được chọn lọc. Cuối cùng, mã sẽ hiển thị thông báo cảm ơn nếu email được gửi thành công, nếu không, nó sẽ hiển thị (các) thông báo lỗi nếu có bất kỳ lỗi nào.
Mẹo: Xem thêm Gửi email bằng PHPMailer trong PHP
Phần kết luận
Tôi hy vọng rằng hướng dẫn này đã cung cấp cho bạn một sự giới thiệu hữu ích về các tính năng lọc dữ liệu của PHP. Mặc dù chúng tôi chưa đề cập đến tất cả các quy tắc và chức năng nhưng bạn có thể tìm thêm thông tin trong phần Lọc dữ liệu của sổ tay PHP.