Как уже говорили другие, вы должны сделать оба. И вот почему:
Клиентская сторона
Вы хотите сначала проверить ввод на стороне клиента, потому что вы можете улучшить обратную связь для среднего пользователя . Например, если они введут неверный адрес электронной почты и перейдут в следующее поле, вы можете сразу же показать сообщение об ошибке. Таким образом, пользователь может исправить каждое поле до того, как отправит форму.
Если вы выполняете проверку только на сервере, они должны отправить форму, получить сообщение об ошибке и попытаться найти причину проблемы.
(Эту боль можно облегчить, если сервер повторно выполнит рендеринг формы с заполнением исходного ввода пользователя, но проверка на стороне клиента все еще быстрее.)
Серверная сторона
Вы хотите проверить на стороне сервера, потому что вы можете защитить от злоумышленника , который может легко обойти ваш JavaScript и отправить опасный ввод на сервер.
Доверять своему интерфейсу очень опасно. Они могут не только злоупотреблять вашим пользовательским интерфейсом, но и вообще не использовать ваш пользовательский интерфейс или даже браузер . Что если пользователь вручную отредактирует URL-адрес, запустит собственный Javascript или настроит свои HTTP-запросы с помощью другого инструмента? Что если они отправляют пользовательские HTTP-запросы из curl
или из сценария, например?
( Это не теоретически; например, я работал над поисковой системой путешествий, которая повторно отправляла запрос пользователя во многие авиакомпании, автобусные компании и т. Д., Отправляя POST
запросов, как если бы пользователь заполнил каждое из них. Форма поиска компании, затем собрала и отсортировала все результаты. Форма этих компаний JS никогда не выполнялась, и для нас было важно, чтобы они предоставляли сообщения об ошибках в возвращенном HTML. Конечно, API был бы хорош, но это было что мы должны были сделать. )
Не допускать этого не только наивно с точки зрения безопасности, но и нестандартно: клиенту должно быть разрешено отправлять HTTP любым удобным для него способом, и вы должны отвечать правильно. Это включает в себя проверку.
Проверка на стороне сервера также важна для совместимости - не всем пользователям, даже если они используют браузер, будет включен JavaScript.
Приложение - декабрь 2016
Существуют некоторые проверки, которые не могут быть выполнены должным образом в коде приложения на стороне сервера, и абсолютно невозможны в коде на стороне клиента, поскольку они зависят от текущего состояния базы данных. Например, «никто другой не зарегистрировал это имя пользователя», или «запись в блоге, которую вы комментируете, все еще существует», или «ни одна из существующих бронирований не перекрывает запрошенные вами даты», или «на вашем счете все еще достаточно средств для покрытия этой покупки» «. Только база данных может надежно проверять данные, которые зависят от связанных данных. Разработчики регулярно исправляют это , но PostgreSQL предоставляет несколько хороших решений .