Objota O mundo orientado a objetos

hashDoS a falha de segurança que afeta a maioria das linguagens WEB

Posted on janeiro 1, 2012

Posted by Eder Freire

Recentemente na Alemanha aconteceu a 23ª edição da Chaos Computer Club, uma conferência de segurança muito conhecida entre os hackers de todo mundo e, pra variar, as primeiras palestras foram assustadoras. Um pesquisador encontrou uma brecha que afeta milhões de celulares no mundo todo nas redes 2G GSM, mas o que realmente me chamou atenção foi uma dupla de pesquisadores avisou que milhões de sites estão vulneráveis a um novo tipo de ataque DoS (Denial of Service), chamado hashDoS, que pode deixá-los fora do ar se não tratado com rapidez.

Os pesquisadores Alexandre Klink e Julian Wälde gesticularam e demonstraram que o problema está na maneira que certas linguagens usadas em servidores web armazenam valores em uma tabela hash. A grande maioria utiliza do mesmo método e pessoas mal-intencionadas podem tirar vantagens disso, enviando valores pré-determinados que sabem sabem que não serão tratados da forma que deveriam ser tratados. Essas requisiões, no final das contas, acaba gerando uma função quadrática que sobrecarrega os servidores.

Para provar que o método funciona, durante a apresentação, eles enviaram requisições do tipo HTTP POST com 2 MB de tamanho para um servidor WEB rodando Apache Tomcat, isso foi o suficiente para que o processamento do servidor subisse para a marca de 100% de consumo e permanecesse neste nível durante toda a palestra.

Quais linguagens afetadas?

A lista não é nada pequena. Nela constam PHP, ASP.NET, Java, Python, Ruby, Apache Tomcat, Apache Geronimo, Jetty, Glassfish, e até a V8, engine de renderização de JavaScript do Google.

Note que aqui temos interpretadores e servidor de aplicação, nessa os servidores WEB e o protocolo HTTP escaparam, sempre alvos de ataques de hackers.

Quais linguagens ja iniciaram o processo de correção e em qual versão isso ja está corrigida?

JRuby >= 1.6.5.1
PHP >= 5.3.9 (ainda está em Release Candidate), 5.4.0 RC4
Ruby >= 1.8.7-p357, 1.9.x
Apache Tomcat >= 5.5.35, 6.0.35, 7.0.35
Rack >= 1.4.0, 1.3.6, 1.2.5, 1.1.3

A Microsoft ja anunciou que vai liberar uma atualização para o ASP.NET que soluciona esse problema.

Os mais afetados com certeza serão os sites com PHP, hoje 77% dos sites em PHP rodam sob o PHP 5.2, que não teve nenhum suporte a este buf-fix. O certo é migrar-mos nossos sites para o PHP 5.3.9 RC, a 5.3 ja é a versão estável do PHP, o que garante atualizações de segurança e novos recursos.

Há linguagens que não entraram na lista, pois isso não era novidade para seus criadores, uma que vale a pena destacar, a qual eu sou fã, é o Perl, eles trataram esse problema em meados de 2003, pois ja haviam identificado essa falha.

A explicação é extramamente complexa, vale a pena dar uma olhada no vídeo da apresentação no Youtube .

Você também pode conferir o anúncio oficial.

Drive MySql de conexão para Eclipse

Posted on setembro 13, 2010

Posted by Rodrigo Ireno

Olá, neste artigo iremos focar em como utilizar o drive de conexão do Mysql na IDE eclipse. Veremos passo-a-passo como instalar, o que é uma coisa muito simples, e alguns comandos SQL com Java.

Quem já me conhece sabe que costumo escrever sobre php. Então já deve ter visto o artigo sobre PDO. E advinha em que o PDO foi baseado? Em? O Java!

Vamos aos passos:

1º - Faça download do Eclipse se não estiver instalado, neste link:
http://www.eclipse.org/downloads/packages/eclipse-ide-java-developers/heliosr

- para este artigo sugiro utilizar a versão clássica para java SE.

2º - Faça download do drive de conexão com o banco de dados mysql. No próprio site deles, neste link:
http://www.mysql.com/downloads/connector/j/

Escolha o tipo de arquivo que deseja baixar e clique em download, você será redirecionado para uma página que irá sugerir um cadastro, porém isso não é necessário, clique no link
» No thanks, just take me to the downloads!” e siga em frente para fazer download.

Depois disso você será direcionado a página com o link de download. Clique no link, como na imagem abaixo, pode ser qualquer um com as bandeiras do Brasil:

