Hướng dẫn dùng forms example trong PHP

Các ví dụ này sẽ chỉ ra cách xử lý các biểu mẫu PHP có lưu ý đến tính bảo mật. Việc xác nhận đúng cách dữ liệu biểu mẫu là điều quan trọng để bảo vệ biểu mẫu của bạn khỏi tin tặc và những kẻ gửi thư rác!

Biểu mẫu HTML mà chúng ta sẽ làm việc trong các chương này, chứa các trường input khác nhau: trường văn bản bắt buộc và tùy chọn, nút radio và nút submit:

Các quy tắc xác thực cho biểu mẫu trên như sau

FieldQuy tắc xác thựcNamerequired, yêu cầu bắt buột, bao gồm ký tự và khoảng trắngE-mailrequired, yêu cầu bắt buột, địa chỉ email đúng định dạng [chứa @ và .]Websiteoptional, yêu cầu không bắt buột, chứa URL có giá trịCommentoptional, yêu cầu không bắt buột, chứa nhiều dòng thông tin nhập vàoGenderrequired, yêu cầu bắt buột, chọn một tùy chọn

Trước tiên, chúng ta sẽ xem xét mã HTML thuần túy cho biểu mẫu:

Trường văn bản

Các trường name, email và website là các yếu tố nhập văn bản và trường comment là một vùng văn bản. Mã HTML như sau:

Name: 
E-mail: 
Website: 
Comment: 

Các nút Radio

Các trường giới tính là các nút radio và mã HTML như sau:

Gender:
Female
Male
Other

Phần tử form

Mã HTML của biểu mẫu form như sau

Khi biểu mẫu được gửi, dữ liệu biểu mẫu được gửi với method = "post".

Biến $_SERVER["PHP_SELF"] là gì?

$_SERVER["PHP_SELF"] là một biến siêu toàn cục trả về tên tệp của tập lệnh hiện đang thực thi.

Vì vậy, $_SERVER["PHP_SELF"] sẽ gửi dữ liệu biểu mẫu đã gửi đến chính trang đó, thay vì chuyển sang một 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 với biểu mẫu.

Hàm htmlspecialchars[] là gì?

Hàm htmlspecialchars[] chuyển đổi các ký tự đặc biệt thành các thực thể HTML thông thường. Điều này có nghĩa là nó sẽ thay thế các ký tự đặc biệt HTML như @, #, $ ... . Điều này ngăn những kẻ tấn công khai thác mã bằng cách chèn mã HTML hoặc Javascript [Các cuộc tấn công Tập lệnh chéo trang web] trong các biểu mẫu.

Lưu ý quan trọng về biểu mẫu PHP

Biến $_SERVER["PHP_SELF"] có thể bị hacker sử dụng!

Nếu

Gender:
Female
Male
Other
0 được sử dụng trong trang của bạn thì người dùng có thể nhập dấu gạch chéo [/] rồi thực thi một số lệnh Cross Site Scripting [XSS].

Cross-site scripting [XSS] là một loại lỗ hổng bảo mật máy tính thường thấy trong các ứng dụng Web. XSS cho phép những kẻ tấn công đưa tập lệnh phía máy khách vào các trang Web được người dùng khác xem.

Giả sử chúng ta có biểu mẫu sau trong một trang có tên "test_form.php":

">

Bây giờ, nếu người dùng nhập URL bình thường vào thanh địa chỉ như "//www.example.com/test_form.php", thì đoạn mã trên sẽ được dịch thành:

Tuy nhiên, hãy xem xét rằng người dùng nhập URL sau vào thanh địa chỉ:

//www.example.com/test_form.php/%22%3E%3Cscript%3Ealert['hacked']%3C/script%3E

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

Mã này thêm một thẻ tập lệnh và một lệnh cảnh báo. Và khi tải trang, mã JavaScript sẽ được thực thi [người dùng sẽ thấy một hộp cảnh báo]. Đây chỉ là một ví dụ đơn giản và vô hại về cách khai thác biến PHP_SELF.

Hãy lưu ý rằng bất kỳ mã JavaScript nào cũng có thể được thêm vào bên trong thẻ

Gender:
Female
Male
Other
1

Gender:
Female
Male
Other
2

