Где вы записываете правила проверки данных формы в веб-приложении? - PullRequest
11 голосов
/ 21 октября 2008

Скажем, у вас есть веб-форма с некоторыми полями, которые вы хотите проверить, чтобы они были только некоторым подмножеством буквенно-цифровой, минимальной или максимальной длины и т. Д.

Вы можете проверить в клиенте с помощью javascript, вы можете отправить данные обратно на сервер и сообщить пользователю, через ajax или нет. Вы можете иметь правила проверки в базе данных и таким образом отправлять пользователю сообщения об ошибках.

Или любая комбинация всего вышеперечисленного.

Если вы хотите, чтобы единственное место сохраняло правила проверки для пользовательских данных веб-приложения, которые сохраняются в базе данных, каковы некоторые рекомендации, шаблоны или общие полезные советы для этого?

[править]

Я отредактировал название вопроса, чтобы лучше отразить мой фактический вопрос! Между прочим, несколько замечательных ответов.

Ответы [ 10 ]

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

все вышеперечисленное:

  1. проверка на стороне клиента более удобна для пользователя
  2. но вы не можете доверять клиенту, поэтому выделенный код также должен проверять
  3. аналогично, база данных не может доверять тому, что вы проверяли, так что проверяйте и там

РЕДАКТИРОВАТЬ: я вижу, что вы редактировали вопрос, чтобы задать единый пункт спецификации для правил проверки. Это называется «словарь данных» (DD), и его полезно иметь и использовать для создания правил проверки на разных уровнях. Однако большинство систем этого не делают, поэтому не расстраивайтесь, если вы никогда не удосужились создать такую ​​вещь; -)

Одна возможная / простая конструкция DD для современной 3-уровневой системы может включать в себя - наряду с обычной информацией о максимальном размере / минимальном размере / типе данных - поле выражения / функции Javascript, сборка / класс / метод C # поля, и поле выражения sql. Javascript может быть вставлен в проверку на стороне клиента, информация C # может использоваться для загрузки / вызова отражения для проверки на стороне сервера, а выражение sql может использоваться для проверки базы данных.

Но хотя это все хорошо в теории, я не знаю ни одной реальной системы, которая бы на самом деле делала это на практике [хотя это "звучит" как хорошая идея].

Если вы это сделаете, дайте нам знать, как это происходит!

3 голосов
/ 22 октября 2008

Чтобы ответить на актуальный вопрос:

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

Но опять же, вы хотите, чтобы ограничения базы данных были отражены в вашей модели данных. Таким образом, первое приближение, вероятно, было бы для определения некоторого небольшого набора perdicates, который сопоставим как с проверочными ограничениями, системным языком и javascript.

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

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

Может быть, лучше всего определить небольшой управляемый DSL для perdicates, описывающих ограничение. Затем вы создаете «компиляторы», которые анализируют этот DSL и предоставляют необходимое представление.

«DSL» не обязательно должен быть такой простой, простой проверкой строк и проверкой int не является большой проблемой. Проверка RegEx может быть проблемой, если ваша база данных не поддерживает ее. Вероятно, вы можете спроектировать этот DSL как просто набор классов или то, что обеспечивает системный язык, который можно объединить в выражения с простой булевой алгеброй.

2 голосов
/ 22 октября 2008

Чтобы хранить правила проверки в одном месте, я использую только проверку на стороне сервера. Чтобы сделать его более удобным для пользователя, я просто делаю асинхронный пост-запрос к серверу, и сервер возвращает информацию об ошибках в формате JSON, например:

{ "fieldName1" : "error description", 
"fieldName2" : "another error description" };

Форма отправляется, если сервер возвратил пустой объект, в противном случае я могу использовать информацию с сервера для отображения ошибок. Он работает так же, как эти регистрационные формы, которые проверяют, принят ли ваш логин еще до того, как вы отправите форму, с двумя основными отличиями: запрос отправляется после отправки и отправляет все значения полей (кроме input type = "file").

Если проверка JavaScript по какой-либо причине не сработала, выполняется обычный сценарий проверки на стороне сервера (перезагрузка страницы с информацией об ошибках) с использованием того же сценария на стороне сервера.

Это решение не так отзывчиво, как чистая проверка на стороне клиента (требуется время для отправки / получения данных между клиентом и сервером), но оно довольно простое, и вам не нужно «переводить» правила проверки в JavaScript.

1 голос
/ 23 октября 2008

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

Один подход, используемый несколькими средами веб-разработки (включая CakePHP ) Организовать ваш код в объекты Model, View, Controller.

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

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

Наконец, используйте это регулярное выражение для проверки в javascript (view) и в коде обработки формы на сервере (Controller).

Если регулярное выражение недостаточно - т.е. вам нужно проверить базу данных, чтобы увидеть, доступно ли имя пользователя, вы можете определить метод проверки для модели, использовать его непосредственно в коде обработки формы, а затем вызвать его из javascript, используя Ajax и небольшая страница проверки.

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

1 голос
/ 21 октября 2008

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

Казалось, вопрос был в том, чтобы спросить больше о том, как вы определяете валидации, чтобы каждое место, которое проверяет, было синхронизировано. Я бы порекомендовал определить ваши правила проверки в одном месте, например, XML-файл или что-то в этом роде, и иметь структуру, которая читает этот файл и генерирует функции javascript для проверки на клиенте. Затем он может использовать те же правила для проверки на сервере.

Таким образом, если вам когда-либо понадобится изменить правило, у вас есть одно место.

1 голос
/ 21 октября 2008

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

Я бы предложил не ограничивать ваши проверки одним местоположением - дополнительные проверки в javascript делают вещи более отзывчивыми для ваших пользователей.

0 голосов
/ 22 октября 2008

В прошлом я использовал XSLT для проверки. Мы создали бы XML-документ о значениях и запустили его для XSLT. XSLT был построен из "правил" XPath. Полученный документ XML состоит из списка нарушенных правил и полей, которые их нарушают.

Мы смогли:

  1. хранить правила в реляционной БД
  2. генерация XSLT из БД
  3. использовать XSLT на клиенте
  4. использовать XSLT на сервере
  5. использовать необработанные правила в БД
0 голосов
/ 21 октября 2008

Мы стараемся выполнить нашу проверку еще до того, как она попадет на сервер базы данных, особенно для наших приложений, работающих в общедоступном Интернете. Если вы не выполните проверку до того, как данные попадут в базу данных, вы подвергнете свою базу риску атак с использованием SQL-инъекций. Мы проверяем через смесь javascript и code-behind.

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

Хорошее решение для проверки данных может использовать определение типов данных на основе XML Schema , тогда и клиент, и сервер будут повторно использовать типы, так как им обоим потребуется его выполнение. Стоит отметить, что в Backbase Ajax Framework реализована проверка пользовательского ввода на стороне клиента на основе типов данных XML-схемы (встроенных и определяемых пользователем)

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