Pergunta

Onde você colocar validação de entrada do usuário em um aplicativo de formulário web?

  1. Ver: lado do cliente JavaScript
  2. Controlador: linguagem do lado do servidor (C # ...)
  3. Modelo: Banco de Dados (procedimentos armazenados ou dependências)

Eu acho que é a validação exigida por cada nível:

  1. Será que a entrada do usuário um valor sane
    • são datas datas reais, são números actualy números ...
  2. Faça todas as verificações no 1. novamente mais cheques para ataques maliciosos (IE XSS ou injeção SQL)
    • As verificações feitas em 1. são principalmente para evitar uma ida e volta do servidor quando o usuário comete um erro.
    • Uma vez que eles são feitos no lado do cliente em javascript, você não pode confiar em que eles foram executados. Validando esses valores novamente irá parar alguns ataques mal-intencionados.
  3. Você dependências satisfeitas (ie. Que o usuário adicionar um comentário a uma pergunta válida)
    • Uma boa interface faz com que essas muito difícil de violar. Se algo está preso aqui, algo deu muito errado.

[inspirado por esta resposta ]

Foi útil?

Solução

I check-in todos os níveis, mas eu gostaria de observar um truque de validação que eu uso.

Eu validar na camada de banco de dados, restrições adequadas no seu modelo irá fornecer validação de integridade de dados automática.

Esta é uma arte que parece estar perdido na maioria dos programadores web.

Outras dicas

A validação do modelo, rotinas opcionalmente automatizados na interface do usuário que levam suas sugestões a partir do modelo e melhorar a experiência do usuário.

Por rotinas automatizadas, quero dizer que não deve haver qualquer código de validação per-modelo na interface do usuário. Se você tem uma biblioteca de métodos de validação, como de RoR (que tem métodos como validates_presence_of: nome de usuário). (Convenientes ou o que for) métodos do controlador ou exibição deve ser capaz de ler estes e aplicar javascript equivalente

Isso significa que você terá que duplicar a biblioteca de validação completa na interface do usuário, ou pelo menos fornecer um mapeamento se você usar um preexistente. Mas uma vez feito isso, você não terá que escrever qualquer lógica de validação fora do modelo.

A validação pode ser feito em todas as camadas.

Validação da entrada de um formulário web (todas as cordas, lançando aos tipos apropriados, etc) é diferente de validação da entrada de um webservice, ou arquivo XML, etc. Cada um tem seus próprios casos especiais. Você pode criar uma classe auxiliar Validador é claro, exteriorizando assim, a Validação e permitindo que ele seja compartilhado por pontos de vista.

Então você tem a validação camada DAO - há dados suficientes no modelo para persistir (para atender restrições NOT NULL, etc) e assim por diante. Pode ainda têm restrições de verificação da base de dados (é estado ( 'N', 'A', 'S', 'D'), etc).

Isso é interessante. Durante muito tempo eu executei todas as validação do modelo, bem acima o que eu consideraria DAL (camada de acesso a dados). Meus modelos são tipicamente pattern'ed após gateway de dados tabela com uma DAL fornecendo a abstração e baixo API nível.

No lado do TDG eu iria implementar a lógica de negócios e validações, tais como:

  1. é nome de usuário esvaziar
  2. é nome de usuário> 30 caracteres
  3. Se o registro não existe, de erro de retorno

Como a minha candidatura cresceu em complexidade, comecei a perceber que grande parte da validação poderia ser feito no lado do cliente, usando JavaScript. Então eu reformulado a maior parte da lógica de validação em JS e cleanuped os meus modelos.

Então eu percebi que a validação do lado do servidor (não filtrar / escapar - que eu considero diferente). Deve probalby ser feito no servidor, bem e só do lado do cliente como cereja no topo do bolo

Então, de volta a lógica de validação foi, quando me dei conta de novo, que havia provavelmente uma diferença distinta entre validação de entrada / afirmação e regras de negócio / lógica.

Basicamente, se isso pode ser feito no lado do cliente do aplicativo (usando JS) Eu considero que isso seja validação de entrada ... se ele deve ser feito pelo modelo (se este registro já existem, etc?), Então eu consideraria que a lógica de negócios. O que é desconcertante é que ambos protecte a integridade do modelo de dados.

Se você não' validar o comprimento de um nome de usuário, em seguida, o que está a impedir as pessoas de criar um único nome de usuário personagem?

Eu ainda não decidi completamente onde colocar essa lógica seguinte, eu acho que realmente depende do que você prefere mais, controladores finas, modelos pesados, ou vice-versa ...

Controllers no meu caso tendem a ser muito mais centrada no aplicativo, enquanto modelos, se trabalhada cuidadosamente eu posso frequentemente reutilização em "outros" projetos não apenas internamente, por isso prefiro manter modelos de pouco peso e controladores no lado mais pesado.

Que forças levá-lo em qualquer direção são realmente opinião pessoal, requisitos, experiências, etc ...

Assunto interessante:)