Gender:
Female
Male
Other
3 của PHP]
  • Xóa dấu gạch chéo ngược [
    Gender:
    Female
    Male
    Other
    4] khỏi dữ liệu đầu vào của người dùng [với hàm dấu gạch chéo ngược [] trong PHP]
  • Bước tiếp theo là tạo một hàm sẽ thực hiện tất cả việc kiểm tra cho chúng ta [điều này thuận tiện hơn nhiều so với việc viết đi viết lại cùng một đoạn mã].

    Chúng ta sẽ đặt tên cho hàm là

    Gender:
    Female
    Male
    Other
    5.

    Bây giờ, chúng ta có thể kiểm tra từng biến

    Gender:
    Female
    Male
    Other
    6 bằng hàm
    Gender:
    Female
    Male
    Other
    5 và tập lệnh như sau:

    Ví dụ

    Ví dụ

    function test_input[$data]{
        $data = trim[$data];
        $data = addslashes[$data];
        $data = htmlspecialchars[$data];
        return $data;
    }
    ?>
    

    Xem kết quả

    Lưu ý rằng khi bắt đầu tập lệnh, chúng ta kiểm tra xem biểu mẫu đã được gửi bằng cách sử dụng biến

    Gender:
    Female
    Male
    Other
    8 hay chưa. Nếu REQUEST_METHOD là POST, thì biểu mẫu đã được gửi, và nó sẽ được xác thực. Nếu nó chưa được gửi, thì bỏ qua xác thực và hiển thị một biểu mẫu trống.

    Tuy nhiên, trong ví dụ trên, tất cả các trường đầu vào là tùy chọn. Tập lệnh hoạt động tốt ngay cả khi người dùng không nhập bất kỳ dữ liệu nào.

    Các biến siêu toàn cục $_GET$_POST trong PHP được sử dụng để thu thập dữ liệu biểu mẫu [form].

    Ví dụ dưới đây hiển thị một biểu mẫu HTML đơn giản với hai trường đầu vào [Name và E-mail] và nút gửi [Submit]:

    
    
    
    
        
            Name:
            
            
    E-mail:

    Đây là kết quả:

    Khi người dùng điền vào biểu mẫu ở trên và nhấp vào nút gửi, dữ liệu biểu mẫu được gửi đến file PHP có tên là "welcome.php" để xử lý. Dữ liệu biểu mẫu được gửi bằng phương thức HTTP POST.

    Để hiển thị dữ liệu đã gửi, bạn chỉ cần duyệt qua tất cả các trường đầu vào [thuộc tính name của thẻ input] bằng cách sử dụng biến siêu toàn cục $_POST. File "welcome.php" trông sẽ như thế này:

    
    
    
    
        Welcome 
        
    Your email address is:

    Đầu ra có thể là một cái gì đó như thế này:

    Welcome Trung Nguyen
    Your email address is trung.nguyen@example.com

    Kết quả tương tự cũng có thể đạt được bằng phương pháp HTTP GET:

    
    
    
    
        
            Name:
            
            
    E-mail:

    File "welcome_get.php" trông sẽ như thế này:

    
    
    
    
        Welcome 
        
    Your email address is:

    Mã ở trên khá đơn giản. Tuy nhiên, một điều quan trọng còn thiếu là xác thực dữ liệu đầu vào do người dùng nhập. Bạn cần xác thực dữ liệu biểu mẫu để bảo vệ tập lệnh của bạn khỏi mã độc.

    Hãy đảm bảo tính BẢO MẬT khi xử lý các biểu mẫu PHP!

    Trang này không chứa bất kỳ xác thực biểu mẫu nào, nó chỉ hiển thị cách bạn có thể gửi và truy xuất dữ liệu biểu mẫu.

    Tuy nhiên, các trang tiếp theo sẽ chỉ ra cách xử lý các biểu mẫu PHP với tính bảo mật! Xác thực hợp lệ dữ liệu biểu mẫu là rất quan trọng để bảo vệ biểu mẫu của bạn khỏi tin tặc và kẻ gửi thư rác!

    GET với POST

    Cả GET và POST đều tạo một mảng [ví dụ: mảng [key1 => value1, key2 => value2, key3 => value3, ...]]. Mảng này chứa các cặp khóa / giá trị, trong đó các khóa là tên của các trường đầu vào của biểu mẫu [thuộc tính name của các thẻ input như ở ví dụ trên] và giá trị là dữ liệu đầu vào từ người dùng.

    Cả GET và POST đều được coi là các $_GET$_POST. Đây là các biến siêu toàn cục, có nghĩa là chúng luôn có thể truy cập được, bất kể phạm vi - và bạn có thể truy cập chúng từ bất kỳ hàm, lớp hoặc file nào mà không phải làm gì đặc biệt.

    $_GET là một mảng các biến được truyền cho tập lệnh hiện tại thông qua các tham số URL.

    $_POST là một mảng các biến được truyền cho tập lệnh hiện tại thông qua phương thức HTTP POST.

    Khi nào nên sử dụng GET?

    Thông tin được gửi từ một biểu mẫu với phương thức GET được hiển thị cho mọi người [tất cả tên và giá trị biến được hiển thị trong URL].

    GET cũng có giới hạn về số lượng thông tin cần gửi. Giới hạn là khoảng 2000 ký tự. Tuy nhiên, vì các biến được hiển thị trong URL, nên nó có thể được sử dụng để đánh dấu trang. Điều này có thể hữu ích trong một số trường hợp.

    GET có thể được sử dụng để gửi các dữ liệu không nhạy cảm.

    Lưu ý: KHÔNG BAO GIỜ sử dụng GET để gửi mật khẩu hoặc các thông tin nhạy cảm khác!

    Khi nào nên sử dụng POST?

    Thông tin được gửi từ một biểu mẫu bằng phương thức POST là vô hình đối với người khác [tất cả tên / giá trị được nhúng trong phần thân của yêu cầu HTTP] và không có giới hạn về số lượng thông tin cần gửi.

    Ngoài ra, POST hỗ trợ chức năng nâng cao như hỗ trợ đầu vào nhị phân nhiều phần [multi-part binary input] trong khi tải file lên máy chủ.

    Chủ Đề