Protegendo sua aplicação – Mini Livro

Boas práticas para controle de acesso

Existem projetos onde algumas ações ou áreas que não devem estar acessíveis a todos os usuários. Para determinar se usuários podem ou não acessar determinado recurso é utilizado o conceito de perfil do usuário. Por exemplo: um usuário com perfil ADMINISTRADOR poderia executar qualquer função do projeto; um usuário com perfil GERENTE poderia apenas controlar ações de seus funcionários.

Alguns desenvolvedores pensam que basta esconder o botão que nenhum problema acontecerá, outros desenvolvedores resolvem bloquear tudo e só liberar o que o usuário precisar. Abaixo veremos técnicas que ajudarão a determinar acessos de segurança por perfil de usuário.

Esconda o botão/link, mas proteja o código

Imagine que apenas o usuário do perfil GERENTE poderia editar as horas extras de um funcionário. Para evitar que um funcionário edite suas próprias horas extras o desenvolvedor poderia esconder o botão. Bastaria utilizar um código javascript, classe css, scriplet ou qualquer coisa utilizando o valor do objeto do usuário: user.isManager().

O valor recuperado seria utilizado de algum modo pela página para definir se o link seria ou não escondido. O problema acontece quando um funcionário ganancioso, que quer ter mais horas extras sem trabalhar, ao passar atrás do monitor do gerente viu a seguinte URL: http://project/user/33/workedHours. O que aconteceria se uma pessoa com o perfil USUARIO tentasse acessar o projeto digitando a URL diretamente no browser?

Nunca proteja seu projeto apenas escondendo um recurso, sempre valide cada regra ao ser acessada. É necessário que, para cada request de acesso as horas extras de um funcionário, uma validação de segurança fosse executada no servidor. Nunca confie que ao esconder algo da tela do usuário a proteção estará completa.

Conheça a necessidade do seu usuário

Ao invés de bloquear tudo e depois ir liberando aos poucos seria melhor saber o que o usuário precisa. A vantagem de investir um pouco de tempo para entender o que o usuário precisa é justamente amenizar a experiência do usuário.

Um usuário que tem a necessidade de sempre solicitar acesso a determinado recurso no projeto, pode acabar não gostando do projeto e tratá-lo de qualquer modo. Existe também o problema de um usuário com muita permissão desnecessária que poderia esquecer seu computador desbloqueado e qualquer pessoa poderia navegar no projeto.

Uma boa solução para esse problema seria estudar quais acessos determinada pessoa ou papel dentro da empresa necessita ter, e criar o conceito de grupos ou papeis dentro do projeto específicos. Grupos dentro do projeto teriam permissões pré-determinadas e a chance de acertar o que casa usuário necessita aumentaria.

Sempre oculte

Não existe motivo para exibir algo que o usuário não possa acessar. Aplicações desktop costumam deixar um menu desabilitado visível. O problema de deixar um menu visível e bloqueado é que um usuário pode começar fazer de tudo para habilitar aquele menu.

Existem casos que o fluxo da tela é claro quando determinado botão ficará habilitado. No caso de um formulário onde o botão Salvar fica desabilitado enquanto os campos não forem corretamente preenchidos, seria perfeitamente normal utilizar essa abordagem. Imagine agora uma aplicação corporativa onde está sendo exibido o seguinte menu de modo desabilitado: “editar horas extras de todos funcionários”. Qual a necessidade de exibir essa função desabilitada para usuários sem permissão se apenas um gerente teria acesso a ela? Se um usuário nunca poderá habilitar determinada opção, qual é a necessidade de deixar a opção visível?

Uma opção desabilitada pode levar usuários comuns a tentarem habilitar dessa opção, e mostrar a hackers opções que ele nem precisava saber que existiria.

Se possível, sempre oculte o que o usuário não deve ver.

