Caelum | Ensino e Inovação - Cursos de Java, Scrum, Ruby on Rails


Próximas palestras: mercado de trabalho, scrum e testes!

Por luiz.bassi em 20/04/09

Na sexta feira, dia 24 de abril, Paulo Silveira vai palestrar na Feira do Estudante, um evento gigante organizado pelo CIEE que foca no início da carreira do profissional, a respeito de oportunidades de trabalho no exterior com computação, contado a sua própria experiência e de diversos colegas da Caelum:
http://www.empresas.ciee.org.br/portal/hotsites/feiradoestudante/…

Já no sábado, dia 25 de abril, Fabiano Milani, da parceira AdaptWorks, abordará o tema “Scrum na sua empresa” no 14o encontro de Design e Tecnologia digital:
http://www.edted.com.br/ewd-14/index.php/palestras

Na semana seguinte, na quarta feira dia 29 de abril, José Donizetti e Paulo Silveira farão uma apresentação entitulada “Desmistificando o TDD na prática” na reunião mensal do SouJava. Você pode ver a programação da palestra e se inscrever aqui:
http://tinyurl.com/soujava290409

Essas são ótimas oportunidades de vocês conhecerem um pouco mais do nosso trabalho e do dia a dia da nossa equipe! Espero vocês lá. E no mês seguinte temos o Falando em Java 2009, no domingo, dia 24 de maio.

Falando em Java 2009
  • Share/Bookmark

Falando em Java 2009: inscrições abertas

Por Sérgio Lopes em 14/04/09

Falando em Java 2009Estão abertas as inscrições para o evento Falando em Java 2009. O já consolidado evento organizado pela Caelum chega a sua terceira edição esse ano com duas atrações internacionais e palestras de alto nível. E o evento desse ano promete superar o sucesso de anos anteriores.

Jim Webber, diretor da ThoughtWorks, apresentará a palestra Guerrilha SOA. E Bill Burke, arquiteto da JBoss/RedHat e participante da JSR 311 do JAX-RS, apresentará Web Services Restful: Putting Java to REST. Além disso, contaremos com os instrutores e consultores da Caelum em palestras sobre Arquitetura, Plataforma Java, JavaTV, VRaptor 3 e JBoss Seam (essa última com participação de Alessandro Lazarotti, da RedHat Brasil). Veja a grade completa.

  • Share/Bookmark

Segurança em aplicações Web: Injeção de novos parâmetros

Por Sérgio Lopes em 07/04/09

Seguindo na série sobre Segurança em aplicações Web, vamos falar agora de Injeção de Parâmetros. O outro artigo da série é:


SegurançaTodo mundo sabe que um dos maiores problemas de segurança é não validar os inputs do usuário. O próprio XSS de certa forma, está ligado a isso, como também o famoso SQL Injection e muitos outros ataques.

Mas sempre fica a dúvida de saber como tratar esses inputs. É um problema realmente complicado determinar que tipos de entradas são válidas em cada request então as pessoas acabam não fazendo nada e aí temos as falhas de segurança. E não adianta deixar tudo inseguro e depois acionar um advogado quando as coisas derem errado, temos que programar direito nossos sites!

Nesse artigo, vou mostrar um exemplo de injeção de parâmetros perigosos e que é muito comum de acontecer por causa da Web e dos frameworks modernos.

Injeção de atributos

Se você usa qualquer framework Java para Web (VRaptor, Struts, Mentawai, Waffle, …) deve estar acostumado com a facilidade de não se preocupar com request.getParameter(). Escrevemos um JavaBean e o framework popula automaticamente os dados pra gente seguindo os nomes do parâmetro.

Imagine um sistema onde as pessoas se cadastram em algum serviço online. Escrevemos uma classe Usuario:

public class Usuario {
    private String email;
    private String senha;
}

E, no formulário de cadastro, basta enviar os parâmetros usuario.email e usuario.senha.

/usuario/cadastra?usuario.email=example@example.com&usuario.senha=1234

Facilidade! Mas imagine que queremos ter também uma área administrativa e certos usuários com permissão para acessá-la:

public class Usuario {
    private String email;
    private String senha;
    private boolean admin;
}

No formulário de cadastro geral, a pessoa só cadastra email e senha, e no cadastro dentro da área de admin temos um checkbox a mais.

/admin/usuario/cadastra?usuario.email=example@example.com&usuario.senha=1234&usuario.admin=true

Fácil, certo? E extremamente inseguro. E se no cadastro dos usuários normais um usuário mal intencionado passa &usuario.admin=true? Bam! [espero que nenhum leitor desse blog ainda ache que só porque o form do html não tem o campo, estamos seguros]

O problema não existiria se ainda programássemos com request.getParameter(), já que na lógica dos usuários normais obviamente só pegaríamos os parâmetros usuario e email. A questão toda aparece quando usamos as facilidades dos frameworks que saem pegando qualquer parâmetro e jogando nos beans.

Resolvendo

Mas o que fazer? Não usar os frameworks e voltar para as Servlets? Óbvio que não. O primeiro passo é você rever todos os seus códigos atrás desse tipo de falha e perceber o quão grave ele é. Depois partimos para algumas medidas.

A solução mais elgante seria não ter nenhum atributo no seu bean que não pode ser populado pelo usuário. Crie várias classes, se são coisas realmente diferentes (UsuarioNormal e UsuarioAdmin). É a abordagem “white-list“, onde dizemos explicitamente quais são os campos aceitos e qualquer coisa fora disso é ignorada.

Às vezes, não é possível usar o mesmo bean para a pegar os parâmetros e para o Hibernate, por exemplo. Não tente forçar usar o mesmo bean sempre ou você pode cair em casos inseguros que custarão mais dinheiro que as duas classes que você escreveu a mais.

Uma outra solução, se você não pode criar várias classes, é resetar os campos sabidamente exploráveis antes de usá-la:

class UsuarioLogic {
  // framework popula o parâmetro
  public void cadastra (Usuario u) {
    // reseto campos sensíveis
    u.setAdmin(false);

   // ... uso o objeto
  }
}

O problema sobre essa última abordagem é que você está trabalhando no esquema de “black-list“, ou seja, você coloca os atributos problemáticos na lista negra e reseta-os um a um. A dificuldade com isso é saber se, no dia que aparecer um novo atributo problemático, você vai lembrar de resetar seu valor.

Em geral, quando se fala de segurança, soluções white-list são consideradas mais seguras e future-proof que soluções black-list.

Conclusão

Que devemos tratar inputs do usuário, todos sabemos. Mas devemos estar atentos a muitas possibilidades diferentes de injeções maliciosas. As injeções de novos parâmetros são um problema muito comum em especial nos frameworks web que usamos hoje em dia.

Vimos aqui a injeção por meio de beans em frameworks Web Java. Mas esteja certo de não ser vulnerável a injeção de parâmetros em outras frentes, mesmo usando getParameter explicitamente ou usando outras plataformas que não Java.

  • Share/Bookmark



Caelum | Ensino e Inovação
São Paulo: Rua Vergueiro, 3185, cj. 87, próximo ao Metrô Vila Mariana   |   Tel. (11) 5571-2751
Rio de Janeiro: Rua Senador Dantas, 80, cj. 307/308 - Centro   |   Tel. (21) 2220-4156 ou 2297-0033
Brasília: SCS Qd. 8 Bl. B-50, Sala 521 - Ed. Venâncio 2000   |   Tel. (61) 3039-4222