Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Protegendo a aplicação contra clientes maliciosos

A forma como o Vraptor popula os objetos automaticamente com os dados vindos da view facilita e muito o trabalho do desenvolvedor, no entanto em dados de formulários via POST por exemplo, um usuário mal intencionado pode tentar subverter os dados enviados através de fornecimento de campos ou propriedades que não existem no formulário, bagunçar os relacionamentos das entidades com o auxilio de ferramentas como o curl, ou simplesmente em telas de edição o cara simplesmente abrir o firebug modificar o campo hidden e conseguir alterar registros que não são dele ou que não tenha permissão para modificar.

No SpringMVC para tentar solucionar estes problemas pode,os especificar o allowedFields no DataBinder, eu acredito(salvo engano) que ainda não há algo do tipo no VRaptor, sendo assim como faço para me proteger destas brechas de segurança? (falha que não é do vraptor, que fique claro e sim da forma como o frame preenche automaticamente os objetos)

4 respostas

Oi Ricardo, tudo bem? Curioso você falar nisso, pois estamos trabalhando bastante em novidades nesse ponto de segurança do VRaptor. Por enquanto você pode cuidar disso usando a integração com o bean validator, criando custom validators pra garantir a integridade dos dados que estão chegando da view: http://www.vraptor.org/en/docs/validation/.

Oi Turini, obrigado por responder, muito bom mesmo saber que vcs estão trabalhando nesses itens em relação à segurança.

Então, pesquisando na web, entrei no github do projeto Mamute e encontrei o trecho no CommentControler:

@Post
    public void edit(Long id, MarkedText comment) {
        Comment original = comments.getById(id);
        if (!currentUser.getCurrent().isAuthorOf(original)) {
            result.use(Results.status()).badRequest("comment.edit.not_author");
            return;
        }
        if (validator.validate(comment.getPure())) {
            original.setComment(comment);
            comments.save(original);
            result.forwardTo(BrutalTemplatesController.class).comment(original);
        }
        validator.onErrorUse(Results.http()).setStatusCode(400);
    }

Ele faz uma busca no banco e compara o autor do comentário com o usuário da sessão e se forem diferentes não salva, isso solucionaria a questão do cara enviar o id no form, mas isso me traz uma nova dúvida, é melhor meu controller interagir diretamente com as entidades persistentes da JPA ou para protejer melhor o domínio utilizar os VO's,DTO's? qual sua opinião a respeito?

solução!

Oi Ricardo! É bastante relativo. Muitas vezes uma consulta no DAO vai ser suficiente, mas no geral é sempre interessante deixar esse tipo de regra isolada, pra ser fácil evoluir conforme precisar. Por exemplo, se eu fosse refatorar esse código, deixaria ele assim:

@Post
@RequiresAuthor
public void edit(Comment comment) {
    //...    
}

E criaria um custom validator pra esse @RequiresAuthor. Ou seja, deixaria o controle de acesso separado da lógica do controller. Faz sentido?

faz muito sentido :)