JavaScript: проверка на стороне клиента и на стороне сервера - PullRequest
162 голосов
/ 02 октября 2008

Что лучше сделать для проверки на стороне клиента или на стороне сервера?

В нашей ситуации мы используем

  • jQuery и MVC.
  • Данные JSON для передачи между нашим представлением и контроллером.

Большая часть проверки, которую я делаю, заключается в проверке данных при их вводе пользователями. Например, я использую событие keypress, чтобы запретить ввод букв в текстовом поле, установить максимальное количество символов и число в диапазоне.

Я думаю, что лучший вопрос был бы: есть ли какие-либо преимущества в проверке на стороне сервера по сравнению с клиентской?


Потрясающе отвечает всем. Наш веб-сайт защищен паролем и предназначен для небольшой пользовательской базы (<50). Если они не используют JavaScript, мы отправим ниндзя. Но если бы мы разрабатывали сайт для всех, я бы согласился провести валидацию с обеих сторон. </p>

Ответы [ 13 ]

317 голосов
/ 02 октября 2008

Как уже говорили другие, вы должны сделать оба. И вот почему:

Клиентская сторона

Вы хотите сначала проверить ввод на стороне клиента, потому что вы можете улучшить обратную связь для среднего пользователя . Например, если они введут неверный адрес электронной почты и перейдут в следующее поле, вы можете сразу же показать сообщение об ошибке. Таким образом, пользователь может исправить каждое поле до того, как отправит форму.

Если вы выполняете проверку только на сервере, они должны отправить форму, получить сообщение об ошибке и попытаться найти причину проблемы.

(Эту боль можно облегчить, если сервер повторно выполнит рендеринг формы с заполнением исходного ввода пользователя, но проверка на стороне клиента все еще быстрее.)

Серверная сторона

Вы хотите проверить на стороне сервера, потому что вы можете защитить от злоумышленника , который может легко обойти ваш JavaScript и отправить опасный ввод на сервер.

Доверять своему интерфейсу очень опасно. Они могут не только злоупотреблять вашим пользовательским интерфейсом, но и вообще не использовать ваш пользовательский интерфейс или даже браузер . Что если пользователь вручную отредактирует URL-адрес, запустит собственный Javascript или настроит свои HTTP-запросы с помощью другого инструмента? Что если они отправляют пользовательские HTTP-запросы из curl или из сценария, например?

( Это не теоретически; например, я работал над поисковой системой путешествий, которая повторно отправляла запрос пользователя во многие авиакомпании, автобусные компании и т. Д., Отправляя POST запросов, как если бы пользователь заполнил каждое из них. Форма поиска компании, затем собрала и отсортировала все результаты. Форма этих компаний JS никогда не выполнялась, и для нас было важно, чтобы они предоставляли сообщения об ошибках в возвращенном HTML. Конечно, API был бы хорош, но это было что мы должны были сделать. )

Не допускать этого не только наивно с точки зрения безопасности, но и нестандартно: клиенту должно быть разрешено отправлять HTTP любым удобным для него способом, и вы должны отвечать правильно. Это включает в себя проверку.

Проверка на стороне сервера также важна для совместимости - не всем пользователям, даже если они используют браузер, будет включен JavaScript.

Приложение - декабрь 2016

Существуют некоторые проверки, которые не могут быть выполнены должным образом в коде приложения на стороне сервера, и абсолютно невозможны в коде на стороне клиента, поскольку они зависят от текущего состояния базы данных. Например, «никто другой не зарегистрировал это имя пользователя», или «запись в блоге, которую вы комментируете, все еще существует», или «ни одна из существующих бронирований не перекрывает запрошенные вами даты», или «на вашем счете все еще достаточно средств для покрытия этой покупки» «. Только база данных может надежно проверять данные, которые зависят от связанных данных. Разработчики регулярно исправляют это , но PostgreSQL предоставляет несколько хороших решений .

76 голосов
/ 02 октября 2008

Да, проверка на стороне клиента может быть полностью обойдена, всегда. Вам необходимо выполнить как клиентскую часть, чтобы обеспечить лучшее взаимодействие с пользователем, так и серверную, чтобы быть уверенным, что полученные вами данные действительно проверены, а не просто предположительно проверены клиентом.

40 голосов
/ 02 октября 2008

Я просто собираюсь повторить это, потому что это очень важно:

Всегда проверять на сервере

и добавьте JavaScript для отзывчивости пользователей.

30 голосов
/ 02 октября 2008

