Kỹ thuật lập trình PHP Lập trình PHP

Bài 11: Xác thực dữ liệu đầu vào từ form trong lập trình PHP

I. Tại sao phải xác thực dữ liệu trong Form?

Tất cả mọi dữ liệu do người dùng nhập vào form, gõ vào URL là dữ liệu đến từ những nguồn không an toàn. Do đó chúng ta cần phải xác thực những dữ liệu này trước khi xử lý chúng vì lý do bảo mật.

Trước khi đi vào bài này, chúng tôi sẽ cho bạn xem một ví dụ về một hình thức tấn công từ form. Chúng tôi sử dụng lại ví dụ ở bài trước. Ở input họ tên, chúng tôi nhập vào:

<script>alert("Website hacked");</script>

Hình 57 Nhập đoạn script vào input họ tên

Hình 58 Thông báo website bị hack

Đây là một hình thức tấn công Cross-site scripting (XSS), cho phép hacker chèn các đoạn script nguy hiểm vào website bị lỗi này. Cụ thể source code của file xuly.php khi nhận dữ liệu như sau:

Hình 59 Đoạn mã bị chèn vào phần Họ tên

II. Xác thực dữ liệu

a. Hàm htmlspecialchars()

Hàm htmlspecialchars(string) trả về một chuỗi mà trong đó các kí tự đặc biệt đã được chuyển thành kí tự html. Sử dụng lệnh này nhằm tránh các trường hợp người dùng nhập vào các kí tự đặc biệt như ở ví dụ trong phần I.

Ví dụ, sửa lại file xuly.php:

Xin chào <?php echo htmlspecialchars($_POST['hoten']); ?><br />
Email của bạn là <?php echo htmlspecialchars($_POST['email']); ?><br />
Giới tính là: <?php echo htmlspecialchars($_POST['gioitinh']); ?>

Khi chạy lại ví dụ trong phần I thì đoạn code nhập vào ô họ tên sẽ được chuyển lại như sau:

Hình 60 Các thẻ script đã được chuyển đổi

III. Loại bỏ các kí tự không cần thiết

Các kí tự không cần thiết như khoảng trắng, tab, xuống dòng. Ngoài ra còn có dấu \ cũng cần được quan tâm. Các lệnh sau đây sẽ giúp chúng ta làm những công việc trên:

  • trim : xóa các kí tự trắng dư thừa ở hai đầu chuỗi.
  • stripslashes : bỏ dấu \ trong chuỗi.

Chúng tôi viết một hàm để làm tất cả những việc đã nêu để xác thực dữ liệu (sửa file xuly.php):

<?php
function XacThuc($str) {
$str = htmlspecialchars($str);
$str = trim($str);
$str = stripslashes($str);
return $str;
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Form demo</title>
</head>
<body>
Xin chào <?php echo XacThuc($_POST['hoten']); ?><br />
Email của bạn là <?php echo XacThuc($_POST['email']); ?><br />
Giới tính là: <?php echo XacThuc($_POST['gioitinh']); ?>
</body>
</html>

Chúng ta đã làm cho đoạn mã trở nên an toàn hơn.