Jak powiedzieli inni, powinieneś zrobić jedno i drugie. Dlatego:
Strona klienta
Chcesz najpierw zweryfikować dane wejściowe po stronie klienta, ponieważ możesz przekazać lepszą opinię przeciętnemu użytkownikowi . Na przykład, jeśli wprowadzą nieprawidłowy adres e-mail i przejdą do następnego pola, możesz natychmiast wyświetlić komunikat o błędzie. W ten sposób użytkownik może poprawić każde pole przed przesłaniem formularza.
Jeśli weryfikujesz tylko na serwerze, muszą oni przesłać formularz, otrzymać komunikat o błędzie i spróbować wyśledzić problem.
(Ten ból można złagodzić poprzez ponowne renderowanie formularza przez serwer z wypełnieniem oryginalnych danych wejściowych użytkownika, ale sprawdzanie poprawności po stronie klienta jest jeszcze szybsze.)
Po stronie serwera
Chcesz sprawdzić poprawność po stronie serwera, ponieważ możesz chronić się przed złośliwym użytkownikiem , który może łatwo ominąć JavaScript i przesyłać niebezpieczne dane na serwer.
Ufanie interfejsowi użytkownika jest bardzo niebezpieczne. Mogą nie tylko nadużywać interfejsu użytkownika, ale mogą w ogóle nie używać interfejsu użytkownika, a nawet przeglądarki . Co się stanie, jeśli użytkownik ręcznie edytuje adres URL, uruchomi własny JavaScript lub poprawi swoje żądania HTTP za pomocą innego narzędzia? Co się stanie, jeśli wyślą niestandardowe żądania HTTP curl
ze skryptu lub ze skryptu?
( To nie jest teoretyczne; np. Pracowałem nad wyszukiwarką podróży, która ponownie przesłała wyszukiwanie użytkownika do wielu partnerskich linii lotniczych, firm autobusowych itp., Wysyłając POST
żądania tak, jakby użytkownik wypełnił formularz wyszukiwania każdej firmy, a następnie zebrał i posortował wszystkie wyniki. Formularz JS tych firm nigdy nie został wykonany, a dla nas kluczowe było dostarczenie komunikatów o błędach w zwróconym HTML. Oczywiście interfejs API byłby fajny, ale właśnie to musieliśmy zrobić. )
Nie zezwalanie na to jest nie tylko naiwne z punktu widzenia bezpieczeństwa, ale także niestandardowe: klient powinien mieć możliwość wysyłania HTTP w dowolny sposób i powinien odpowiedzieć poprawnie. Obejmuje to walidację.
Sprawdzanie poprawności po stronie serwera jest również ważne dla zgodności - nie wszyscy użytkownicy, nawet jeśli korzystają z przeglądarki, będą mieli włączoną obsługę JavaScript.
Dodatek - grudzień 2016 r
Istnieją pewne weryfikacje, których nie można nawet poprawnie wykonać w kodzie aplikacji po stronie serwera i są one całkowicie niemożliwe w kodzie po stronie klienta , ponieważ zależą one od bieżącego stanu bazy danych. Na przykład „nikt inny nie zarejestrował tej nazwy użytkownika”, „wpis na blogu, który komentujesz, nadal istnieje” lub „żadna istniejąca rezerwacja nie pokrywa się z żądanymi datami” lub „saldo konta wciąż wystarcza na pokrycie tego zakupu . ” Tylko baza danych może niezawodnie sprawdzać poprawność danych, które zależą od powiązanych danych. Programiści regularnie to psują , ale PostgreSQL zapewnia dobre rozwiązania .