Walidacja formularzy PHP
- Poprzednia strona Przetwarzanie formularzy PHP
- Następna strona Formularz PHP wymagający wypełnienia
Ten rozdział i następny wyjaśniają, jak używać PHP do walidacji danych formularza.
Walidacja formularzy PHP
Wskazówka:Podczas przetwarzania formularzy PHP warto zwracać uwagę na bezpieczeństwo!
Te strony będą pokazywać, jak bezpiecznie przetwarzać formularze PHP. Poprawna walidacja danych formularza HTML jest ważna dla zapobiegania atakom hakerów i spamowi!
HTML formularze, które będziemy używać później, zawierają różne pola wejściowe: wymagane i opcjonalne pola tekstowe, przyciski radiowe oraz przycisk wysyłania:
Powyższy formularz używa następujących reguł walidacji:
Pole | Reguły walidacji |
---|---|
Imię | Wymagane. Musi zawierać litery i spacje. |
Wymagane. Musi zawierać ważny adres e-mail (zawierający @ i .). | |
Strona internetowa | Opcjonalne. Jeśli jest wypełniane, musi zawierać ważny adres URL. |
Komentarz | Opcjonalne. Wielewierszowe pole wejściowe (pole tekstowe). |
Płeć | Wymagane. Musisz wybrać jedną z opcji. |
Najpierw przyjrzyjmy się czystemu kodowi HTML tego formularza:
Pola tekstowe
Pola name, email i website to pola tekstowe, pole comment to pole tekstowe.
Imię: <input type="text" name="name"> E-mail: <input type="text" name="email"> Strona internetowa: <input type="text" name="website"> Komentarz: <textarea name="comment" rows="5" cols="40"></textarea>
Przyciski radiowe
Pole gender to przycisk radiowy, kod HTML wygląda tak:
Płeć: <input type="radio" name="gender" value="female">Kobiecy <input type="radio" name="gender" value="male">Męski
Elementy formularza
Kod HTML formularza wygląda tak:
<form method="post" action="<?php echo htmlspecialchars(<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>);
Podczas wysyłania tego formularza dane formularza są wysyłane za pomocą method="post".
Czym jest zmienna $_SERVER["PHP_SELF"]?
$_SERVER["PHP_SELF"] to zmienna superglobalna, która zwraca nazwę pliku skryptu, który jest obecnie wykonywany.
Dlatego $_SERVER["PHP_SELF"] wysyła dane formularza do samej strony, zamiast przenosić użytkownika na inną stronę. W ten sposób użytkownik może uzyskać informacje o błędach na stronie formularza.
Co to jest funkcja htmlspecialchars()?
Funkcja htmlspecialchars() zamienia specjalne znaki na entycje HTML. Oznacza to, że znaki HTML takie jak < i > zostaną zastąpione przez < i >. W ten sposób można zapobiec atakom, w których atakujący mogą wprowadzić HTML lub JavaScript do formularza (atak cross-site scripting).
Ważna wskazówka dotycząca bezpieczeństwa formularzy PHP
Zmienna $_SERVER["PHP_SELF"] może być wykorzystana przez hakerów!
Jeśli Twoja strona używa PHP_SELF, użytkownik może wprowadzić podkreślenie i wykonać cross-site scripting (XSS).
Wskazówka:Cross-site scripting (XSS) to typ luk bezpieczeństwa komputerowego, który jest powszechny w aplikacjach webowych. XSS pozwala atakującym na wprowadzenie klientowskiego skryptu do stron internetowych przeglądanych przez innych użytkowników.
Załóżmy, że nasza strona o nazwie "test_form.php" zawiera następujący formularz:
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
Teraz, jeśli użytkownik wejdzie na normalny URL w pasku adresu: "http://www.example.com/test_form.php", powyższy kod zostanie przekształcony w:
<form method="post" action="test_form.php">
Do tej pory wszystko jest w porządku.
Jednak, jeśli użytkownik wpisze następujący URL w pasku adresu:
http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E
W tym przypadku, powyższy kod zostanie przekształcony w:
<form method="post" action="test_form.php"/><script>alert('hacked')</script>
Ten kod dodaje skrypt i polecenie podpowiedzi. I kiedy strona ta zostanie załadowana, skrypt JavaScript zostanie uruchomiony (użytkownik zobaczy okno podpowiedzi). To jest tylko prosty, nieszkodliwy przykład tego, jak zmienna PHP_SELF jest używana.
Powinien pan to zauważyć Tag <script> pozwala na dodanie dowolnego kodu JavaScript!Haker może przekierować użytkownika do pliku na innym serwerze, w którym znajduje się złośliwy kod, który może zmienić globalne zmienne lub przesłać formularz do innego adresu, aby zachować dane użytkownika itp.
Jak uniknąć wykorzystania $_SERVER["PHP_SELF"]?
Użycie funkcji htmlspecialchars() pozwala uniknąć wykorzystania $_SERVER["PHP_SELF"].
Kod formularza wygląda tak:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Funkcja htmlspecialchars() konwertuje znaki specjalne na entuty HTML. Teraz, jeśli użytkownik spróbuje wykorzystać zmienną PHP_SELF, wywoła następujący wyjście:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>">
Nie można go wykorzystać, nie ma zagrożenia!
Weryfikacja danych formularza za pomocą PHP
Pierwszą rzeczą, którą musimy zrobić, jest przekazanie wszystkich zmiennych za pomocą funkcji PHP htmlspecialchars().
Po użyciu funkcji htmlspecialchars() jeśli użytkownik spróbuje przesłać następujące zawartość w polu tekstowym:
<script>location.href('http://www.hacked.com')</script>
- Kod nie zostanie wykonany, ponieważ zostanie zapisany jako kod ucieczkowy, tak jak tutaj:
<script>location.href('http://www.hacked.com')</script>
Teraz to kod jest bezpieczny do wyświetlenia na stronie lub w e-mailu.
Kiedy użytkownik przesyła formularz, musimy zrobić jeszcze dwie rzeczy:
- (Poprzez funkcję PHP trim()) usuwamy niepotrzebne znaki z danych wejściowych użytkownika (nadmiarowe spacje, tabulatory, wiersze końcowe)
- (Poprzez funkcję PHP stripslashes()) usuwamy反斜杠(\)z danych wejściowych użytkownika
Następnie tworzymy funkcję sprawdzającą (jest to bardziej efektywne niż pisanie kodu wielokrotnie).
Nazywamy funkcję test_input()。
Teraz jesteśmy w stanie sprawdzić każdą zmienną $_POST za pomocą funkcji test_input(),skrypt wygląda tak:
Przykład
<?php // Definiowanie zmiennych i ustawianie ich na wartość pustą $name = $email = $gender = $comment = $website = ""; if ($_SERVER["REQUEST_METHOD"] == "POST") { $name = test_input($_POST["name"]); $email = test_input($_POST["email"]); $website = test_input($_POST["website"]); $comment = test_input($_POST["comment"]); $gender = test_input($_POST["gender"]); } function test_input($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; } ?>
Proszę zauważyć, że na początku skryptu sprawdziliśmy, czy formularz został wysłany za pomocą $_SERVER["REQUEST_METHOD"]. Jeśli REQUEST_METHOD to POST, formularz został wysłany - i powinien być zweryfikowany. Jeśli nie został wysłany, pominąć weryfikację i wyświetlić pusty formularz.
Jednak w powyższym przykładzie wszystkie pola wejściowe są opcjonalne. Nawet jeśli użytkownik nie wprowadzi żadnych danych, skrypt będzie działał poprawnie.
Następny krok to utworzenie wymaganych pól wstępnych oraz utworzenie komunikatów błędów, które będą używane w razie potrzeby.
- Poprzednia strona Przetwarzanie formularzy PHP
- Następna strona Formularz PHP wymagający wypełnienia