PHP Cơ bản
PHP Nâng cao
PHP & Cơ sở dữ liệu MySQL
Ví dụ PHP
Tài liệu tham khảo PHP
Quảng cáo

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> <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 đơn addslashes().
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.

Bài viết này đã giúp ích cho bạn?

Advertisements