Xác thực biểu mẫu PHP
Trong hướng dẫn này, bạn sẽ học cách làm sạch và xác thực dữ liệu biểu mẫu bằng cách sử dụng bộ lọc PHP.
Dọn dẹp và xác thực dữ liệu biểu mẫu trong PHP
Như bạn đã thấy trong hướng dẫn trước, quá trình thu thập và hiển thị dữ liệu biểu mẫu đã gửi khá đơn giản. Trong hướng dẫn này, bạn sẽ học cách triển khai một biểu mẫu liên hệ đơn giản trên trang web của mình cho phép người dùng gửi nhận xét và phản hồi của họ qua email. Chúng ta sẽ sử dụng cùng một hàm PHP mail() để gửi email.
Chúng ta cũng sẽ triển khai một số tính năng bảo mật cơ bản như làm sạch và xác thực thông tin đầu vào của người dùng để người dùng không thể chèn dữ liệu có thể gây hại làm ảnh hưởng đến bảo mật trang web hoặc có thể phá vỡ ứng dụng.
Sau đây là tập lệnh PHP của chúng ta thực hiện những việc sau:
- Nó sẽ yêu cầu người dùng nhập nhận xét của họ về trang web.
- Tập lệnh tương tự hiển thị biểu mẫu liên hệ và xử lý dữ liệu biểu mẫu đã gửi.
- Tập lệnh làm sạch và xác thực dữ liệu đầu vào của người dùng. Nếu bất kỳ trường bắt buộc nào (được đánh dấu bằng *) bị thiếu hoặc xác thực không thành công do đầu vào không chính xác, tập lệnh sẽ
- hiển thị lại biểu mẫu với thông báo lỗi cho trường biểu mẫu tương ứng.
- Tập lệnh ghi nhớ trường nào người dùng đã điền và điền trước các trường đó khi biểu mẫu hiển thị lại do lỗi xác thực.
- Nếu dữ liệu do người dùng gửi lên có thể chấp nhận được và mọi thứ suôn sẻ, nó sẽ gửi email đến quản trị viên trang web và hiển thị thông báo thành công cho người dùng.
Nhập mã sau vào tệp "contact.php" và lưu trong thư mục gốc dự án của bạn:
Ví dụ
<?php
// Functions to filter user inputs
function filterName($field){
// Sanitize user name
$field = filter_var(trim($field), FILTER_SANITIZE_STRING);
// Validate user name
if(filter_var($field, FILTER_VALIDATE_REGEXP, array("options"=>array("regexp"=>"/^[a-zA-Z\s]+$/")))){
return $field;
} else{
return FALSE;
}
}
function filterEmail($field){
// Sanitize e-mail address
$field = filter_var(trim($field), FILTER_SANITIZE_EMAIL);
// Validate e-mail address
if(filter_var($field, FILTER_VALIDATE_EMAIL)){
return $field;
} else{
return FALSE;
}
}
function filterString($field){
// Sanitize string
$field = filter_var(trim($field), FILTER_SANITIZE_STRING);
if(!empty($field)){
return $field;
} else{
return FALSE;
}
}
// Define variables and initialize with empty values
$nameErr = $emailErr = $messageErr = "";
$name = $email = $subject = $message = "";
// Processing form data when form is submitted
if($_SERVER["REQUEST_METHOD"] == "POST"){
// Validate user name
if(empty($_POST["name"])){
$nameErr = "Please enter your name.";
} else{
$name = filterName($_POST["name"]);
if($name == FALSE){
$nameErr = "Please enter a valid name.";
}
}
// Validate email address
if(empty($_POST["email"])){
$emailErr = "Please enter your email address.";
} else{
$email = filterEmail($_POST["email"]);
if($email == FALSE){
$emailErr = "Please enter a valid email address.";
}
}
// Validate message subject
if(empty($_POST["subject"])){
$subject = "";
} else{
$subject = filterString($_POST["subject"]);
}
// Validate user comment
if(empty($_POST["message"])){
$messageErr = "Please enter your comment.";
} else{
$message = filterString($_POST["message"]);
if($message == FALSE){
$messageErr = "Please enter a valid comment.";
}
}
// Check input errors before sending email
if(empty($nameErr) && empty($emailErr) && empty($messageErr)){
// Recipient email address
$to = 'webmaster@example.com';
// Create email headers
$headers = 'From: '. $email . "\r\n" .
'Reply-To: '. $email . "\r\n" .
'X-Mailer: PHP/' . phpversion();
// Sending email
if(mail($to, $subject, $message, $headers)){
echo '<p class="success">Your message has been sent successfully!</p>';
} else{
echo '<p class="error">Unable to send email. Please try again!</p>';
}
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Contact Form</title>
<style type="text/css">
.error{ color: red; }
.success{ color: green; }
</style>
</head>
<body>
<h2>Contact Us</h2>
<p>Please fill in this form and send us.</p>
<form action="contact.php" method="post">
<p>
<label for="inputName">Name:<sup>*</sup></label>
<input type="text" name="name" id="inputName" value="<?php echo $name; ?>">
<span class="error"><?php echo $nameErr; ?></span>
</p>
<p>
<label for="inputEmail">Email:<sup>*</sup></label>
<input type="text" name="email" id="inputEmail" value="<?php echo $email; ?>">
<span class="error"><?php echo $emailErr; ?></span>
</p>
<p>
<label for="inputSubject">Subject:</label>
<input type="text" name="subject" id="inputSubject" value="<?php echo $subject; ?>">
</p>
<p>
<label for="inputComment">Message:<sup>*</sup></label>
<textarea name="message" id="inputComment" rows="5" cols="30"><?php echo $message; ?></textarea>
<span class="error"><?php echo $messageErr; ?></span>
</p>
<input type="submit" value="Send">
<input type="reset" value="Reset">
</form>
</body>
</html>
Giải thích mã
Chúng ta sẽ đi xem xét ý nghĩa của các mã này.
- Hàm
filterName()
( dòng 3 ) Xác thực giá trị đầu vào như tên của người đó. Tên hợp lệ chỉ có thể chứa các ký tự chữ cái (az, AZ). - Hàm
filterEmail()
( dòng 14 ) Xác thực giá trị đầu vào như địa chỉ email. - Hàm
filterString()
( dòng 25 ) chỉ làm sạch giá trị đầu vào bằng cách tách các thẻ HTML và ký tự đặc biệt. Nó không xác thực giá trị đầu vào so với bất kỳ thứ gì. - Thuộc tính
action="contact.php"
( dòng 111 ) bên trong thẻ<form>
chỉ định rằng cùng một tệp contact.php hiển thị biểu mẫu cũng như xử lý dữ liệu biểu mẫu. - Mã PHP bên trong thuộc tính giá trị của
<input>
và<textarea>
ví dụ:<?php echo $name; ?>
hiển thị giá trị điền trước khi biểu mẫu được hiển thị lại khi có lỗi xác thực. - Mã PHP bên trong
class .error
, ví dụ như<span class="error"><?php echo $nameErr; ?></span>
là lỗi hiển thị cho trường tương ứng.
Phần còn lại những điều chúng tôi đã đề cập trong các chương trước. Để tìm hiểu thêm về làm sạch và xác thực bộ lọc, vui lòng xem phần tham khảo Bộ lọc PHP bên dưới, trong chương sau chúng ta sẽ đi xem xét cách sử dụng của chúng.
Ghi chú: Bạn cần thiết lập một máy chủ thư trên máy của mình để hàm PHP mail()
hoạt động. Nếu bạn muốn triển khai xác thực biểu mẫu, bạn có thể thay thế phần thư (dòng số 81 đến 94) bằng mã tùy chỉnh của riêng bạn.
Hàm lọc trong PHP
Kể từ PHP 5.2.0, các chức năng bộ lọc được bật theo mặc định.Bạn có thể sử dụng chúng trực tiếp trong mã của mình mà không cần cài đặt thêm.
Hàm | Miêu tả |
---|---|
filter_has_var () | Kiểm tra xem có tồn tại biến loại được chỉ định hay không |
filter_id () | Trả về số ID của một bộ lọc được chỉ định |
filter_input () | Nhận một biến bên ngoài cụ thể theo tên và tùy chọn lọc nó |
filter_input_array () | Nhận nhiều biến bên ngoài và tùy chọn lọc chúng |
filter_list () | Trả về một mảng tất cả các bộ lọc được hỗ trợ |
filter_var_array () | Nhận nhiều biến và tùy chọn lọc chúng |
filter_var () | Lọc một biến bằng một bộ lọc được chỉ định |
Bộ lọc làm sạch trong PHP
Bộ lọc làm sạch được sử dụng để làm sạch dữ liệu đầu vào của người dùng.
ID | Miêu tả |
---|---|
FILTER_SANITIZE_EMAIL | Xóa tất cả các ký tự ngoại trừ các chữ cái, chữ số và! # $% & '* + - / =? ^ _ `{|} ~ @. [] |
FILTER_SANITIZE_ENCODED | Chuỗi mã hóa URL, tùy chọn dải hoặc mã hóa các ký tự đặc biệt. |
FILTER_SANITIZE_MAGIC_QUOTES | Nộp đơnaddslashes() . |
FILTER_SANITIZE_NUMBER_FLOAT | Xóa tất cả các ký tự ngoại trừ các chữ số,+ -và tùy chọn., EE |
FILTER_SANITIZE_NUMBER_INT | Loại bỏ tất cả các ký tự trừ các chữ số, dấu cộng (+) và dấu trừ (-). |
FILTER_SANITIZE_SPECIAL_CHARS | HTML-Escape'"<> &và các ký tự có giá trị ASCII nhỏ hơn 32, tùy chọn tách hoặc mã hóa các ký tự đặc biệt khác. |
FILTER_SANITIZE_STRING | Dải thẻ, tùy chọn dải hoặc mã hóa các ký tự đặc biệt. |
FILTER_SANITIZE_STRIPPED | Bí danh của bộ lọc "chuỗi". |
FILTER_SANITIZE_URL | Xóa tất cả các ký tự ngoại trừ các chữ cái, chữ số và$ -_. +! * '(), {} | \\ ^ ~ [] `<> #%"; /?: @ & = |
FILTER_UNSAFE_RAW | Không làm gì cả, tùy chọn tách hoặc mã hóa các ký tự đặc biệt. |
Bộ lọc xác thực trong PHP
Bộ lọc làm sạch được sử dụng để xác thực đầu vào của người dùng.
ID | Miêu tả |
---|---|
FILTER_VALIDATE_BOOLEAN | Trả về TRUE cho "1", "true", "on" và "yes".Trả về FALSE nếu không. |
FILTER_VALIDATE_EMAIL | Xác thực giá trị dưới dạng e-mail. |
FILTER_VALIDATE_FLOAT | Xác thực giá trị dưới dạng float. |
FILTER_VALIDATE_INT | Xác thực giá trị dưới dạng số nguyên tùy chọn từ phạm vi được chỉ định. |
FILTER_VALIDATE_IP | 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ừ phạm vi riêng tư hoặc dành riêng. |
FILTER_VALIDATE_REGEXP | Xác thực giá trị so với regexp, một biểu thức chính quy tương thích với Perl. |
FILTER_VALIDATE_URL | Xác thực giá trị dưới dạng URL, tùy chọn với các thành phần bắt buộc. |