Pergunta

Como você garante adequadamente que um usuário não esteja adulterando valores de string de consulta ou valores de URL de ação?Por exemplo, você pode ter uma ação Excluir comentário em seu CommentController que usa um CommentID.O URL de ação pode ser semelhante a /Comments/Delete/3 para excluir o comentário com o ID 3.

Agora, obviamente, você não quer que ninguém exclua o comentário 3.Normalmente, o proprietário do comentário ou um administrador tem permissão para fazê-lo.Já vi essa segurança ser aplicada de diferentes maneiras e gostaria de saber como alguns de vocês fazem isso.

Você faz várias chamadas ao banco de dados para recuperar o comentário e verificar se o autor do comentário corresponde ao usuário que está invocando a ação de exclusão?

Em vez disso, você passa o CommentID e o UserID para o procedimento armazenado que faz a exclusão e faz uma exclusão onde UserID e CommentID são iguais aos valores passados?

É melhor criptografar os valores da string de consulta?

Foi útil?

Solução

Você não.

É uma regra cardeal de programação, especialmente hoje em dia, que Você nunca confia em nenhuma contribuição que vem do usuário, do navegador, do cliente etc.

É também uma regra cardinal de programação que você provavelmente não deve tentar implementar a criptografia e a segurança, a menos que você realmente saiba o que está fazendo. E mesmo se você souber o que está fazendo, permanecerá apenas um passo à frente dos crackers da Tard. Os inteligentes ainda vão rir de você.

Faça a consulta extra para garantir que o usuário conectado tenha o conjunto certo de permissões. Isso tornará a vida de todos muito mais simples.

Outras dicas

Criptografar e descriptografar parâmetros de consulta é um processo trivial e há alguns ótimos exemplos de como fazer isso usando um HttpModule aqui no StackOverflow.

"Você não", "Você não pode" ou "Não é fácil" simplesmente não são respostas aceitáveis ​​nos dias de hoje...

Vyrotek: O método de entrada não é importante. Obtenha, poste, criptografado/ofusco - sem diferença real. Não importa a maneira como seu aplicativo recebe comandos, para executar uma ação administrativa, ele deve garantir que o usuário emissor possa fazer as coisas que deseja. A verificação de permissão deve ocorrer após o recebimento do comando e antes de ser executado. Caso contrário, não há segurança.

Considere usar a técnica descrita no artigo de Stephen Walther Dica #46 - Não use links de exclusão porque eles criam orifícios de segurança que usa [Acceptverbs (httpverbs.delete)

Você também pode permitir apenas solicitações de postagem para excluir a ação do controlador usando o atributo de verbos aceitadores, como visto abaixo.

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Delete(int? id)
{
    //Delete
}

Então você também pode usar o Token Antiforgergy, conforme discutido aqui:

http://blog.codeville.net/2008/09/01/prevent-cross-site-request-forgy-csrf-using-aspnet-mvcs-antiforgergytoken-helper/

Eu fiz coisas funky, pegue o consultor, compacta -o, base64 ou apenas hexadecimal, para que "comentário = 4 & userID = 12345" se torne "código = 1A2B23DE12769"

É basicamente "segurança através da obscuridade", mas faz muito trabalho para alguém que tenta invadir o site.

Você não pode fazer isso facilmente.

Tenho boas lembranças de um site que usava URLs de ação para fazer exclusão.

Tudo estava bom até que eles começaram a procurar rastejando a intranet.

Ooops, adeus dados.

Eu recomendaria uma solução pela qual você não use o consulta para qualquer coisa que não deseja ser editada.

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