Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Zabezpieczenie formularza do oceny
lol75
post 24.05.2013, 14:45:16
Post #1





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 14.03.2011

Ostrzeżenie: (0%)
-----


Cześć
Moim celem jest stworzenie bezpiecznego formularza zbierającego dane osobowe. Zależy mi bardzo na bezpieczeństwie, ponieważ nie chcę, aby wyciekły nr PESEL, nr dowodu osobistego i inne dane.

Stronę buduję prawie całkowicie w HTMLu - pomyślałem bowiem, że skoro potrzebuję jedynie formularza otoczonego estetycznymi obrazkami i kilkoma zdaniami wprowadzenia, ze względów bezpieczeństwa nie ma sensu zaprzęgania jakiegoś CMSa.

Wysyłam więc do przeglądarki nieco obrazków i statycznych tekstów za pomocą tagów HTML.

Pośród tego wszystkiego zrobiłem jeden formularz w PHP, w którym stosuję kilka pół testowych oraz pól typu select (rozwijalnych list).

Następny skrypt odbiera te formularze (metodą POST) i:

1. Filtruje:
  1. $imie = $funkcjeObject->filtrujDaneZewnetrzne($_POST['imie']);

gdzie metoda filtrujDane wygląda następująco:
  1. public function filtrujDane($zmienna)
  2. {
  3. $zmiennaCleanTemp = htmlentities($zmienna, ENT_QUOTES, 'UTF-8');
  4. $zmiennaClean = strip_tags($zmiennaCleanTemp);
  5.  
  6. return $zmiennaClean;
  7. }


Czyli zmienna poddawana jest najpierw funkcji htmlentities a później strip_tags.

2. Następnie dane te porównywane są do wzorca jakiego się spodziewam.

W przypadku pól tekstowych:
  1. $clean = array( );
  2.  
  3. if(ctype_alnum($imie))
  4. {
  5. $clean['imie'] = $funkcjeObject->filtrujDaneZewnetrzne($_POST['imie']);
  6. }

czyli jeśli zmienna $imie pobrana z POST jest alfanumeryczna, wtedy jeszcze raz pobieram ją z POST i umieszczam w tablicy $clean. Będą w niej znajdować się czyste dane.

W przypadku pól select sprawdzam tak:
  1. switch ($kurs)
  2. {
  3. case 1:
  4. case 2:
  5. case 3:
  6. $clean['kurs'] = $funkcjeObject->filtrujDaneZewnetrzne($_POST['kurs']);
  7. }


Czyli jeśli otrzymam wartość 1, 2 lub 3 - jeszcze raz pobieram POSTem i ładuję do tablicy $clean.

Muszę teraz zapisać dane w bazie. W tym celu sprawdzam, czy długość zmiennych jest większa od 0 (czyli czy wypełniono wszystkie pola obowiązkowe) i formuje z tego instrukcję INSERT.

Zanim to jednak nastąpi, tuż przed umieszczeniem w bazie traktują je funkcją mysql_real_escape_string

  1. public function filtrujDaneDoWpisaniaDoBazy($zmienna)
  2. {
  3. $mysql = array();
  4.  
  5. $mysql['zmienna'] = mysql_real_escape_string($zmienna);
  6.  
  7. return $mysql['zmienna'];
  8. }

aby dodać znaki ucieczki do niebezpiecznych znaków.

Dodatkowo nie wyświetlam żadnych zmiennych przez echo, jedynie suche zdanie "Dziękujemy za rejestrację w naszym serwisie" (zdanie to jest w pełni statyczne).

Aha. Zrobiłem tak, że strona internetowa wrzuca dane do bazy tymczasowej i tylko do niej ma dostęp. Moderator uruchamiając aplikację do zarządzania danymi zostanie poinformowany o nowych klientach i jeśli wzrokowo będzie z nimi wszystko w porządku, jednym przyciskiem przeniesie je do bazy produkcyjnej.
Moderator nie jest niestety informatykiem.

Co sądzicie o takich zabezpieczeniach?

Ten post edytował lol75 24.05.2013, 15:01:13
Go to the top of the page
+Quote Post
Resurrection
post 24.05.2013, 15:15:53
Post #2





Grupa: Zarejestrowani
Postów: 82
Pomógł: 1
Dołączył: 23.02.2012

Ostrzeżenie: (0%)
-----


wykorzystaj SSL
Go to the top of the page
+Quote Post
lol75
post 24.05.2013, 17:03:35
Post #3





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 14.03.2011

Ostrzeżenie: (0%)
-----


Dzięki. Rzeczywiście tak zrobię.

Tu jeszcze jest jedna sprawa, którą chciałbym przedyskutować. Zamierzam umieścić stronę i aplikację na serwerze home.pl lub nazwa.pl.

Jak myślicie - to duże ryzyko?

Nie mam innego wyjścia.
Go to the top of the page
+Quote Post
gothye
post 24.05.2013, 17:05:32
Post #4





Grupa: Zarejestrowani
Postów: 702
Pomógł: 65
Dołączył: 16.03.2009

Ostrzeżenie: (0%)
-----


bibliotekę mysql_* zamień na PDO i binduj dane . Do tego zabezpiecz formularz za pomocą CSRF


--------------------
Nie udzielam pomocy poprzez PW
Go to the top of the page
+Quote Post
wizarts
post 24.05.2013, 20:09:52
Post #5





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 19.11.2012

Ostrzeżenie: (0%)
-----


Nie za bardzo rozumiem, co mają wspólnego te funkcje filtrujące dane z zabezpieczeniem przed wypłynięciem danych ( z formularza ? , bazy danych ? ).

Nie lepiej użyć zamiast funkcji filtrujących wyrażenia regularne ?
Dla numeru PESEL, NIP, REGON możesz użyć dodatkowa funkcje weryfikujące cyfre kontrolną, a do numeru dowodu regex (2 znaki 7 cyfr, lub 3 znaki 6 cyfr ).
Go to the top of the page
+Quote Post
alex011251
post 24.05.2013, 21:22:29
Post #6





Grupa: Zarejestrowani
Postów: 40
Pomógł: 3
Dołączył: 21.05.2013

Ostrzeżenie: (10%)
X----


co do PESEL:


- Algorytm sprawdzający MUSI uwzględniać datę urodzenia. Dzięki temu unikasz błędu "44" sumy kontrolnej
- Algorytm POWINIEN sprawdzać płeć
Popularne błędy:
- Data urodzenia nie taka jak w numerze
- zła suma kontrolna
- data poza zasięgiem np. 31 listopada
- płeć inna niż w numerze
- powtórzenie numeru

Dodam ze sa inni cwani biggrin.gif Trzeba uwzglednic rok przestepny w dacie czy tam w tworzeniu peselu.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 24.04.2024 - 04:06