none
Transferir de forma segura os dados de um ActionResult para outro. RRS feed

  • Pergunta

  • Estou com a dificuldade de manter seguro alguns dados do meu Model na edição do mesmo.
    Ao utilizar o beginform, preciso passar todos os atributos do Model para que ele seja reconhecido na ActionResult de edição.
    O problema, é que ao retirar o Id, por exemplo, do HiddenField, ele não recupera essa informação. Então deixando esse HiddenField, ele fica aberto para ser alterado por um usuário mais curioso. Essa permissão, está me deixando com medo, pois ele pode alterar um outro registro que não faz parte do acesso dele.

    domingo, 26 de abril de 2015 22:45

Respostas

  • Alexandre,

    Se o seu receio é exibir um Id na URL, então a solução passa pelo gravação desta informação na Session. Desta maneira vc conseguiria inibir a ação de usuários modificando registros nos quais os mesmos não deveriam ter acesso.

    segunda-feira, 27 de abril de 2015 13:06

Todas as Respostas

  • Alexandre,

    Se o seu receio é exibir um Id na URL, então a solução passa pelo gravação desta informação na Session. Desta maneira vc conseguiria inibir a ação de usuários modificando registros nos quais os mesmos não deveriam ter acesso.

    segunda-feira, 27 de abril de 2015 13:06
  • Ao acionar a ActionResult Edit eu recuperaria o objeto e gravaria em session? Seria assim?
    segunda-feira, 27 de abril de 2015 13:44
  • Exatamente. Particularmente eu só faria isso se fosse obrigatório evitar esse tipo de problema. Pois você terá o trabalho de alterar todos os seus controllers. Fora que terá que garantir que quando o usuário abrir duas abas com o form de edição seja editado o model correto, pois a sessão é única por usuário.

    Att. Andre de Mattos Ferraz



    segunda-feira, 27 de abril de 2015 13:47
  • Ao meu ver, isso é uma brecha muito grande na segurança dos sistemas desenvolvidos nesse formato.
    Em webforms, não tenho esse tipo de problema. Se tiver como alterar, pelo menos é mais trabalhoso.
    Fiquei surpreso quando, ao tentar fazer esse tipo de alteração, ter dado certo.
    Não gostaria de trabalhar com sessões nesse caso. Porém, ainda não consegui uma solução adequada pra prever esse tipo de situação.
    No meu caso, cada usuário poderá publicar seus artigos, então, pra manter o id de cada usuário no artigo, preciso colocar ele como hiddenfield.
    Algum usuário mais curioso, altera o artigo do outro e pronto, a confusão está formada.

    segunda-feira, 27 de abril de 2015 14:19
  • Mas ai é questão de você fazer regra de segurança no seu controller. Verificar se o o ID que ele está alterando pertence a ele, caso contrário retorna erro.

    Tudo bem que no webforms vc conseguia fazer isso, pois tudo ficava sendo processado no servidor. Mas pra fazer um site no padrão RIA era impossível, qualquer requisição irá dar um refresh na página. Sem falar que a programação ficava muito mais acoplada. No MVC vc consegue separar muito bem sua camada de negócio da sua VIEW. No webforms nem tanto.

    Acho que o seu problema é muito mais implementar uma regra de negócio que descrevi a cima.


    Att. Andre de Mattos Ferraz

    segunda-feira, 27 de abril de 2015 15:29
  • Alexandre,

    Independente de ser Web Forms ou MVC, a passagem de um parâmetro de uma tela a outra sempre envolve o uso de uma query string com o ID (na maior parte dos casos). Mesmo em Web Forms, se vc tivesse 2 páginas, acabaria caindo nesse dilema (a não ser que implementasse todas as funcionalidades num mesmo formulário).

    segunda-feira, 27 de abril de 2015 15:45
  • O que eu não queria fazer, era recuperar duas vezes o mesmo registro pra fazer essa validação. Creio que perderei performance com isso.
    No webform, trabalho com multiview, não preciso sair da pagina. Apenas controlo seu estado.
    Obrigado pela ajuda de todos!

    segunda-feira, 27 de abril de 2015 16:26
  • Alexandre,

    Outras alternativas poderiam ser o uso de Cache, mantendo na memória por algum tempo os dados dos quais vc necessita. O id também poderia ser substituído por um GUID, formato este muito difícil de ser "hackeado" por um autor (considerando o cenário que vc descreveu).

    segunda-feira, 27 de abril de 2015 16:39
  • Pelo que vi, a melhor forma seria colocar disponivel apenas o que quero alterar e no post, recuperar o objeto mais uma vez e fazer a alteração desses campos. dessa forma, seria mais difícil burlar.
    segunda-feira, 27 de abril de 2015 16:47
  • Olá Renato tudo bem ?

    Se o usuário não tem permissão para acessar ou a alterar algum registro, deveria ser tratada no controller.

    Além disso se quiser pode usar uma criptografia na URL, desta forma você consegue mascarar o id. Existem várias técnicas para isso.

    http://www.dotnettrace.net/2013/09/encrypt-and-decrypt-url-in-mvc-4.html

    http://amitpatelit.com/2011/08/08/url-encryption-in-mvc-application/


    Isco Sistemas José Luiz Borges

    terça-feira, 28 de abril de 2015 11:19
  • Sem problemas José, foram apenas sugestões que dei ao Alexandre.

    Quanto à questão da segurança no Controller, é algo que utilizo e até já escrevi um post a respeito:

    http://www.devmedia.com.br/filters-no-asp-net-mvc-3-revista-net-magazine-94/23663

    terça-feira, 28 de abril de 2015 11:23
  • A questão é que no controller, de forma genérica, você determina o acesso a uma ação. Porém, para controlar o que vai ser alterado, uma vez que você tenha que passar a informação, normalmente por hiddenfield, é que não achei seguro. Pois é possível alterar o valor do input no html e pedir pra salvar.
    Achei que poderia ter uma forma genérica do asp.net tratar isso, porém, não tem. Então, fica a critério pra cada um fazer do jeito que quer.
    No meu caso, além de usar o authorize no controller, tenho que verificar se o registro que está sendo alterado é do usuário que está logado. E também, passei a criar DTOs para alterar somente o que for necessário naquela tela.
    Pra mim, foi a melhor solução.
    terça-feira, 28 de abril de 2015 11:43