Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Walidacja formularza, zabezpieczenie przed niechcianym kodem
Forum PHP.pl > Forum > Przedszkole
!*!
Mógłby kto¶ wychwycić ewentualne błedy w zabezpieczeniu takiego formularza? Pytania w komętarzach:

  1. <?php
  2. $login = $_POST['login'];
  3. $login = ereg_replace('[^a-zA-Z0-9_]', '', $login); //tylko małe litery, liczby oraz _ ; A-Z jest w wypadku gdyby kto¶ wpisał login z dużej litery.
  4.  
  5. //taki filtr na hasło wystarczy, które  i tak jest kodowane md5?
  6. $haslo = mysql_real_escape_string($_POST['haslo']);
  7. $haslo2 = mysql_real_escape_string($_POST['haslo2']);
  8.  
  9. $imie = ereg_replace('[^a-zA-Z±ˇćĆęĘłŁńŃóÓ¶¦Ľ¬żŻ]', '',$_POST['imie']); // znaki od aA do zZ, polskie
  10. $nazwisko = ereg_replace('[^a-zA-Z±ˇćĆęĘłŁńŃóÓ¶¦Ľ¬żŻ-]', '',$_POST['nazwisko']); // znaki od a do z, polskie oraz my¶link w wypadku naziwska dwuczłonowego.
  11.  
  12. $email = stripslashes(htmlspecialchars(trim($_POST['email'])));
  13.  
  14. //$radio, $dzień, $miesi±c i $rok trzeba filtrować skoro to liczby z selecta? Je¶li tak to czym?
  15. $dzien = $_POST['dzien'];
  16. $miesiac = $_POST['miesiac'];
  17. $rok = $_POST['rok'];
  18. $dataurodzenia = ''.$rok.'-'.$miesiac.'-'.$dzien.'';
  19. $radio = $_POST['plec'];
  20.  
  21. // $kraj, nazwa może być dwuczłonowa np. Wyspa Wielkanocna
  22. $kraj = $_POST['kraj'];
  23. $kraj = ereg_replace('[^a-zA-Z]', '', $kraj); //tylko małe, duże
  24.  
  25. $wojewodztwo = $_POST['wojewodztwo'];
  26. $wojewodztwo = stripslashes(mysql_real_escape_string(trim($wojewodztwo)));
  27. $wojewodztwo = ereg_replace('[^a-zA-Z±ˇćĆęĘłŁńŃóÓ¶¦Ľ¬żŻ-]', '',$wojewodztwo); // znaki od a do z, polskie oraz -
  28.  
  29. $miasto = $_POST['miasto'];
  30. $miasto = ereg_replace('[^a-zA-Z±ˇćĆęĘłŁńŃóÓ¶¦Ľ¬żŻ-]', '',$miasto); // znaki od a do z, polskie
  31. ?>