31 thoughts on “Protegendo sua aplicação – Mini Livro

  1. Achei muito positiva a iniciativa… acompanho o blog sempre que posso como maneira de estudo e sempre achei que isto é algo que falta na visão dos desenvolvedores e/ou analistas, porque impactam em outras áreas e medidas pequenas ajudam no que circunda uma aplicação.

    • Henrique, boa tarde.

      Realmente é difícil ver o assunto segurança em blogs ou foruns.

      Ultimamente li muito material sobre segurança e resolvi compartilhar. [=

      Obrigado pelo apoio! =D

  2. Parabéns pela iniciativa, Hebert!! Sempre tenho visto os posts e são sempre sobre um tema atual, interessante e este, um tema que pouco se ver falar. Vou terminar de ler, mas me parece bem interessante. Mais uma vez, parabéns!

  3. Parabéns por mais este excelente post!!!
    Mas eu gostaria de saber,e tenho certeza que outras pessoas que acompanham seu site também é quando teremos um livro da casa do codigo – EJB 3.2 Eficaz? rsss, já tenho a JSF Eficaz, JPA Eficaz.

    • Jivago, boa tarde.

      Muito obrigado pelo apoio, fico feliz por saber que estou ajudando.

      Quanto ao livro infelizmente não depende só de mim, mas do pessoal da casa do código também. [=

      Até mais.

  4. Parabéns Hebert :D os seus conteúdos são muito top :D

    E eu feliz aqui com meus 11k acessos do meu blog hauahuahua
    mas não crio nada, apenas posto soluções de exceptions/erros
    e tradução de alguns artigos que acho útil :D

    é isso ai… continue com o ótimo trabalho :D

    Abraços!

    • Gustavo, boa tarde.

      Obrigado pelo apoio.

      Eu vejo qualquer ajuda importante.

      Eu também fiquei feliz da vida quando fiz 10k de visitas algum tempo atrás.

      O importante é não desanimar. [=

      Até mais.

    • Jeferson, boa tarde.

      Obrigado pela visita, e desculpe a demora em responder. Estive muito ocupado nesse último mes.

  5. Parabéns pelo excelente post hebert, esse trabalho que você faz aqui no blog de compartilhar conhecimento é fantástico!

  6. Fiz um teste utilizando XSS, salvei como Teste
    E não funcionou =/

    Aqui não teve como por o link direito, mas eu fiz um link e não funcionou =I

    • Marcos, boa tarde.

      Nesse caso você não colocou a URL, por isso não apareceu direito. Acredite ou não, aqui para mim o Teste está parecendo diferente. [=

      Obrigado pela visita.

      • Boa Noite Hebert ,
        Aqui no blog ficou como link, mais na minha aplicação não ocorreu isso , ficou normal e até um script não rodou.
        Mas eu confio no que você diz e me atentarei com isso nas próximas vezes.

        Sensacional esse mini-livro, já li todos os livros e mini-livros seus[ tenho eles impressos para auto-ajuda].

        Impossível destacar qual o melhor, são todos sensacionais!

        Sou teu fã de carteirinha assinada tenho todas as coleções dos mini-livros e dos EFICAZES ( Jpa e JSF ), estou muito ansioso para o próximo lançamento do EFICAZ!.
        Deus continue te dando sabedoria, peço isso diariamente.
        Quero ser igual a você, com todo esse conhecimento algum dia, meu ídolo!

        Abraços, meus parabéns e até a próxima !

  7. Execelente mini livro, através dele estou podendo adquirir uma bela noção de segurança em aplicações que,particularmente, é uma área que me fascina e que é de suma importância, pois ataques especializados estão se tornando cada vez mais frequentes.

    Baixando o PDF para consulta posterior, mas voltarei a visitar esse site mais vezes!

  8. Não costumo comentar em blogs, mas nesse caso é preciso.
    Parabéns pelo trabalho cara, obrigado por compartilhar o seu conhecimento com a comunidade!

  9. Inacreditável pois quando aprendemos e lemos sobre o assunto de brechas de segurança e erros de programação, a primeira imagem que vem em mente é um estagiário criando seus primeiros códigos ou um estudante aprendendo sobre alguma linguagem e que saiu vendendo seus sites/projetos sem ter o conhecimento mínimo necessário, mas então vemos exemplos de erros e brechas da Microsoft, NASA, Yahoo, Nasdaq, governos entre tantos outros, é no mínimo cômico :D . Gostei muito deste seu mini livro, tem uma visão macro de muitos detalhes imprescindíveis para a sólida construção de um software. Parábens!

  10. Olá. Parabéns pelo blog. São ótimos os tópicos: atuais e revelantes. Já adicionei ao meu leitor de feeds.

    Fiquei com uma dúvida ao ler seu mini-livro e gostaria de ouvir sua opinião. E quanto ao uso de senhas e usernames em arquivos XML, como o persistente.xml do JPA? O que você recomenda? Criptografar o arquivo? E quanto à colocar senhas no próprio código fonte?

    Obrigado. Paulo.

    • Paulo, boa noite.

      Primeiro, me perde a demora em responder. Estou muito pegado no trabalho, para você ter idéia, estou te respondendo dele enquanto um deploy não termina.

      Honestamente não recomendo colocar senha nem no persistence.xml e nem no código. Para mim o melhor local para se colocar a senha é na configuração de pool de conexão que pode ficar dentro do servidor. Ao configurar o pool de conexão (ex.: tomcat, jboss, etc) você pode colocar a senha criptografada. A vantagem dessa abordagem é que você não precisará fazer um novo deploy da aplicação apenas por uma senha trocada.

      Espero ter ajudado, obrigado pela visita e pelo apoio.

  11. Outra dúvida: e quanto ao uso do atributo “rendered” do JSF para esconder informações importantes? Por exemplo, quando alguém esconde de um usuário comum, alguns itens de menu que só devem ser vistos por um usuário cadastrado no sistema.

    • Paulo, boa noite.

      Eu recomendo sempre esconder, mas ainda assim bloquear o acesso no código. Eu penso que se o usuário não deve ter acesso a informação, ela não deve nem ser enviada a tela.

      Espero ter ajudado. Obrigado pela visita.

      • Aí reside a minha dúvida: quando uso o “rendered”, os dados que não devem ser vistos são enviados na resposta da requisição e os mesmos são escondidos no browser do usuário (via JS, por exemplo)? Ou o JSF detecta, no lado do servidor, que os dados não devem ser enviados, altera a árvore de componentes e envia a resposta já omitindo esses dados? Obrigado.

        • Paulo, boa noite.

          Vou te dar uma resposta que você não esperava ouvir: “Por que você não faz o teste e coloca a resposta aqui? Esse teste é fácil de reproduzir. Após a página ser exibida, olhe o código fonte. Coloque em seu código códigos como System.out.println(“passou aqui”) para você saber por onde sua chamada passou”.

          Obrigado pela visita.

Leave a Comment