Na stronie internetowej znajduje się formularz, do którego należy zaprogramować następujące funkcje:
- walidacja: w trakcie wypełniania formularza w czasie rzeczywistym jest sprawdzana poprawność danych
- przesyłanie danych: po wypełnieniu formularza i jego zatwierdzeniu dane są przesyłane do bazy danych na serwerze
A. walidację w skrypcie PHP, a przesyłanie danych w JavaScript.
B. walidację w języku JavaScript, a przesyłanie danych w skrypcie PHP.
C. walidację i przesyłanie danych w języku PHP.
D. walidację i przesyłanie danych w języku JavaScript.
Pytanie z egzaminu CKE, czerwiec 2020 (arkusz EE.09-SG-20.06).
W tym zadaniu kluczowe jest rozdzielenie tego, co dzieje się po stronie przeglądarki, od tego, co musi wykonać serwer. Walidacja w czasie rzeczywistym najlepiej pasuje do JavaScriptu, bo ten język działa bezpośrednio w przeglądarce użytkownika. Można reagować na wpisywanie tekstu, zmianę pola, kliknięcie przycisku, sprawdzać długość hasła, format e-maila czy wymagane pola bez odświeżania strony. To daje szybki feedback i jest po prostu wygodne dla użytkownika. Z kolei zapis danych do bazy powinien wykonać skrypt PHP na serwerze, ponieważ przeglądarka nie powinna mieć bezpośredniego dostępu do bazy danych ani do loginów i haseł bazy. PHP odbiera dane z formularza, zwykle przez POST, sprawdza je ponownie i dopiero wtedy wykonuje zapytanie SQL, najlepiej przez prepared statements. Moim zdaniem to jeden z podstawowych podziałów w aplikacjach WWW: JavaScript poprawia interakcję po stronie klienta, a PHP obsługuje logikę serwerową i komunikację z bazą. W praktyce i tak warto pamiętać, że walidacja JavaScriptem nie wystarcza bezpieczeństwu, bo użytkownik może ją wyłączyć albo obejść. Dlatego dobra praktyka branżowa to: walidacja w JS dla komfortu, walidacja w PHP dla bezpieczeństwa, a zapis do bazy tylko po stronie serwera.
Niepoprawne podejścia zwykle wynikają z pomieszania roli przeglądarki i serwera. PHP działa po stronie serwera, więc samo z siebie nie nadaje się do walidowania formularza „w trakcie pisania” bez dodatkowych żądań HTTP. Dałoby się oczywiście robić walidację serwerową po każdym wpisanym znaku przez AJAX, ale to jest bardziej skomplikowane, wolniejsze i niepotrzebne w typowym formularzu. Do natychmiastowej reakcji w interfejsie używa się JavaScriptu, bo ma dostęp do pól formularza, zdarzeń input, change, blur i może od razu pokazać komunikat obok pola.
Z drugiej strony zapis danych do bazy danych nie powinien być wykonywany wyłącznie w JavaScripcie działającym w przeglądarce. Taki kod byłby widoczny dla użytkownika, a dane dostępowe do bazy musiałyby znaleźć się po stronie klienta, co jest bardzo złą praktyką i poważnym problemem bezpieczeństwa. JavaScript może wysłać dane do serwera, na przykład przez fetch albo klasyczne zatwierdzenie formularza, ale właściwy zapis do bazy musi wykonać backend, tutaj PHP. Częsty błąd myślowy polega na tym, że skoro JavaScript potrafi „przesyłać dane”, to może też bezpośrednio obsłużyć bazę. W normalnej architekturze webowej tak się tego nie robi. Baza jest chroniona za warstwą aplikacji serwerowej, a PHP odpowiada za odbiór danych, walidację po stronie serwera, zabezpieczenie przed SQL injection i wykonanie zapytania. Najrozsądniejszy i najprostszy schemat to więc JavaScript dla walidacji na żywo oraz PHP dla obsługi formularza i komunikacji z bazą danych.
Z drugiej strony zapis danych do bazy danych nie powinien być wykonywany wyłącznie w JavaScripcie działającym w przeglądarce. Taki kod byłby widoczny dla użytkownika, a dane dostępowe do bazy musiałyby znaleźć się po stronie klienta, co jest bardzo złą praktyką i poważnym problemem bezpieczeństwa. JavaScript może wysłać dane do serwera, na przykład przez fetch albo klasyczne zatwierdzenie formularza, ale właściwy zapis do bazy musi wykonać backend, tutaj PHP. Częsty błąd myślowy polega na tym, że skoro JavaScript potrafi „przesyłać dane”, to może też bezpośrednio obsłużyć bazę. W normalnej architekturze webowej tak się tego nie robi. Baza jest chroniona za warstwą aplikacji serwerowej, a PHP odpowiada za odbiór danych, walidację po stronie serwera, zabezpieczenie przed SQL injection i wykonanie zapytania. Najrozsądniejszy i najprostszy schemat to więc JavaScript dla walidacji na żywo oraz PHP dla obsługi formularza i komunikacji z bazą danych.