Sprawdzanie:

  1. <?php
  2. if (isset($_POST['sprawdz']))  
  3. {
  4.  
  5.  
  6. //weryfikacja loginu  
  7. if(strlen($login)<4 or strlen($login)>20 or !eregi("^[a-zA-Z0-9_.]+$",$login)){
  8. $error=1;$errorlogin = "<span class='error'>Akceptowany log: <br />- od 4 do 20 znaków bez polskich liter i spacji.</span>";}
  9. if(!ereg_replace('[^a-z0-9_]', '', $login)){$error=1;$errorlogin = "<span class='error'>Login zawiera niedozwolone znaki.</span>";}
  10.  
  11.              
  12. if (empty($haslo)) {$error=1;$errorhaslo = "<span class='error'>Wypełnij pole hasło</span>";}
  13.  
  14. if ($haslo != $haslo2) {$error=1;$errorhaslo = "<span class='error'>Podane hasła, nie s± takie same.</span>";}
  15.  
  16. if (empty($imie)) {$error=1;$errorimie = "<span class='error'>Wypełnij pole imie.</span>";}
  17.  
  18. if(strlen($imie)<3 or strlen($imie)>64 or !eregi("^[a-zA-Z±ćęłń󶿼ˇĆĘŁŃӦݬ_.]+$",$imie)){$error=1;$errorimie = "<span class='error'>Imię musi mieć min. 3 litery, bez spacji.</span>";}
  19.  
  20. if (empty($nazwisko)) {$error=1;$errornazwisko = "<span class='error'>Wypełnij pole nazwisko.</span>";}
  21.  
  22. if(strlen($nazwisko)<3 or strlen($nazwisko)>64 or !eregi("^[a-zA-Z±ćęłń󶿼ˇĆĘŁŃӦݬ-]+$",$nazwisko)){$error=1;$errornazwisko = "<span class='error'>Nazwisko musi mieć min. 3 litery, bez spacji.</span>";}
  23.  
  24. if (empty($kraj)) {$error=1;$errorkraj = "<span class='error'>Wypełnij pole kraj.</span>";}
  25. if (empty($wojewodztwo)) {$error=1;$errorwojewodztwo = "<span class='error'>Wypełnij pole województwo.</span>";}
  26. if (empty($miasto)) {$error=1;$errormiasto = "<span class='error'>Wypełnij pole miasto.</span>";}
  27.  
  28. //weryfikacja maila
  29. if(!preg_match('|^[_a-z0-9.-]*[a-z0-9]@[_a-z0-9.-]*[a-z0-9].[a-z]{2,3}$|e', $email)){$error=1;$erroremail ="<span class='error'>Niepoprawny email</span>";}
  30.  
  31. if ($radio =='1') {$errorradio = "checked='checked'";}
  32.  
  33. if ($radio =='2') {$errorradio2 = "checked='checked'";}
  34.  
  35. if (empty($radio)) {$error=1;$errorradio3 = "<span class='error'>Zaznacz odpowiedni± opcję</span>";}
  36.  
  37. if ($token != $token2){$error=1;$errortoken = "<span class='error'>Przepisz kod poprawnie</span>";}
  38. ?>


Jak można w metaznakach ograniczyć możliwo¶ć zrobienia tylko jednej spacji ?
kazag
Co do danych z selecta, ja osobi¶cie wymuszam na nich typ (jeżeli s± liczbowe, jeżeli również tekstowe, to filtruje), żeby kto¶ mi jakim¶ cudem nie przesłał czego¶ innego...
Pilsener
Raz robisz ereri, raz pregi - zdecyduj się! Najlepiej dzi¶ robić wszystko na pregach.
Standardowo walidujesz:
- usuwasz kod HTML (htmlspecialchars, striptags)
- usuwasz niedozwolone znaki (addslashes)

I robisz tak DLA KAŻDEGO elementu tablicy post (nieważne, czy select czy radio) - co z tego, że na stronie masz selecta - to tylko interpretacja przegl±darki. Ja Ci mogę przez http wysłać tablicę $_POST['dzien'] zawieraj±c± "urabura" od razu na serwer.

Pola:
imię - pierwsza litera duża, reszta małe, maksymalnie jedna spacja, minimum 3 znaki maksimum 20 - tak, żeby walidowało tylko imiona typu "Jan Maria" etc.
nazwisko - podobnie jak imię, tylko zamiast spacji my¶lnik
email - wiadomo - dodatkowo możesz dać listę akceptowalnych domen, np. @ab.cl, @qw.er
data - sprawdzaj, czy data jest poprawn± dat± gregoriańsk± (checkdate)
kraj i województwo - pierwsza litera duża etc - ja bym dał tu wybór z pola select albo chociaż sprawdzanie w bazie (czy kraj to nie jest ABC)
!*!
Ok, wyszło co¶ takiego:

  1. <?php
  2.  
  3. if (isset($_POST['sprawdz']))  
  4. {
  5.  
  6. $login = $_POST['login'];
  7. #$login = ereg_replace('[^a-zA-Z0-9_ ]', '', $login); //tylko małe litery, liczby oraz _ ; A-Z jest w wypadku gdyby kto¶ wpisał login z dużej litery.
  8.  
  9. echo 'pobrane prze: '.$_POST['login'].'<br />';
  10. echo 'pobrane po: '.$login.'<br/>';
  11. echo 'wysyła do baz: '.mysql_real_escape_string(trim($login)).'<br>';
  12.  
  13. //weryfikacja loginu
  14. if(preg_match("/[A-Z]/",$login)){$error=1;$errorlogin = "<span class='error'>Tylko małe litery.</span>";} //w przypadku pojawienia się dużych liter w wyrazie
  15. if(preg_match("/[ ]/",$login)){$error=1;$errorlogin = "<span class='error'>Wpisz login bez spacji.</span>";} //usuwanie sapcji
  16. if(preg_match("/[!@#$%^&*(){}-=+<>.~;\"'/]/",$login)){$error=1;$errorlogin = "<span class='error'>Login zawiera niedozwolone znaki.</span>";}
  17. if(preg_match("/[±ˇćĆęĘłŁńŃóÓ¶¦Ľ¬żŻ]/",$login)){$error=1;$errorlogin = "<span class='error'>Login nie może mieć polskich znaków.</span>";}
  18. if(strlen($login)<4 or strlen($login)>20 or preg_match("[^a-z0-9_]",$login)){
  19. $error=1;$errorlogin = "<span class='error'>Akceptowany logi: <br />- od 4 do 20 znaków bez polskich liter i spacji.</span>";}
  20. ?>


Teraz jest to odpowiednio zabezpieczone? I nie ma prawa wysłać czego¶ niechcanego do bazy? echo dałem sobie aby sprawdzić czy jest dobrze.
To jest wersja lo-fi głównej zawarto¶ci. Aby zobaczyć pełn± wersję z większ± zawarto¶ci±, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.