2008-10-21 12 views
11

Supongamos que tiene un formulario web con algunos campos que desea validar como un subconjunto de longitud alfanumérica, mínima o máxima, etc.¿Dónde se registran las reglas de validación para los datos del formulario en una aplicación web?

Puede validar en el cliente con javascript, puede volver a publicar los datos al servidor e informar al usuario, ya sea a través de ajax o no. Puede tener las reglas de validación en la base de datos y enviar mensajes de error al usuario de esa manera.

O cualquier combinación de todo lo anterior.

Si desea un lugar único para mantener las reglas de validación para los datos de usuario de la aplicación web que persisten en una base de datos, ¿cuáles son algunas de las mejores prácticas, patrones o buenos consejos generales para hacerlo?

[editar]

He editado el título de la pregunta para reflejar mejor mi pregunta real! Algunas buenas respuestas hasta ahora, por cierto.

Respuesta

17

todo lo anterior:

  1. validación en el cliente es más conveniente para el usuario
  2. pero no se puede confiar en el cliente por lo que el código subyacente también debe validar
  3. Del mismo modo la base de datos no se puede confiar en que usted validado por lo validar allí también

EDITAR: veo que has editado la cuestión de pedir un único punto de especificación de reglas de validación. Esto se llama "Diccionario de datos" (DD), y es una buena cosa para tener y usar para generar reglas de validación en las diferentes capas. La mayoría de los sistemas no lo hacen, sin embargo, no te sientas mal si nunca construyes tal cosa ;-)

Un diseño posible/simple para un DD para un sistema moderno de 3 niveles podría incluir: junto con la información normal de tamaño máximo/tamaño mínimo/tipo de datos - un campo de función/expresión de Javascript, campo (s) de ensamblaje/clase/método C# y un campo de expresión sql. El javascript podría incluirse en la validación del lado del cliente, la información de C# podría usarse para una carga/llamada de reflexión para la validación del lado del servidor, y la expresión sql podría usarse para la validación de la base de datos.

Pero aunque todo esto es bueno en teoría, no conozco ningún sistema del mundo real que realmente lo haga en la práctica [aunque "suena" como una Buena Idea].

Si lo hace, ¡háganos saber cómo funciona!

+0

Esto es cierto, pero no aborda el problema de definir las reglas en un lugar central. – pkaeding

+0

La pregunta no especificaba la necesidad de definir reglas en un lugar central. Además, muchas reglas se duplican mejor. P.ej. un campo de caracteres en una base de datos tiene un tamaño máximo de 50 caracteres. Esta es una regla, pero sería mejor para el usuario si no la deja hasta que la inserción de DB lo indique. – AnthonyWJones

+0

