Ten i kolejne rozdziały pokazują, jak korzystać z PHP do sprawdzania poprawności danych formularza.
PHP Walidacja formularza
Pomyśl bezpieczeństwa podczas przetwarzania formularzy PHP!
Te strony pokaże sposób przetwarzania formularzy PHP z myślą o bezpieczeństwie. Właściwa weryfikacja formularza danych jest ważne, aby chronić swoją formę przed atakami hakerów i spamerów!
Formularz HTML będziemy pracować w tych rozdziałach, zawiera różne pola wejściowe: wymagane i opcjonalne pola tekstowe, przyciski radiowe i przycisk złożyć:
Zasady walidacji dla postaci powyżej są następujące:
Pole | Zasady walidacji |
---|---|
Nazwa | Wymagany. + Musi zawierać tylko litery i spacje |
Wymagany. + Musi zawierać poprawny adres e-mail (with @ and .) | |
Stronie internetowej | Opcjonalny. Jeżeli występuje, musi zawierać poprawny adres URL |
Komentarz | Opcjonalny. Pole wprowadzania multi-line (textarea) |
Płeć | Wymagany. Należy wybrać jedną |
Najpierw patrzymy na zwykły kod HTML w postaci:
Pola tekstowe
Imię i nazwisko, adres e-mail i www są elementy pola wprowadzania tekstu, a pole komentarz jest textarea. Kod HTML wygląda następująco:
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>
Przyciski radiowe
Pola płci są przyciski radiowe i kod HTML wygląda następująco:
Gender:
<input type="radio" name="gender"
value="female">Female
<input type="radio" name="gender" value="male">Male
Postać element
Kod HTML formularza wygląda następująco:
<form method="post" action="<?php echo
htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Po wysłaniu formularza, dane formularz jest przesyłany z method = „post”.
Jaki jest [ "PHP_SELF"] zmienna $ _SERVER?
Parametr $ _SERVER [ „PHP_SELF”] jest bardzo zmienna globalna, która zwraca nazwę pliku skryptu aktualnie wykonującego.
Tak, $ _SERVER [ „PHP_SELF”] wysyła przedstawione dane formularza do samej strony, zamiast skoków do innej strony. W ten sposób, użytkownik otrzyma komunikaty o błędach na tej samej stronie, co formularz.
Co to jest htmlspecialchars() funkcja?
htmlspecialchars() konwertuje znaki specjalne do podmiotów HTML. Oznacza to, że będzie on zastąpić znaki HTML jak <i> z & lt; i & gt ;. Uniemożliwia to napastnikowi z wykorzystania kodu poprzez wstrzyknięcie kodu HTML lub JavaScript (Cross-site Scripting attacks) w formach.
Big Uwaga na PHP Form Bezpieczeństwa
Parametr $ _SERVER [ „PHP_SELF”] zmienna może być wykorzystane przez hakerów!
Jeśli PHP_SELF jest używany na stronie, a następnie użytkownik może wprowadzić ukośnik (/) , a następnie kilka Cross Site Scripting (XSS) polecenia do wykonania.
Cross-site scripting (XSS) jest rodzajem luki w zabezpieczeniach komputera zwykle w aplikacjach WWW. XSS pozwala napastnikowi wstrzyknąć skrypt po stronie klienta do stron internetowych przeglądanych przez innych użytkowników.
Załóżmy, że mamy następującą formę na stronie o nazwie "test_form.php" :
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
Teraz, gdy użytkownik wchodzi w normalny URL w pasku adresu jak "http://www.example.com/test_form.php" , powyższy kod zostanie przetłumaczony na:
<form method="post" action="test_form.php">
Jak na razie dobrze.
Uważa jednak, że użytkownik wpisze następujący adres 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 przetłumaczony na:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>
Ten kod dodaje tag skryptu i polecenia alertu. I po załadowaniu strony, kod JavaScript zostanie wykonana (the user will see an alert box) . To jest tylko prosty i nieszkodliwy przykład jak zmienna PHP_SELF można wykorzystać.
Bądź świadomy, że każdy kod JavaScript można dodawać wewnątrz <script> tagu! Haker może przekierować użytkownika do pliku na innym serwerze, i że plik może zawierać złośliwy kod, który może zmienić zmienne globalne lub przesłać formularz na inny adres, aby zapisać dane użytkownika, na przykład.
Jak uniknąć $ _SERVER [ "PHP_SELF"] Exploits?
$ _SERVER [ ""] PHP_SELF wykorzystuje można uniknąć stosując htmlspecialchars() funkcyjnych.
Kod formularz powinien wyglądać następująco:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
htmlspecialchars() konwertuje znaki specjalne do podmiotów HTML. Teraz, gdy użytkownik próbuje wykorzystać zmienną PHP_SELF, spowoduje to w następujący wynik:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>">
Exploit próba nie powiedzie się, i nie szkodzie!
Walidacji danych formularza z PHP
Pierwszą rzeczą, jaką możemy zrobić, to przekazać wszystkie zmienne poprzez PHP, htmlspecialchars() funkcja.
Kiedy używamy htmlspecialchars() funkcji; wtedy, gdy użytkownik próbuje przedstawić następujące informacje w polu tekstowym:
<Script> lokalizacja. href('http://www.hacked.com') </ script>
- To nie będzie stracony, ponieważ byłoby to zapisane jako HTML kod uciekł, podobnie jak to:
I LT; scenariusz & gt; lokalizacja. href('http://www.hacked.com') i LT; / skrypt & gt;
Kod jest teraz bezpieczny mają być wyświetlane na stronie lub wewnątrz e-mail.
Będziemy również zrobić dwie rzeczy, gdy użytkownik wysyła formularz:
- Strip niepotrzebnych znaków (extra space, tab, newline) od danych wejściowych użytkownika (with the PHP trim() funkcji)
- Usuń backslashy (\) od danych wejściowych użytkownika (with the PHP stripslashes() funkcja)
Następnym krokiem jest stworzenie funkcji, która zrobi wszystko, sprawdzanie dla nas (which is much more convenient than writing the same code over and over again) .
Będziemy wymienić funkcję test_input() .
Teraz możemy sprawdzić każdą zmienną $ _POST z test_input() funkcji, a skrypt wygląda tak:
Przykład
<?php
// define variables and set to empty values
$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;
}
?>
Uruchomić przykład » Zauważ, że na początku skryptu, możemy sprawdzić, czy formularz został złożony przy użyciu $ _SERVER [ „REQUEST_METHOD”]. Jeśli REQUEST_METHOD jest POST, a następnie formularz został złożony - i powinno zostać zatwierdzone. Jeśli nie został złożony, należy pominąć sprawdzanie i wyświetlanie pustego formularza.
Jednak w powyższym przykładzie, wszystkie pola wejściowe są opcjonalne. Skrypt działa poprawnie nawet jeśli użytkownik nie wprowadzać żadnych danych.
Następnym krokiem jest stworzenie wymaganych pól wejściowych i tworzyć komunikaty o błędach, jeśli potrzebne.