Estou criando um aplicativo da Web com API cortada e nesse aplicativo temos camadas diferentes que estão fazendo seu próprio trabalho.
A primeira camada é a camada de validação que valida a entrada do usuário e, se passar na validação, a moveremos para a segunda camada (que é a camada de controle de acesso ). Caso contrário, retorne a mensagem de erro
A segunda camada é o Controle de acesso, que verifica se o usuário tem permissão para executar a tarefa que deseja executar. Se o usuário tiver permissão, move a solicitação para a próxima camada, caso contrário, retorne a mensagem de erro
Terceira camada é a camada do controlador, onde temos a lógica da aplicação
Minha pergunta é que é bom ter uma camada de validação antes do controle de acesso? E se o usuário estiver tentando executar uma tarefa à qual ele não tem permissão e estamos enviando uma mensagem de erro de validação? O usuário estaria enviando solicitações para um ponto de extremidade e conversando com a camada de validação e, uma vez aprovada na validação, ele veria a mensagemYou can't access this!
Parece estranho para mim, então está bem assim ou quais poderiam ser minhas outras opções em infraestrutura?
fonte
Respostas:
Depende se o conhecimento da validade de alguma entrada para uma tarefa que você não tem permissão para realizar é um vazamento de segurança. Se for, você realmente deve fazer o contrário.
A única resposta segura para um usuário não autorizado é "acesso negado". Se às vezes a resposta for "solicitação incorreta" e outras vezes "acesso negado", você estará enviando informações a um usuário não autorizado.
Como exemplo, você pode verificar na validação da tarefa "excluir documento" que o documento nomeado existe. Alguém sem permissões seria capaz de discernir se existe algo tentando excluí-lo e comparando qual erro eles recebem de volta. Um invasor particularmente determinado pode enumerar todos os nomes de documentos (com um determinado comprimento), para ver quais existem.
fonte
Bem, existem vários tipos de validação:
Verificação básica barata de sanidade, que verifica se a solicitação não está obviamente incorreta.
Normalmente, isso é pelo menos parcialmente duplicado, no lado do cliente, para evitar viagens de ida e volta fúteis.
De qualquer forma, isso deve ser feito antes do controle de acesso para tornar as coisas mais fáceis e menos propensas a erros, pois não corre o risco de vazamento de informações.
Validação mais cara que ainda não depende de nenhum dado de aplicativo protegido.
Se houver essa validação extra, pode ser após o controle de acesso, não para evitar vazamento de dados, mas para impedir ataques do DOS.
Às vezes, a simples execução da solicitação faz parte dessa validação implicitamente, com custo reduzido ou sem custo; portanto, ela pode ser deixada de fora aqui.
Se toda a validação da primeira etapa for duplicada, pode fazer sentido duplicar partes desse lado do cliente também.
Validação adicional, dependendo dos dados do aplicativo protegido.
Fazê-lo antes do controle de acesso obviamente arrisca o vazamento de informações. Assim, primeiro faça o controle de acesso.
fonte
Deve haver alguma validação antes do controle de acesso. Digamos que a API da SO tenha um nó de extremidade "editar resposta"; portanto, se o usuário pode editar uma resposta específica pode depender da resposta (abaixo de uma certa reputação, o usuário pode editar apenas suas próprias respostas). Portanto, o parâmetro "ID da resposta" que está sendo bem formado deve ser verificado antes que a camada de controle de acesso entre em jogo; possivelmente também que a resposta exista.
OTOH, como mencionam Caleth e Greg, colocar uma validação mais extensa antes do controle de acesso é um risco potencial à segurança.
Portanto, as regras rígidas são
Seguir essas duas regras pode significar que você precisa ter alguma validação antes e depois do controle de acesso.
fonte
Além da possível frustração de receber um 'acesso negado' após validar a entrada; Lembre-se também de que a camada de validação , a menos que seja muito simples, sempre pode precisar de informações do controlador . Tendo isso em mente, acredito que posicionar a Validação atrás do Controle de acesso , mais próximo do Controller, faz mais sentido.
fonte
Isso depende do que você quer dizer com camada de validação - se com isso você quer apenas verificar a sintaxe da solicitação, isso é seguro e algo que você precisa fazer de qualquer maneira. Se a sua 'validação' usa qualquer informação que um usuário não privilegiado não tenha acesso, ela não é mais segura.
Você definitivamente deve ter um verificador de sanidade antes de tentar o controle de acesso, mas deve se comunicar muito claramente a todos os mantenedores (atuais e futuros) de que esta parte não deve usar informações privilegiadas; Essas verificações devem ser feitas em uma etapa de validação separada após a autenticação.
Como uma verificação de integridade para o verificador de integridade, ele não deve realmente ter nenhuma dependência de código em qualquer parte do código abaixo do pipeline e deve ser separável em seu próprio pacote que deve ser publicamente publicável sem problemas (exceto possíveis problemas legais) . Se você não pode fazer isso, sua 'camada de validação' está fazendo muito (ou sua base de código está uma bagunça).
fonte
Não, não está bem.
Se você tiver um bug em sua camada de validação, ele pode ignorar a camada de segurança.
É um erro comum considerar a segurança como parte dos requisitos de negócios. "apenas usuários com o papel de vendas, deve ser capaz de ver os números trimestrais" parece ser uma regra de negócios.
Mas, se você quiser se proteger, precisará ler uma regra como "apenas usuários na função de vendas, devem poder executar o código neste nó de extremidade". Verifique se o servidor sempre retorna "acesso negado" antes de chegar ao qualquer tipo de código que você escreveu ou arquivos no servidor.
fonte