3º - Agora precisamos do Banco de dados, claro! Você pode adquirir o banco de dados gratuitamente no próprio site Mysql.com, porém sua configuração iria estender um pouco mais a coisa, e até tornar um pouco mais complicado. Para tanto, utilize um gerenciador que já instala pra você o Mysql – entre outras coisas -, e uma interface de administrador. O mais fácil e que eu sugiro é o xampp.

O xampp é gratuito e de fácil instalação. Depois de instalado, para acionar o banco de dados mysql é só clicar no botão "start", e para usar o phpMyAdmin (interface para administração do banco) é preciso iniciar também o Apache com "start".

Veja um artigo utilizando o xampp.

Você pode fazer download do xampp neste link:
http://www.baixaki.com.br/download/xampp.htm

Bom, se tudo ocorreu bem até agora, você já deve ter os ingredientes:
Eclipse, drive de conexão, xampp  (cujo "m" da sigla é de Mysql)

Vamos por a mão na massa então! Instale o xampp e o eclipse.

Com o xampp iniciado clique em start para o mysql e o Apache;

Depois clique no botão admin para o mysql;

Ele irá abrir em seu browser padrão o phpMyAdmin. Crie um banco de dados com o nome tutorial.

não iremos entrar em maiores detalhes no phpMyAdmin, pois este não é o foco deste artigo, conteudo sobre phpMyAdmin

Interface phpmyadmin

Depois de criado, ele irá aparecer na lateral esquerda do browser. Clique no nome do Banco de dados que você acabou de criar com o nome tutorial e depois na aba SQL, à direita. E excute esta query, ou crie uma tabela equivalente.


CREATE TABLE IF NOT EXISTS `cliente` (

`id` int(11) NOT NULL AUTO_INCREMENT,

 `nome` varchar(80) NOT NULL,

 `fone` varchar(80) NOT NULL,

PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Após isso crie um novo projeto no eclipse com o nome de sua preferência. Dentro deste projeto crie as seguintes classes abaixo.

Antes de tudo, vamos esclarecer que este artigo não visa utilizar nenhum padrão de desenvolvimento específico. É somente um “Oi banco de dados”

package tutorial;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Conexao {

	// Carrega driver JDBC
	static {
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			throw new RuntimeException(e);
		}
	}

	//Obtem conexao com banco de dados
	public Connection obtemConexao() throws SQLException{
		return DriverManager.getConnection(
				"jdbc:mysql://localhost/tutorial","root","");
	}
}

package tutorial;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.ResultSet;

public class Cliente {

	private int idCliente;
	private String nome;
	private String fone;

	public Cliente(){

	}

	public Cliente(int idCliente) {
		this.idCliente = idCliente;
	}

	public Cliente(String nome, String fone) {
		this.nome = nome;
		this.fone = fone;
	}

	public int getIdCliente() {
		return idCliente;
	}