Преимущество выполнения проверки на стороне сервера перед проверкой на стороне клиента состоит в том, что проверку на стороне клиента можно обойти / манипулировать:

  • Конечный пользователь может отключить JavaScript
  • Данные могут быть отправлены непосредственно на ваш сервер кем-то, кто даже не использует ваш сайт, с помощью специального приложения, разработанного для этого
  • Ошибка Javascript на вашей странице (вызванная любым количеством вещей) может привести к выполнению некоторых, но не всех ваших проверок

Короче говоря - всегда, всегда проверяйте на стороне сервера, а затем рассматривайте проверку на стороне клиента как дополнительный «дополнительный» для улучшения взаимодействия с конечным пользователем.

17 голосов
/ 02 октября 2008

Вы должны всегда подтверждать на сервере.

Также проверка на клиенте хороша для пользователей, но совершенно небезопасна.

8 голосов
/ 28 апреля 2013

Вы можете выполнить проверку на стороне сервера и отправить обратно объект JSON с результатами проверки для каждого поля, сохранив минимальный Javascript клиента (просто отображая результаты), и при этом оставаясь удобным для пользователя, без необходимости повторяться на клиенте и сервер.

8 голосов
/ 26 февраля 2013

Ну, я все еще нахожу место для ответа.

В дополнение к ответам Роба и Натана, я бы добавил, что имеет значение проверка на стороне клиента. Когда вы применяете валидации в своих веб-формах, вы должны следовать этим рекомендациям:

на стороне клиента

  1. Необходимо использовать проверки на стороне клиента для фильтрации подлинных запросов, исходящих от подлинных пользователей на вашем веб-сайте.
  2. Проверка на стороне клиента должна использоваться для уменьшения ошибок, которые могут возникнуть при обработке на стороне сервера.
  3. Проверка на стороне клиента должна использоваться, чтобы минимизировать количество обращений на стороне сервера, чтобы сэкономить пропускную способность и количество запросов на пользователя.

на стороне сервера

  1. Вы НЕ ДОЛЖНЫ полагать, что проверка, успешно выполненная на стороне клиента, на 100% идеальна. Неважно, обслуживает ли он менее 50 пользователей. Вы никогда не знаете, кто из ваших пользователей / emplyee превращается в «зло» и совершает какую-то вредную деятельность, зная, что у вас нет надлежащих проверок на месте.
  2. Даже если он идеально подходит для проверки адреса электронной почты, телефонных номеров или проверки некоторых допустимых входных данных, он может содержать очень вредные данные. Который должен фильтроваться на стороне сервера, независимо от того, является ли он правильным или неправильным.
  3. Если проверка на стороне клиента обойдена, проверка на стороне сервера приходит к вам, чтобы спасти вас от любого потенциального ущерба для обработки на стороне сервера. В последнее время мы уже слышали много историй об SQL-инъекциях и других методах, которые могут применяться для получения некоторых злых выгод.

Оба типа проверок играют важную роль в соответствующей области, но самая сильная - на стороне сервера. Если вы получаете 10 тыс. Пользователей в один момент времени, то вам определенно придется отфильтровывать количество запросов, поступающих на ваш веб-сервер. Если вы обнаружите единственную ошибку, такую ​​как неверный адрес электронной почты, тогда они снова отправят форму и попросят вашего пользователя исправить ее, что определенно приведет к потере ресурсов вашего сервера и пропускной способности. Так что лучше применять проверку JavaScript. Если javascript отключен, то проверка на стороне сервера придет на помощь, и я уверен, что только несколько пользователей могли случайно отключить его, поскольку 99,99% веб-сайтов используют javascript, и он уже включен по умолчанию во всех современных браузерах.

4 голосов
/ 01 августа 2013

Клиентская сторона должна использовать базовую проверку с помощью типов ввода HTML5 и атрибутов шаблона , и поскольку они используются только для прогрессивных улучшений для улучшения взаимодействия с пользователем (даже если они не поддерживаются

2 голосов
/ 13 ноября 2013

Я предложу внедрить проверку как клиента, так и сервера, чтобы сохранить безопасность проекта ...... если мне придется выбрать одну, я отправлю проверку на стороне сервера.

Обновление от 23 июля 2018 года: следующая ссылка больше недоступна:

Вы можете найти соответствующую информацию здесь http://www.webexpertlabs.com/server-side-form-validation-using-regular-expression/

2 голосов
/ 04 октября 2013

JavaScript может быть изменен во время выполнения.

Я предлагаю шаблон создания структуры проверки на сервере и обмена ею с клиентом.

Вам понадобится отдельная логика проверки на обоих концах, например:

"required" атрибуты на inputs на стороне клиента

field.length > 0 на стороне сервера.

Но использование одной и той же спецификации валидации устранит некоторую избыточность (и ошибки) зеркального отображения валидации на обоих концах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...