Pergunta

É uma boa prática para validação de dados delegado inteiramente aos constrangimentos motor de banco de dados?

A validação de dados da aplicação não impede a inserção inválida a partir de outro software (possivelmente escrito em outro idioma por outra equipe). Usando restrições de banco de dados que você reduzir os pontos onde você precisa se preocupar com dados de entrada inválidos.

Se você colocar a validação tanto no banco de dados e aplicação, a manutenção se torna chato, porque você tem que código de atualização para que sabe como muitas aplicações, aumentando a probabilidade de erros humanos.

Eu só não vê isso sendo feito muito, olhando para código de projetos de software livre.

Foi útil?

Solução

É melhor, se possível, ter suas regras de validação especificado em seu banco de dados e uso ou escrever um quadro que faz com que essas regras borbulhar em sua extremidade dianteira. ASP.NET Dynamic Data ajuda com isso e há algumas bibliotecas comerciais lá fora, que o tornam ainda mais fácil.

Isto pode ser feito tanto para validação de entrada simples (como números ou datas) e dados relacionados, como que constrangidos por chaves estrangeiras.

Em resumo, a idéia é definir as regras em um único lugar (o banco de dados mais tempo) e tem o código em outras camadas que vai fazer cumprir essas regras.

Outras dicas

Validar em tempo de entrada. Validar novamente antes de colocá-lo no banco de dados. E têm restrições de banco de dados para evitar a entrada de ruim. E pode apostar que, apesar de tudo isso, os dados ruins ainda vai entrar em seu banco de dados, então validá-lo novamente quando você usá-lo.

Parece que a cada dia algum aplicativo web for cortada porque eles fizeram toda a sua validação na forma ou pior, utilizando Javascript, e as pessoas encontraram uma maneira de contornar isso. Você tem que se proteger contra isso.

Paranoid? Eu? Não, apenas experimentou.

A desvantagem de deixar a lógica para o banco de dados é então você aumenta a carga no servidor particular. Web e servidores de aplicações são relativamente fáceis de escalar para fora, mas um banco de dados requer técnicas especiais. Como regra geral, é uma boa idéia de colocar o máximo de lógica computacional para a camada de aplicação e manter a interação com o banco de dados o mais simples possível.

Com isso dito, é possível que a sua aplicação pode não precisa se preocupar com essas questões pesado escalabilidade. Se você é certeza que a carga do servidor de banco de dados não será um problema para o futuro previsível, então vá em frente e colocar as restrições sobre o banco de dados. Você está absolutamente correto que este melhora a organização e simplicidade de seu sistema como um todo, mantendo a lógica de validação em um local central.

Existem outras preocupações que a injeção de SQL apenas com a entrada. Você deve tomar a posição mais defensiva possível sempre que aceitar a entrada do usuário. Por exemplo, um usuário pode ser capaz de entrar em um link para uma imagem em uma caixa de texto, que na verdade é um script PHP que executa algo desagradável.

Se você criar seu aplicativo bem, você não deve ter que verificar laboriosamente todas as entradas. Por exemplo, você poderia usar uma API Forms que cuida da maior parte do trabalho para você, e uma camada de banco de dados que faz a mesma.

Este é um bom recurso para a verificação básica de vulnerabilidades:

http://ha.ckers.org/xss.html

É muito tarde quando os dados chega ao seu banco de dados para fornecer validação significativa para seus usuários e aplicações. Você não quer que seu banco de dados fazendo todas a validação desde que vai retardar as coisas boa bonita, e o banco de dados não expressa a lógica tão claramente. Da mesma forma, como você crescer você estará escrevendo mais transações em nível de aplicativo para complementar as suas transações de banco de dados.

Eu diria que é potencialmente uma prática ruim, dependendo do que acontece quando a consulta falha. Por exemplo, se seu banco de dados poderia lançar um erro que foi inteligentemente manipulada por uma aplicação, então você pode estar ok.

Por outro lado, se você não colocar qualquer validação em seu aplicativo, você pode não ter quaisquer dados ruins, mas você pode ter usuários que pensam que eles entraram coisas que não se salva.

Implementar como validação de dados máximo que puder no final de banco de dados, sem comprometer outros objetivos. Por exemplo, se a velocidade é um problema, você pode querer considerar não usando chaves estrangeiras, etc. Além disso, alguns validação de dados só pode ser executada no lado da aplicação, por exemplo, garantindo que os endereços de e-mail têm válido domínios.

Outra desvantagem para fazer a validação de dados do banco de dados é que muitas vezes você não validar a mesma forma em todos os casos. Na verdade, muitas vezes depende de lógica da aplicação (funções de usuário), e às vezes você pode querer validação de bypass completo (cron jobs e scripts de manutenção).

Descobri que fazendo a validação da aplicação, em vez de no banco de dados, funciona bem. É claro que, em seguida, todas as necessidades de interação que passar por sua aplicação. Se você tiver outros aplicativos que o trabalho com os seus dados, o aplicativo terá de suportar algum tipo de API (espero REST).

Eu não acho que há uma resposta certa, isso depende do seu uso.

Se você está indo ter um sistema muito muito utilizada, com o potencial que o desempenho do banco de dados pode se tornar um gargalo, então você pode querer mover a responsabilidade de validação para o front-end, onde é mais fácil de escala com múltiplos servidores.

Se você tiver vários aplicativos que interagem com o banco de dados, então você pode não querer replicar e manter as regras de validação em vários aplicativos, então o banco de dados pode ser o lugar melhor.

Você pode querer uma tela de entrada mais lisa que não é só apertar o usuário com avisos de validação quando tentam salvar um registro, talvez você deseja validar um campo depois que os dados foram inseridos e perdas de foco; ou mesmo como os tipos de usuário, mudando a cor da fonte como a validação falhar / passes.

Ainda relacionado com restrições, é advertências de dados suspeito. Na minha aplicação tenho hard-restrições no banco de dados (por exemplo, alguém não pode iniciar um trabalho antes de sua data de nascimento), mas, em seguida, no front-end têm avisos para dados que são possivelmente correto, mas suspeito (por exemplo, um ano oito -old iniciar um trabalho).

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