	public void setIdCliente (int idCliente) {
		this.idCliente = idCliente;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getFone() {
		return fone;
	}

	public void setFone(String fone) {
		this.fone = fone;
	}

	//  Inclusao de clientes
	public void incluir(Connection conn) {

		//Armazena a string contento o comando sql numa variavel.
		//Repare nos pontos de interrogação, pois eles serão preenchidos!

		String sqlInsert = "INSERT INTO cliente(nome, fone) VALUES ( ?, ?)";

		//inicio um objeto que prepara a instrução a ser executada.
		 //Veja o 'null'.Ele ainda está vazio

		PreparedStatement stm = null;
		try {

			 	//Agora sim. Atraves do objeto Connection eu
			 	//recupero o objeto 'preparador de instrução'.
			 	//veja que já inseri a variavel que tem o comando sql!

			stm = conn.prepareStatement(sqlInsert);

			 //Lembra dos pontos de interrogação, no seu comando sql?
			 //o método setString seta estes pontos de interrogação.
			 //substituindo-os pelo valor que vem no segundo parâmetro.
			 //Portanto...

			//Aqui, substitui a primeira interrogação pelo nome do cliente
			stm.setString(1, getNome());

			//Aqui, substitui a segunda interrogação pelo fone (telefone) do cliente
			stm.setString(2, getFone());

			//E finalmente depois de tudo devidamente preparado ele chama
			// o comando execute()
			stm.execute();

		} catch (Exception e) {
			//Caso tenha uma exceção printa na tela
			e.printStackTrace();
				try {
					//Aqui ele 'tenta' retroceder, na ação que deu errado.
					// quese um Ctrl+Z da vida.
					conn.rollback();
				} catch (SQLException e1) {
					System.out.print(e1.getStackTrace());
				}
		} finally {
			// Comando finally sempre é executado
			if (stm != null) {
				try {
					// Encerra as operações.
					stm.close();
				} catch (SQLException e1) {
					System.out.print(e1.getStackTrace());
				}
			}
		}
	}

	public void buscar(Connection conn) {

		String sqlSelect = "SELECT nome, fone FROM cliente WHERE cliente.id = ?";

		PreparedStatement stm = null;

		  // Aqui temos uma nova estrela no pauco.
		  // O objeto ResultSet é responsavel por manipular
		  // os resultados de uma query de busca.

		ResultSet rs = null;

		try {
			//vide explicaçao anterior
			stm = conn.prepareStatement(sqlSelect);

			//ponto de interrogação por valor getIdCliente()
			stm.setInt(1, getIdCliente());

			//O comando abaixo retorna um objeto ResultSet
			//com os valores dos dados buscados.

			rs = stm.executeQuery();

			//use next() para verificar se ele veio preenchido
			//de dados. Ele também pode ser usado em um while,
			//para querys que resultem em mais de um registro.

			if (rs.next()){

				//Acima no nosso select foi declarado:
				//SELECT nome, fone FROM..
				//portanto o 1 = nome e o
				//2 = fone

				//getString(1) refere-se ao atributo 'nome' da nossa query
				this.setNome(rs.getString(1));

				//Já o getString(2) refere-se ao atributo 'fone'
				this.setFone(rs.getString(2));
			}

		} catch (Exception e) {
			e.printStackTrace();
				try {
					conn.rollback();
				} catch (SQLException e1) {
					System.out.print(e1.getStackTrace());
				}
		} finally {
			if (stm != null) {
				try {
					stm.close();
				} catch (SQLException e1) {
					System.out.print(e1.getStackTrace());
				}
			}
		}
	}
}

package tutorial;

import java.sql.SQLException;
import java.sql.Connection;

 public class Teste {

    public static void main(String[] args) {

      Connection conn = null;

      Cliente cl;

      try {

      // obtem conexao com o banco
    	 Conexao bd = new Conexao();
         conn = bd.obtemConexao();

         conn.setAutoCommit(false);

      //  Inclusao do Primeiro Cliente
         cl = new Cliente("Mariana Soares", "1127991999");
         cl.incluir(conn);

      // Inclusao do Segundo Cliente
         cl = new Cliente();
         cl.setNome("João Neves");
         cl.setFone("1160606161");
         cl.incluir(conn);

      // Inclusao do Terceiro Cliente
         cl = new Cliente("Maria Oliveira", "1121212121");
         cl.incluir(conn);

      // efetiva inclusoes
         conn.commit();
         System.out.println("Inclusão concluída");
         System.out.println("Buscando...");

      // Busca Cliente com id 2
         cl = new Cliente(2);
         cl.buscar(conn);

         String saida = "Nome: "+cl.getNome()+
         				 "\nTelefone: "+cl.getFone()+
         				 "\nid: "+cl.getIdCliente();

         System.out.println(saida);
      }
          catch (Exception e) {
            e.printStackTrace();
            if (conn != null) {
               try {
                  conn.rollback();
               }
                   catch (SQLException e1) {
                     System.out.print(e1.getStackTrace());
                  }
            }
         }
      finally {
         if (conn != null) {
            try {
               conn.close();
            }
                catch (SQLException e1) {
                  System.out.print(e1.getStackTrace());
               }
         }
      }
      System.exit(0);
    }
}

Veja minha estrutura para este projeto:

Depois que as classes já estiverem ok iremos adicionar aquele drive ao nosso projeto. Para isso clique com o botão direito sobre o seu projeto.
Siga o caminho: Build Path > Configure Build Path >
escolha a aba Libraries.
Agora clique no botão “Add External JARs...”
Encontre o drive que você baixou, com extensão “.JAR”. Clique nele, depois em Abrir.
(ele precisa estar descompactado, ele era um .zip lembra?)
Pronto seu driver já foi instalado.

Para testar a coisa toda:

O xampp deve estar ligado, com mysql e apache iniciados. phpMyAdmin aberto, para você checar as alterações na sua tabela.

O script foi feito para inserir  três clientes toda vez que for rodado, e buscar um pelo id. Rode a classe Teste, agora veja o resultado no phpMyAdmin. Para atualizar a visualização, basta clicar na aba visualizar.

Esse artigo fica por aqui, qualquer dúvida postem. Obrigado e até a próxima!

Arrays em java

Posted on junho 29, 2010

Posted by Rodrigo Ireno

Deixando de lado ( só um pouco) as classes, vamos agora tratar de um elemento muito útil em qualquer linguagem de programação. O array.

Um array e um elemento que existe em praticamente todas as linguegens de programação, que é capaz de armazenar vários valores dentro dele. Sendo possível armazenar diversos valores dentro dele, tembém é preciso um modo de recuperar este falor, que é atravez de um índice.

Algumas linguagens possuem arrays de tamanho fixo e variável, que é o caso do java. Em outras como php o array tem tamanho sempre variável. Bom sendo assim vamos exemplificar como seria o armazenamento de valores dentro de um array, em java.
No java,  elementos não primitivos são objetos e todos os objetos devem ser inicializados com a palavra chave new. Para utilizar um array de tamanho fixo em java é preciso especificar seu tamanho durante a inicialização, veja:


int[] meuArray = new int[16];

