Verificação de acesso do usuário para os Direitos em determinados objetos de banco de dados ou registros

StackOverflow https://stackoverflow.com/questions/254610

Pergunta

Eu estou tendo um debate amigável com um desenvolvedor sobre uma situação onde os usuários estão login e aceder aos documentos em uma aplicação web. Quando carregar o documento para o usuário a vista, temos o ID do usuário na sessão eo documentID que podem ser passados ??via QueryString.

Para evitar que o usuário modificar o documentID na QueryString, proponho que o procedimento armazenado que carrega o documento tomar o UserId como parâmetro para os direitos Validar para o documento.

Meu amigo desenvolvedor sugere que executar um procedimento separado para determinar os direitos de acesso ao documento no início da página e apenas executar um procedimento para pegar o documento quando o documento deve ser mostrado.

Será que estamos perdendo alguma coisa? Que é mais eficiente e segura? Pensei passar o UserId com o DocID em uma chamada de procedimento para verificar os direitos e puxe o documento era uma solução mais eficiente.

Foi útil?

Solução

estritamente a partir de uma perspectiva de desempenho, passando o UserID juntamente com o DocumentID em um procedimento armazenado seria melhor. Você só tem uma ida e volta para o servidor de banco de dados. Além disso, como os outros têm para fora pontas, se você vai ser recuperar este documento a partir de outras páginas ou aplicações, se você usar o mesmo procedimento armazenado, você garantir que você não está ignorando a segurança de fazê-lo.

No entanto, existem situações em que ter procedimentos armazenados de verificação de segurança dedicada faz sentido. Se você tem outros recursos que você deseja proteger, além de documentos, e seu código VERIFICAÇÃO não é trivial, você pode não querer duplicar o código VERIFICAÇÃO em cada procedimento armazenado no banco de dados. Nesse caso, pode fazer sentido para mover a infraestrutura de segurança para a sua camada de acesso a dados, e ter a camada de acesso a dados fazer a chamada db para autorizar o acesso antes de recuperar o recurso solicitado. Se você tomar este caminho, você não quer contar com o desenvolvedor sempre tem que lembrar de fazer uma chamada db autorização antes de solicitar um recurso.

Outras dicas

proponho que o procedimento armazenado que carrega o documento tomar o UserID como parâmetro para validar direitos ao documento.

Eu acho que este é o caminho a percorrer. Se por nenhuma outra razão que é mais seguro. Se você reutilizar esse proc, e depois se esqueça de verificar o acesso - você abriu um grande buraco. Desta forma, é aparente e cozido em que você não pode chegar ao doc menos que você tenha acesso.

A identificação do usuário deve ser uma variável de sessão. Certo. Passe o documentID na querystring. Yup.

Assumindo que os documentos são armazenados no banco de dados, eu teria uma mesa para permissões: a recordID um userID e uma documentID. Você a juntar-se a esta tabela ao chamar o documento. Se você não obter um resultado, você não obter o documento. Índice tudo bem e ele vai ser rápido.

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