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