 meuArray[0] = 23;
 meuArray[15] = 40;

Tomando nota do código acima, já é possível ter uma idéia de como funciona. Tenho um array de números inteiros, vamos aos detalhes.

Ao instanciar um array de tamanho fixo, é preciso determinar o número exato de elementos que ele poderá suportar. Neste caso o array suporta 16 números inteiros. Para poder referenciar um valor dentro deste array, eu utilizo a chave ou índice do array. É aquele [indice] abre-colchete :  índice  : fecha colchete. Sendo que a contagem dos índices começa a partir do zero, então o primeiro elemento está no índice 0, e o último elemento está no índice 15.

Veja que eu atribui um valor 40 ao índice 15, portanto meuArray[15] retornará a partir de então o valor 40.

Arrays são muito utilizados em conjunto com loops, estruturas de controle que repetem determinado comando. veja um exemplo:


//    Veja um exemplo com o loop for

int[] meuArray = new int[3];

meuArray[0] = 50;
meuArray[1] = 25;
meuArray[2] = 48;

// ou esqueça o feito anterior e faça assim..

int[] meuArray = {50, 25, 48};

// O resultado é o mesmo

for(int i=0; i < meuArray.length;i++){

 System.out.println(meuArray[i]);

}

//    O loop acima itera por todo o array e imprime na tela todo o seu conteudo.

Bom este é o exemplo de array de tamanho fixo, porém o java possui um array de tamanho variável, ou seja, você não precisa determinar um tamanho específico para ele. E é usado justamente quando não se tem certeza do que vem por aí para preencher o array.

Apresento, o ArrayList do  pacote java.util.ArrayList. Como ele faz parte de um pacote não incluso por padrão, ele deve ser importado com o comando import.

Mostrarei um exemplo completo no próximo artigo. desta vez com classes inteiras.

até.

Um pouco sobre a JVM – Java Virtual Machine

Posted on junho 29, 2010

Posted by Rodrigo Ireno

Olá, neste artigo vou comentar um pouco sobre a JVM (Java Virtual Machine) que é responsável por interpretar suas classes feitas em Java. Vamos ser diretos quanto aos fatos.

A linguagem Java possui um alto nível de portabilidade. O que seria? Portabilidade significa que o seu código é portável para diferentes plataformas, por tanto os programadores Java não precisam se preocupar a fundo com o sistema operacional para o qual está sendo feito o seu aplicativo. Como isso é possível?

Simples, quando o programador faz uma classe ou em um projeto inteiro, onde muitos profissionais atuam. O projeto consiste, geralmente, de milhares de classes. Todas escritas em linguagem Java. Os arquivos são salvos com a extensão “.java”.
exemplo: “filter.java” - exemplo de um arquivo que contenha alguma classe

Dentro de um arquivo como este, está tudo escrito em Java. Quando se compila o código Java em uma IDE qualquer, é gerado um arquivo filter, porém com uma extensão “.class” . Este arquivo “filter.class” contém o bytecode este por sua vez é executado pela Java Virtual Machine. Então por definição, quem executa uma aplicação feita em Java é a Virtual Machine, software free disponibilizado para download no site da Sun. Por isso a portabilidade do código fonte é tão grande, existem versões da Java Virtual Machine para quase todas, se não todas as plataformas existentes no mercado.

Isso tudo também leva a uma conclusão. Java é uma linguagem compilada e interpretada, e o que muitos profissionais já sabem é que isso acaba tornando-a lenta. Isso impossibilita seu uso em alguns projetos em que desempenho do software e uma prioridade.

É isso meus caros, espero ter enriquecido um pouco mais seus conhecimentos sobre Java. Até a próxima.