Validação deve ser feito no controlador. - É o único lugar que garante segurança e resposta

Validação deve ser feito na vista -. Que é o ponto de contato e irá fornecer a melhor UE e salvar o seu servidor de trabalho extra

Validação irá ser feito no modelo - mas apenas para um determinado nível de núcleo de cheques. Bases de dados deve sempre refletir restrições apropriadas, mas é ineficiente para deixar este suporte para validação real, nem sempre é possível para um banco de dados para determinar de entrada válido com restrições simples.

Todos validação deve acontecer pelo menos uma vez, e isso deve ser na camada intermediária, quer seja em seus objetos de valor (no sentido DDD, para não ser confundido com DTO de), ou através do objeto de negócios da entidade em si. validação do lado do cliente pode ocorrer para melhorar a experiência do usuário. I tendem a não fazer a validação do lado do cliente, porque eu posso apenas expor todas as coisas que estão erradas no formulário de uma vez, mas isso é apenas a minha preferência pessoal A validação do banco de dados pode ocorrer para garantir a integridade dos dados no caso de você asneira a lógica a camada intermediária ou para trás terminou alguma coisa.

Eu só fazê-lo no View e Controller, o banco de dados impõe alguns dos que por seus tipos de dados e outros enfeites, mas eu prefiro não chegar tão longe sem me pegando um erro.

Você praticamente respondeu à sua própria pergunta, porém, a coisa importante a saber é que você nunca pode confiar a vista, apesar de que é o caminho mais fácil para dar feedback para o usuário, então você precisa para higienizar em pelo menos mais um nível.

Hmmmm, não tenho certeza. Eu teria dito o controlador até que eu li este artigo re: Controladores skinny, Modelos de gordura

http://blog.astrumfutura.com/archives/373-The-M-in-MVC-Why-Models-are-Misunderstood-and-Unappreciated.html

Uma vez que a maioria das validações depende regras de negócio , eu fazer a validação no camada de negócios como classes de ferramentas de terceiros. Existem outros tipos de validações, como a entrada do usuário, enquanto ele precisa ser feita no controlador, mas você pode encapsular essas regras de validação em classes de terceiros também. Realmente, isso depende do que para validar.

As validações do lado do cliente são os menores queridos, feito apenas para construir uma leve entrada de validação , mas a validação do lado do servidor é necessário sempre . Você nunca pode confiar na entrada do usuário;)

.NET têm nice controles para validações de construção, mas o camada de negócios sempre precisa de uma melhor abordagem para validar os dados e os controles não são suficientes para essa tarefa.

validação de entrada simples no modo de exibição. validação completa no modelo. Razão? Se você mudar sua tecnologia de vista, e a validação é a vista / controlador, você tem que reescrever sua validação para o novo modo de exibição. Isto pode apresentar bugs. Coloque-o no modelo, e este é reutilizado por todos os pontos de vista ...

Mas, como eu disse, validação simples no modo de exibição para a velocidade e facilidade.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top