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:
$imie = $funkcjeObject->filtrujDaneZewnetrzne($_POST['imie']);
gdzie metoda filtrujDane wygląda następująco:
public function filtrujDane($zmienna) { return $zmiennaClean; }
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:
{ $clean['imie'] = $funkcjeObject->filtrujDaneZewnetrzne($_POST['imie']); }
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:
switch ($kurs) { case 1: case 2: case 3: $clean['kurs'] = $funkcjeObject->filtrujDaneZewnetrzne($_POST['kurs']); }
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
public function filtrujDaneDoWpisaniaDoBazy($zmienna) { return $mysql['zmienna']; }
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?