Para el punto de vista, un debate interesante en los comentarios (http://thedailywtf.com/Comments/The-Mythical-Business-Layer.aspx). En medio de todo el ruido, pensé que el siguiente comentario era sensato: http://thedailywtf.com/Comments/The-Mythical-Business-Layer.aspx?pg=5#184346 – micahwittman

0

Una buena solución de validación de datos podría hacer uso de la definición de tipos de datos basados ​​en XML Schema, luego tanto el cliente como el servidor reutilizarían los tipos ya que ambos necesitarían ejecutarlo. Digno de señalar, Backbase Ajax Framework implementa la validación de entrada del usuario del lado del cliente basada en los tipos de datos del esquema XML (integrados y definidos por el usuario)

1

Valide siempre cada entrada del lado del servidor. No sabe que su cliente admite javascript "correctamente", o que no falsifica sus solicitudes http y omite por completo su javascript.

Sugeriría no limitar sus cheques a una sola ubicación: verificaciones adicionales dentro de la javascript hacen que las cosas sean más receptivas para sus usuarios.

0
  1. validación del lado del cliente para buenas interfaces de usuario, que responden
  2. validación del lado del servidor porque el código del lado del cliente pueden ser anuladas o modificadas por lo que no se puede confiar en la validación
  3. base de datos si tiene varias aplicaciones alimentar en un db. Aquí es importante, ya que un cambio en la validación se propaga automáticamente a todas las aplicaciones y no se pierde consistencia en los datos.
0

Tratamos de mantener nuestra validación hecha antes de que llegue al servidor de la base de datos, especialmente para nuestras aplicaciones que se enfrentan a la Internet pública. Si no realiza la validación antes de que los datos lleguen a la base de datos, pone su base de datos en riesgo de ataques de inyección SQL. Validamos mediante una combinación de javascript y código subyacente.

1

Como han dicho otros, debe validar por el lado del servidor por motivos de seguridad e integridad de datos, y la validación por parte del cliente mejorará la experiencia del usuario, ya que los usuarios tendrán la oportunidad de corregir sus errores antes.

Parecía que la pregunta era preguntar más acerca de cómo se definen las validaciones para que cada lugar que valida esté sincronizado. Yo recomendaría definir sus reglas de validación en un lugar, como un archivo XML, o algo así, y tener un marco que lea ese archivo, y genere funciones de JavaScript para validar en el cliente. Luego puede usar las mismas reglas para validar en el servidor.

De esta manera, si alguna vez necesita cambiar una regla, tiene un lugar adonde ir.

2

Para mantener las reglas de validación en un solo lugar, solo uso la validación del lado del servidor. Para que sea más fácil de usar que acabo de hacer una solicitud posterior asíncrona con el servidor, y el servidor devuelve la información de error en formato JSON, como:

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

formulario está siendo enviado si el servidor devuelve un objeto vacío, de lo contrario, puede usar información del servidor para mostrar errores. Funciona de manera similar a estos formularios de registro que verifican si se inicia sesión antes de enviar el formulario, con dos diferencias clave: la solicitud se envía al enviar y envía todos los valores del campo (excepto input type = "file").

Si la validación de JavaScript no funcionó por algún motivo, se lleva a cabo un escenario de validación del lado del servidor (carga de la página con información de error), utilizando el mismo script del lado del servidor.

Esta solución no es tan receptiva como la validación pura del lado del cliente (necesita tiempo para enviar/recibir datos entre el cliente y el servidor), pero es bastante simple y no necesita "traducir" las reglas de validación a JavaScript .

+0

Esto parece un buen compromiso, gracias. – blank

3

Para responder a la pregunta real:

En primer lugar, no siempre se encuentra el caso de que la restricción DATABSE coincide con las restricciones del lado del cliente. Por lo tanto, probablemente sería una mala idea limitarse a validar únicamente en función de las limitaciones de la base de datos.

Pero, una vez más, quiere que las restricciones de la base de datos se reflejen en su modelo de datos. Así que una primera aproximación sería probablemente para definir un pequeño conjunto de perdatos que se puede mapear tanto para comprobar las restricciones, el lenguaje del sistema y javascript.

O eso o simplemente tenga cuidado de mantener las tres representaciones en el mismo lugar, así que recuerda mantenerlas sincronizadas al cambiar algo.

Pero supongamos que usted desea otro conjunto de restricciones utilizadas en un contexto particular en el que el modelo de dominio no es lo suficientemente restrictiva, o tal vez es que los datos no se encuentra en el modelo en absoluto. Probablemente sería una buena idea si pudiera usar el mismo trabajo de estructura utilizado para definir la restricción del modelo para definir otros tipos de restricciones.

Tal vez el camino a seguir es definir una pequeña DSL gestionable para que describa la restricción. Luego, produce "compiladores" que analizan esta DSL y proporciona la representación que necesita.

El "DSL" no tiene por qué ser de lujo, simple cadena y validación int no es mucho de un problema. La validación de RegEx podría ser un problema si su base de datos no lo admite. Probablemente pueda diseñar esta DSL como solo un conjunto de clases o lo que proporciona el lenguaje de su sistema que puede combinarse en expresiones con álgebra booleana simple.

0

En el pasado, he usado XSLT para la validación. Creamos un documento XML de los valores y lo ejecutamos contra XSLT. El XSLT fue construido con las "reglas" de XPath. El documento XML resultante estaba compuesto por una lista de reglas rotas y los campos que las rompieron.

Pudimos:

  1. tienda de las reglas de una base de datos relacional
  2. generar el XSLT de la BD
  3. utilizar la XSLT en el cliente
  4. utilizar la XSLT en el servidor
  5. utilizar las reglas de primas en el PP
1

Como han dicho otros le tiene que hacer la validación en los niveles de Base de datos, Cliente y Servidor. Usted estaba solicitando un solo lugar para validar, por lo que todos estos están sincronizados.

Un enfoque usado por varios frameworks de desarrollo web (incluyendo CakePHP) Es organizar su código en objetos Model, View, Controller.

que pondría todo el código de validación de datos que incluye en la capa del modelo (comentarios para estructura de la tabla de base de datos o procedimientos almacenados si es necesario).

A continuación, en este modelo definir una expresión regular para cada campo para su validación (junto con genéricos max-min-size, tamaño, campos obligatorios).

Finalmente, utilice esta expresión regular en validar en javascript (ver) y en el código de procesamiento de formularios servidor (Controller).

Si la expresión regular no es suficiente, es decir, debe verificar la base de datos para ver si hay un nombre de usuario disponible, puede definir un método de validación en el modelo. Utilícelo directamente en su código de procesamiento y llámelo desde JavaScript. usando ajax y una pequeña página de validación.

Voy a poner un enchufe para comenzar con un buen marco para que no tenga que cablear todo esto usted mismo.

Cuestiones relacionadas