Validation Form - Xây dựng tính hợp lệ của dữ liệu form trong PHP - Fedu

CHÀO MỪNG BẠN ĐẾN VỚI THƯ VIỆN HỌC TẬP & ĐÀO TẠO CƠ BẢN

Validation Form – Xây dựng tính hợp lệ của dữ liệu form trong PHP

Biểu mẫu trong HTML ở chương này gồm các biến dữ liệu đầu vào đòi hỏi thông tin bắt buộc và đa dạng, gồm nút radio và nút submit:

PHP Form Validation Example

* required field.

Name: 
 * 

E-mail: 
 * 

Website: 
 

Comment: 
 

Gender:  Female  Male * 

Submit
Your Input:


Các quy tắc xác nhận trong biểu mẫu trên được thể hiện dưới dạng sau:

Field	Validation Rules
Name	Required. + Must only contain letters and whitespace
E-mail	Required. + Must contain a valid email address (with @ and .)
Website	Optional. If present, it must contain a valid URL
Comment	Optional. Multi-line input field (textarea)
Gender	Required. Must select one

Trước tiên, chúng ta sẽ xem xét dạng code trong HTML:



Text fiels

Tên, email và các dữ liệu của website là những nhân tố đầu vào bằng văn bản, còn các thông tin trong mục bình luận là một vùng văn bản. Đoạn mã code HTML được biểu thị dưới dạng như sau:

Name: <input type="text" name="name">
E-mail: <input type="text" name="email">
Website: <input type="text" name="website">
Comment: <textarea name="comment" rows="5" cols="40"></textarea>

Nút radio

Những thông tin thuộc về giới tính là những nút radio và đoạn code HTML được biểu thị như sau:

Gender:
<input type="radio" name="gender" value="female">Female
<input type="radio" name="gender" value="male">Male

Các yếu tố của dạng Form:

Đoạn mã code HTML được biểu thị như sau:

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

Khi mẫu được gửi đến, dữ liệu trong biểu mẫu sẽ được gửi bằng phương pháp = “ post”

Do vậy, $_SERVER[“PHP_SELF”] gửi dữ liệu mẫu được biểu thị đến trang đích thay vì bị nhảy sang trang khác. Bằng cách này, người dùng sẽ nhận được thông báo lỗi trên cùng một trang.


Những lưu ý về vấn đề bảo mật Form trong PHP

$_SERVER[“PHP_SELF”] có thể bị các hacker sử dụng!

Nếu PHP_SELF được sử dụng trong một trang, người dùng có thể truy cập, thêm một dấu gạch chéo (/) cùng một số Cross-site Scripting (XSS) để thực hiện lệnh.

Giả sử chúng ta có mẫu trong một trang được đặt tên là “test_form.php”:

<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">

Bây giờ, nếu người dùng nhấn một đường link URL thông thường có địa chỉ như sau: “http://www.example.com/test_form.php”, đoạn mã code trên sẽ được dịch thành:

<form method="post" action="test_form.php">

Cho đến hiện tại, đoạn code này cho thấy mọi việc vẫn đang tốt đẹp.

Tuy nhiên, giả sử nếu người dùng nhấp một đường link URL theo địa chỉ sau:

http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E

Trong trường hợp này, đoạn mã code trên sẽ được dịch thành:

<form method="post" action="test_form.php/"><script>alert('hacked')</script>

Mã code này thêm một thẻ script và hiển thị cảnh báo cho người dùng. Khi trang được tải xuống, đoạn mã code JavaScript sẽ được thực hiện ( người dùng sẽ nhìn thấy một ô cảnh báo). Đây chỉ là một ví dụ đơn giản và vô hại cho thấy PHP_SELF có thể được khai thác ra sao.

Lưu ý rằng bất kì đoạn mã code JavaScript nào đều có thể thêm vào bên trong thẻ <script>. Do đó, hacker có thể trực tiếp đột nhập được vào file dữ liệu và server của người dùng. File đó có thể chứa những đoạn mã code làm thay đổi biến toàn cầu ( global) hoặc gửi biểu mẫu đến địa chỉ khác để lưu dữ liệu của người dùng.


Làm sao để tránh Avoid $_SERVER[“PHP_SELF”] được khai thác

$_SERVER[“PHP_SELF”] có thể tránh bằng cách sử dụng hàm htmlspecialchars()

Dạng code lúc này sẽ hiển thị như sau:

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

Hàm htmlspecialchars() giúp chuyển đổi các kí tự đặc biệt thành cho các đối tượng HTML. Bây giờ, nếu người dùng cố khai thác biến PHP_SELF, nó sẽ ra kết quả  như sau:

<form method="post" action="test_form.php/&quot;&gt;&lt;script&gt;alert('hacked')&lt;/script&gt;">

Nếu người dùng không thể khai thác được nhiều thông tin thì hàm này cũng không gây hại cho người sử dụng.


Xác nhận dạng dữ liệu bằng PHP

Đầu tiên chúng ta phải kiểm tra tất cả các biến qua hàm htmlspecialchars() function trong PHP.

Khi người dùng sử dụng hàm htmlspecialchars(), họ sẽ nhận được đoạn dữ liệu dạng text như sau: <script>location.href(‘http://www.hacked.com’)</script>

Điều này sẽ không được thực hiện bởi nó được lưu dưới dạng HTML thoát mã, điều này được biểu thị như sau: &lt;script&gt;location.href(‘http://www.hacked.com’)&lt;/script&gt;

Mã code này hiện tại an toàn được hiển thị trên một trang hoặc trong email.

Chúng tôi cũng sẽ làm hai thứ hơn nữa khi người dùng gửi các dạng:

1.   Dải kí tự không cần thiết ( không gian riêng, tab, dòng mới) từ dữ liệu đầu vào của người dùng ( với hàm ()trim trong PHP).

2.   Hủy bỏ nút (\) từ dữ liệu của người dùng nhập vào ( với stripslashes())

Bước tiếp theo là tạo một hàm mới để kiểm tra tất cả các hàm vừa làm (điều này thuận tiện hơn việc viết một mã code tương tự và lặp lại).

Chúng ta sẽ đặt tên hàm test_input().

Bây giờ, chúng ta có thể kiểm tra các biến $_POST với hàm test_input(), đoạn mã code sẽ được biểu hiện như sau:

Lưu ý: Ở đoạn bắt đầu của biểu mẫu, người dùng cần kiểm tra mẫu bằng hàm $_SERVER[“REQUEST_METHOD”]. Nếu hàm REQUEST_METHOD là dạng POST, form sẽ được gửi đi – và nó sẽ được xác nhận. Nếu nó không được gửi đến, tiếp tục xác nhận và hiển thị ở dạng trắng.

Tuy nhiên ở ví dụ trên, các dữ liệu đầu vào đều ở dạng tùy chọn. Do đó, các biểu mẫu luôn hoạt động tốt ngay cả khi người dùng không nhập dữ liệu.

Bước tiếp theo là tạo ra các dữ liệu đầu vào cần thiết và tạo các thông báo lỗi khi cần thiết.

 

Tham khảo thêm các khóa học lập trình web từ Front-end đến Back-end do trực tiếp giảng viên quốc tế trường FPT Arena giảng dạy giúp bạn thành thạo kỹ năng lập trình web từ CƠ BẢN – NÂNG CAO với giá chỉ từ 290,000đ: