Hack e PHP: Usando as Linguagens em aplicações Web

Hack e PHP: Usando as Linguagens em aplicações WebO aprimoramento dos processos de desenvolvimento, a necessidade de otimização de recursos e a possibilidade de aumentar a influência e participação no mercado de software tem estimulado grandes companhias a lançar suas próprias linguagens de programação. Isso aconteceu com a Microsoft, o Google, a Apple e agora também o Facebook. Diante do rápido crescimento e a necessidade de uma tecnologia capaz de proporcionar eficiência no desenvolvimento e no processamento, mas ao mesmo tempo permitir a adoção de forma progressiva a companhia criou uma linguagem derivada e que mantém uma relação simbiótica com o PHP, por ser essa a base de seu software web responsável pela rede social de mesmo nome. A linguagem Hack apresenta vários recursos típicos de linguagens compiladas e com tipos estáticos, mas ao mesmo tempo permite o uso e convivência com variáveis, retornos e parâmetros com tipos dinâmicos, típicos de linguagens interpretadas. As técnicas para permitir essa convivência harmônica demonstram ser bastante eficazes, apesar da complexidade adicional que agregam. Realizaremos a comparação entre as linguagens PHP e Hack e analisamos as características, vantagens e desvantagens da novíssima linguagem, que foi anunciada em 2014.

Histórico

Em 2010 um tradutor e compilador PHP chamado HipHop Compiler (HPHPc, na abreviação em inglês) foi anunciado pela equipe do Facebook depois de dois anos de desenvolvimento. Essa ferramenta traduzia códigos em PHP para C++ e depois os compilava num processo que era executado de forma antecipada, em oposição ao comportamento usual do servidor PHP que realiza a compilação no momento que a página/funcionalidade é chamada. Ainda em 2010 uma extensão com pequenas mudanças na linguagem PHP foi criada pela equipe do Facebook para diminuir o tempo de desenvolvimento e permitir que o PHP fosse capaz de compreender fragmentos de documentos XML, conforme o exemplo da Listagem 1. Essa extensão foi chamada de XHP e além de facilitar o desenvolvimento e manutenção da camada de apresentação pelos desenvolvedores front-end também auxiliava em dificultar ataques cross-site scripting.

Listagem 1. Código XHP

 <?php

  if ($_POST[‘name’]) {

    ?><span>Hello, {$_POST[‘name’]}</span><?

  } else {

  ?> echo

      <form method=”post”>

        What is your name?<br />

        <input type=”text” name=”name” />

        <input type=”submit” />

      </form>;

  <?

  }

Todos esses esforços em desenvolver melhorias tanto para a linguagem quanto para o processo de compilação dos softwares em PHP do Facebook têm sido empregados com o intuito de reduzir o overhead derivados da ineficiência em relação ao custo de processamento da forma original de compilação das aplicações desenvolvidas em PHP. Continuando com esses esforços a equipe do Facebook trabalhou no desenvolvimento de um compilador nativo para o PHP, que fosse capaz de gerar binários a partir de código PHP, mas com eficiência superior ao processo de compilação tradicional da linguagem. Nesse sentido, a equipe anunciou em 2012 que estava realizando testes com uma nova máquina virtual chamada HipHop (HHVM, na sigla em inglês) e em 2013 completaram a migração do processo de compilação da HPHPc para a HHVM.

Apesar de ter demonstrado ganhos de eficiência de até 11, 6 vezes com o uso da máquina virtual HipHop dificuldades no processo de desenvolvimento e testes inerentes à ausência de tipos da linguagem PHP motivaram a equipe do Facebook a criar uma nova linguagem, baseada em PHP, que permitisse a inferência de possíveis falhas de programação ainda em tempo de desenvolvimento.

A linguagem Hack

A Hack é uma linguagem de programação lançada em 2014, de código aberto, sob licença BSD, para a máquina virtual HipoHop e que interopera sem problemas com PHP. A Hack concilia o ciclo de desenvolvimento rápido da PHP com a disciplina provida pela definição de tipos de forma estática e permite emprego gradual, adicionando muitas características comumente encontradas em outras linguagens modernas.

A Hack foi criada a partir da extensão da linguagem PHP, introduzindo tipos definidos estaticamente através do conceito de anotação de tipos (type annotation, em inglês). Devido aos tipos definidos o analisador da máquina virtual HipHop pode detectar erros de programação durante o processo de checagem de código ainda em tempo de desenvolvimento.

Essa etapa de checagem de código, conforme a Listagem 2, permite que o analisador verifique todas as dependências de um trecho do código em todos os arquivos do projeto que estão relacionados e permite que se saiba se uma alteração tem reflexos em outros trechos do código da aplicação e informa onde essas alterações impactaram e como.

Listagem 2. Código Hack

 <?hh

  class MinhaClasse {

    public function alpha(): int {

      return 1;

    }

   public function beta(): string {

      return ‘olá teste’;

    }

 }

 function f(MinhaClasse $minha_inst): string {

    //corrija-me!

    return $ minha_inst->alpha();// o analisador detecta um erro aqui

  }

Devido ao fato de a PHP ser uma linguagem com tipos definidos dinamicamente e a Hack ser uma proposta de conversão gradativa e evolutiva as premissas do projeto da linguagem definiram que seria necessário suportar características de PHP que não são comuns em linguagens de tipos definidos de forma estática. Se não fosse adotada essa premissa, os projetos atuais em PHP que fossem ser migrados para a linguagem Hack teriam de ter grande parte dos códigos existentes em PHP reescritos, e essa não é a proposta do Facebook.

Apesar de ser definida pelo Facebook como uma nova linguagem a Hack é uma mistura de extensão do PHP com adição de recursos e mudanças de paradigmas, mas mantendo a compatibilidade com código PHP nativo. A extensão dos arquivos de código continua sendo .php (opcionalmente podendo ser .hh) e o conceito de ligação entre os arquivos de código que compõem um projeto continua sendo através de inclusão (include e require).

Para suportar a característica de falta de escopo léxico a Hack implementou o conceito de tipo não resolvido (unresolved type, em inglês). Isso significa que o verificador adia o momento no qual deduzirá o tipo de uma variável ou do retorno de uma função. O momento no qual se deduzirá o tipo de uma variável será quando houver uma chamada de função ou algum tipo de anotação que determine especificamente que tipo é esperado.

A Máquina Virtual HipHop e a linguagem Hack

A HHVM é uma máquina virtual projetada para executar programas escritos em Hack e PHP e utiliza uma abordagem de compilação JIT para alcançar uma eficiência superior em quanto mantém a flexibilidade de desenvolvimento que o PHP provê. O Facebook alega que o objetivo dessa linguagem é adicionar novas características, mas manter a convivência com o PHP, assim como investir esforços para fazer com que a nova linguagem continue sendo compatível com sua predecessora, conforme as duas evoluam. Essa estratégia de compatibilidade foi implementada através de três conceitos importantes na avaliação do código pela HHVM: tipos por anotação (annotation types, em inglês), modo do hack (hack mode, em inglês) e na combinação de tipos não resolvidos (unresolved types, em inglês) e tracelet.

A HHVM infere sobre tipos latentes (ainda não resolvidos) através da estruturação do JIT vinculado ao conceito de tracelet, que é um bloco básico especializado para um conjunto particular de tipos descobertos em tempo de execução para os valores de entrada. O tracelet permite que a HHVM eficientemente conheça os tipos do programa através da observação do mesmo.

O tipo por anotação permite que seja acrescentada uma definição do tipo na assinatura do método ou na declaração de uma variável ou classe. Como essa definição de tipo é um recurso adicional, caso não seja definido o analisador considerará o código como um PHP tradicional. Entretanto, essa convivência pode gerar conflitos quando uma função define seu tipo de acordo com condições dinâmicas, mas o objeto ou função que venha a chamá-lo em algum momento espere um retorno de um determinado tipo. Para esses casos é invocado o conceito adiamento de definição (unresolved type, em inglês) e tracelet. O analisador continua com a verificação até que em algum trecho do código o tipo não resolvido seja utilizado como se fosse de um determinado tipo e nesse momento ele verifica a compatibilidade de tipos.

Para resolver questões como essa é possível ainda que o programador assuma o controle da verificação e determine que um trecho de código não deva ser analisado considerando tipos. Nesses casos é possível definir o modo da linguagem, informando o nível de análise crítica que a HHVM deve fazer do trecho do código. Com as definições, por exemplo, //partial ou //unsafe é possível criar exceções de blocos de código que fogem à regra geral de tipos definidos estaticamente da Hack.

Com o uso da HHVM o código continua sendo transformado em código nativo somente quando necessário, não sendo necessário um ciclo de compilação anterior, já que essa etapa é feita por um compilador em tempo de execução (JIT Compiler, em inglês).

A HHVM pode ser integrada a IDEs para que a checagem de tipos ocorra de forma automática e transparente para o usuário. Para a plataforma Linux já existem plug-ins para softwares de desenvolvimento (Emacs e Vim). Para permitir essa checagem a máquina virtual disponibiliza um serviço que pode ser chamado pelo comando hh_client, que varrerá o diretório especificado e analisará as dependências e tipos de todos os arquivos PHP do projeto. Esse serviço não só valida o código como aponta onde há erro e qual o erro que deve ser corrigido.

Arquitetura da Máquina Virtual

Foi concebida sabendo da necessidade de uma IDE que seja capaz de fazer a checagem de erros em tempo de desenvolvimento. A solução foi criar um servidor que funciona como um serviço, que mantém o rastreamento das dependências entre os arquivos, classes e métodos e faz checagem de tipo de todos esses arquivos, recalculando os tipos quando alguma coisa é alterada. O monitoramento das mudanças ocorre quando um arquivo é salvo, já que o processo escuta os eventos do kernel de alteração de arquivo em disco.

Os requisitos

Uma das grandes características do PHP é que o desenvolvedor poder alterar parte do código diretamente no servidor, pressionar F5 no navegador e visualizar a alteração imediatamente. A Hack e a HHVM mantêm essa característica e por isso foram determinadas restrições em relação ao desempenho da checagem, como uma latência muito baixa, sendo menos de 200 milissegundos para reavaliar o contexto quando houver mudança em arquivos num cenário de operação cotidiana e alguns segundos quando for feita uma operação de versionamento. Uma segunda premissa foi a de que a HHVM deveria ser capaz de funcionar com controle de versão e ser estável, e por isso testes consistentes foram conduzidos antes de migrar o sistema do Facebook para essa tecnologia, segundo a equipe que desenvolveu a tecnologia.

Outro aspecto importante que foi considerado como condição para o projeto foi a escalabilidade e isso foi resolvido empregando paralelismo de tarefas, cache e execução de tarefas de forma incremental. As checagens de tipo são feitas pontualmente de acordo com a mudança feita, sem verificar tudo novamente, mas sim o que foi alterado (que é monitorado constantemente).

Hack versus PHP

O principal argumento da equipe do Facebook para a criação da linguagem Hack foi a ausência de tipos estáticos e a consequente dificuldade para se automatizar testes de checagem de código. Já a criação da HHVM visou incrementar a eficiência, diminuindo o custo de processamento, e permitir que checagens de código automatizadas fossem feitas em tempo de desenvolvimento, aumentando a produtividade dos programadores através da identificação mais rápida de defeitos. O anúncio da linguagem Hack traz uma séria de recursos que auxiliam na identificação de erro, mas também um novo paradigma para o universo de desenvolvedores PHP, apesar de manter a compatibilidade com códigos legados através de um modelo de convivência entre as linguagens.

O Facebook adotou a linguagem PHP para o desenvolvimento do software da sua rede social e a utiliza desde a sua criação em 2003. Com o crescimento a rede social tem relatado problemas de eficiência e produtividade ao atingir larga escala em desenvolvimento e uso da tecnologia e talvez por isso venha trabalhando no que considera um aperfeiçoamento do PHP, seguindo no sentido de tornar a tecnologia menos flexível para atingir uma melhor eficiência e produtividade. Mesmo o modelo de transição apresentado pela linguagem sendo necessário para a migração gradual de softwares existentes e trazendo flexibilidade e liberdade ao desenvolvedor a convivência entre os paradigmas de tipos dinâmico e estático na mesma linguagem traz complexidade adicional, tanto para o desenvolvedor que deseja aprender a tecnologia quanto para a máquina virtual, que tem de lidar com múltiplos cenários (tipos estáticos, dinâmicos e uma mistura entre os dois em alguns casos). Outro aspecto importante a ser considerado é a falta de suporte ao sistema operacional Windows e a ambientes de desenvolvimento integrado (IDEs) populares no mercado, como PhpStorm, Sublime e NetBeans, já que somente estão disponíveis plug-ins para as ferramentas de desenvolvimento Emacs e Vim, ambas disponíveis somente para Linux e Mac OS.

Apesar de a linguagem PHP suportar oito tipos primitivos (boolean, integer, float, string, array, object resource e null) não é possível definir o tipo de retorno de um método, de uma variável ou de um parâmetro. A exceção ocorre a partir da versão 5.0 e 5.1, nas quais é possível utilizar o conceito de indução de tipo definido pelo usuário ou de um vetor, respectivamente. Entretanto, nos dois casos, a linguagem aceita, nesses casos, receber um parâmetro com valor nulo. Já na linguagem Hack é possível definir os tipos de membros de classe, parâmetro de funções e retorno de funções. Todos os outros tipos são inferidos pela HHVM.

Para permitir a convivência com código PHP tradicional a linguagem Hack introduz o conceito de modo (hack mode, em inglês), que é a definição do nível de rigor ou flexibilidade que deve ser aplicado à checagem. Os modos disponíveis são:

  • strict – Todo o código deve ser no padrão Hack (com tipos anotados) e tudo deve ser checado pela HHVM.
  • partial – O verificador deve checar tudo que for possível, decidindo isso de forma automática e ignorando o que não for possível checar.
  • decl – Nada deve ser checado. Significa que o desenvolvedor deseja usar o PHP nativo.
  • UNSAFE – significa que deve ser criada uma exceção no modo de checagem até que termine o bloco seguinte.

O modo strict não permite o uso de funções que não sejam declaradas/importadas pelo arquivo que está sendo checado. Isso significa que funções que deveriam ser visíveis devido aos includes e requires realizados em etapas anteriores não serão analisadas e consideradas válidas. É possível ainda que haja trechos de códigos (retorno de método, parâmetro ou membro de classe) sem tipo definido. Para isso deve ser usado o modo partial ou decl ou ainda definir um bloco com UNSAFE.

A falta de tipos estáticos em PHP demanda que o desenvolvedor conheça detalhes da implementação ou leia comentários do código (que eventualmente pode não existir ou estar desatualizado) para ter ciência exata dos tipos aceitos e retornados por classes e métodos. Essa questão torna-se ainda mais importante quando vários desenvolvedores trabalham em paralelo no mesmo projeto. Isso pode gerar maior necessidade de comunicação e documentação ou facilitar a inserção de códigos com defeito. Essas demandas, no entanto, podem ser compensadas pelo fato de ser necessário se escrever menos código para executar as mesmas funções do que se escreveria em linguagens com tipos estáticos.

A inferência de tipos realizada pela HHVM, conforme o exemplo da Listagem 3, ocorre através da verificação do uso dos valores de um objeto ou variável e não necessariamente da declaração. Esse conceito é aplicado, por exemplo, a vetores. É possível criar um vetor somente com valores inteiros e adicionar um uma string na posição seguinte. O verificador permitirá isso por que na verdade esse não é um vetor de inteiros, como poderia parecer, mas um vetor de inteiros ainda não resolvido, que parece ser de inteiros, mas ainda não é. Na Hack há um tipo chamado mixed, e nesse caso o verificador infere que esse é o tipo do vetor em questão. Entretanto no momento que for tentado usar o vetor citado como um vetor de inteiros (por exemplo, retornando-o numa função que está declarada tendo como retorno um vetor de inteiros) o verificador vai invalidar o código. Na Tabela 1 comparamos os tipos suportados por cada linguagem.

Listagem 3. Inferência de tipos em Hack

 <?hh

 class MinhaClasse {

    public function fazer_algo():

        Vector<int> {    $v = Vector {1, 2};

        $v[] = “a”;   

         return $v; //neste ponto o verificador aponta erro

    }

 }

Tipo PHP Hack
Boolean sim sim
Integer sim sim
Float sim sim
String sim sim
Array sim sim
Object sim sim
Resource sim sim
Null sim sim
(deve ser definido explicitamente)
Nullable (?int, ?myclassname) não sim
Mixed não sim
Touples não sim
Closures não sim
Collections não sim
Generics não sim
Constraints não sim
Type não sim
Aliasing não Sim

Tabela 1. Tipos suportados pelo PHP e Hack

Na Listagem 4 vemos o uso do aliasing para redefinir o tipo existente (semelhante a função alias no PHP) e dos tipos genéricos (parecido com o que acontece nas linguagens Java e C#) que o PHP não suporta.

Listagem 4. Uso de aliasing e tipos generics

  // Uso de aliasing

  <?hh

 type MyInt = int;

  function foo(MyInt $mi): void {

   //fazer alguma coisa

  }

 //exemplo de uso do tipo generics

  <?hh

  class Box<T> {

    protected T $data;

    public function __construct(T $data) {

      $this->data = $data;

    }

    public function getData(): T {

      return $this->data;

    }

  }

  Box<int> $my_box = new Box<int>();

Características da PHP não suportadas na Hack

Apesar da linguagem Hack ser uma extensão da PHP há características nativas da linguagem original não suportadas na nova linguagem. Entretanto a máquina virtual HipHop suporta todos os recursos nativos do PHP e por isso se o código for aberto pela tag <?php tais recursos podem ser utilizados, mas não estará em uso a linguagem Hack e por consequência nenhum dos recursos da nova linguagem estará presente. Entre os recursos desativados alguns dos mais significativos são o uso de variáveis globais, passagem de valores por referência e marcação para silenciar erros que poderiam ser lançados por uma função.

A linguagem Hack traz características típicas de linguagens com tipos estáticos aliadas a um modelo de convivência com códigos PHP tradicionais, que visivelmente foi mantido para permitir uma transição gradual dos softwares do Facebook. Esse novo paradigma demanda projetos de software e implementações distintas da que a comunidade de desenvolvedores PHP está habituada.

A característica de conceito de tipos definidos em tempo de desenvolvimento requer mais linhas de código e estrutura arquitetural mais rígida e devido à consequente disciplina requerida pode fazer com que haja uma resistência por parte dos programadores pelo fato disso exigir que se abra mão de certa flexibilidade. Por outro lado, acrescenta grande capacidade de automatização de testes e ajuda a evitar erros durante a programação. Devido a incompatibilidades específicas vários softwares livres e proprietários devem demonstrar serem incompatíveis com a nova linguagem no seu modo strict, apesar de poderem ser executados usando a máquina virtual HipHop.

O fato de ser desenvolvida, apoiada e testada por uma empresa de destaque a área de software facilita no convencimento da sua viabilidade e confiabilidade, mas por ser muito recente requer acompanhamento para averiguar se será adotada em larga escala, pela comunidade em geral. Por se tratar de uma mudança de paradigma e apesar do modelo de convivência e das opções de modos da linguagem a mesma aponta mais para uma ruptura gradual com o PHP do que uma evolução em conjunto. A possibilidade de se programar “misturando” as duas linguagens é adequada para permitir uma maior aceitação da mesma no início, mas mesmo o Facebook afirmando que empreenderá esforços para fazer com que a nova linguagem continue sendo compatível com sua predecessora essa convivência tende a ser abandonada a logo prazo e o modo strict tende a se tornar padrão, dada as vantagens que a definição de tipos de forma estática apresenta.

Esperamos que esse artigo tenha lhe ajudado na compreensão das novas tecnologias propostas pelo Facebook e provoque uma reflexão sobre o futuro da linguagem PHP quando confrontada com suas vantagens e desvantagens considerando produtividade, eficiência e o paradigma de tipo que é adicionado pela Hack.

Retirado de:  Hack e PHP: Usando as Linguagens em aplicações Web

Anúncios

Como escolher um bom Domínio

Como escolher um domínioAntes mesmo de você escrever uma linha de código, pintar um pixel no Photoshop ou traçar uma linha no Corel, seu site começou como uma ideia. E essa ideia precisa de um nome que corresponda.

Infelizmente, na maioria das vezes não dá para pegar o domínio que você queria tanto. A World Wide Web já está aí tem uns vinte anos e todos os nomes bons já foram pegos por empresas sérias ou aproveitadores. Será?

Sites de leilão de domínios como o Sedo podem ser uma boa alternativa se você está disposto a investir pesado para angariar um bom nome. No Brasil, nomes disputados pode ficar amarrados em problemas jurídicos ou congelados por anos a fio sem uma solução.

Mas se você não tem paciência, nem verba, é melhor pensar em alternativas. Prestando atenção a algumas dicas:

A maioria absoluta dos usuários só conhece os TLDs .com, .net e .org e mesmo esses dois últimos não são tão populares quanto o primeiro. O ICANN pode liberar centenas de alternativas, milhares talvez, mas o público vai continuar preferindo os tradicionais. Qual foi a última vez em que você entrou em um site .info ou .hotel?

Em contrapartida, se você deseja preservar a sua marca, é bom adquirir, pelo menos, os três mais famosos. É muito comum você registrar meusitebacana.com e tempos depois um oportunista registrar meusitebacana.net ou meusitebacana.org. Você constrói sua marca com trabalho pesado, divulgação e publicidade e o malandro fatura uns trocados com aqueles usuários que se confundirem na hora de digitar o endereço ou tentando se passar pelo site legítimo. Resolver um conflito desses pode ser mais complicado do que você gostaria e o valor do domínio alternativo ficará mais caro na mão do aproveitador.

Evite utilizar hifens no seu domínio: eles confundem o usuário e também abrem brecha para oportunistas.

Domínios confusos como del.icio.us podem ter feito sucesso no passado, mas certamente mais pela qualidade do serviço do que pela URL. Erros de digitação são inevitáveis nestes casos. E não se iluda: o próprio Delicious acabou comprando o domínio delicious.com e abandonando a grafia estranha. Agora, tente digitar tumbler.com para ver se você vai cair no site da rede social Tumblr (dica: não vai).

Se você deseja atingir uma audiência localizada, vale a pena investir em um ccTLD (country-code Top Level Domain) nativo. Em alguns países, é obrigatório ter um endereço físico local. Não tente forjar informações ou haverá um sério risco de ter seu domínio revogado.

Mas escolher o domínio não encerra essa fase do projeto. Com o seu servidor configurado para apontar para aquele endereço, não se esqueça de permitir o acesso quer o visitante digite ou não o WWW. Não é incomum ver sites profissionais que se esquecem deste detalhe trivial e acabam servindo uma mensagem de servidor não encontrado se o usuário não digita WWW.

Outra boa ideia seria deixar preparado o subdomínio “m“. Nesta era de dispositivos móveis conquistando cada dia mais espaço, já se tornou quase um padrão que um site tenha uma versão móvel em m.meusitebacana.com, por exemplo. É uma alternativa relativamente óbvia para o usuário, mais popular e muito mais barata que o TLD .mobi, que ninguém está usando por enquanto.

O que é firewall? Introdução 02

Tipos de firewall

O trabalho de um firewall pode ser realizado de várias formas. O que define uma metodologia ou outra são fatores como critérios do desenvolvedor, necessidades específicas do que será protegido, características do sistema operacional que o mantém, estrutura da rede e assim por diante. É por isso que podemos encontrar mais de um tipo de firewall. A seguir, os mais conhecidos.

Filtragem de Pacotes (Packet FilteRing)

As primeiras soluções de firewall surgiram na década de 1980 baseando-se em filtragem de pacotes de dados (packet filtering), uma metodologia mais simples e, por isso, mais limitada, embora ofereça um nível de segurança significativo.

Para compreender, é importante saber que cada pacote possui um cabeçalho com diversas informações a seu respeito, como endereço IP de origem, endereço IP do destino, tipo de serviço, tamanho, entre outros. O Firewall então analisa estas informações de acordo com as regras estabelecidas para liberar ou não o pacote (seja para sair ou para entrar na máquina/rede), podendo também executar alguma tarefa relacionada, como registrar o acesso (ou tentativa de) em um arquivo de log.

Filtragem de Pacotes

Filtragem de Pacotes

A transmissão dos dados é feita com base no padrão TCP/IP (Transmission Control Protocol/Internet Protocol), que é organizado em camadas, como explica este texto sobre endereços IP. A filtragem normalmente se limita às camadas de rede e de transporte: a primeira é onde ocorre o endereçamento dos equipamentos que fazem parte da rede e processos de roteamento, por exemplo; a segunda é onde estão os protocolos que permitem o tráfego de dados, como o TCP e o UDP (User Datagram Protocol).

Com base nisso, um firewall de filtragem pode ter, por exemplo, uma regra que permita todo o tráfego da rede local que utilize a porta UDP 123, assim como ter uma política que bloqueia qualquer acesso da rede local por meio da porta TCP 25.

Filtragens estática e dinâmica

É possível encontrar dois tipos de firewall de filtragem de pacotes. O primeiro utiliza o que é conhecido como filtros estáticos, enquanto que o segundo é um pouco mais evoluído, utilizando filtros dinâmicos.

Na filtragem estática, os dados são bloqueados ou liberados meramente com base nas regras, não importando a ligação que cada pacote tem com outro. A princípio, esta abordagem não é um problema, mas determinados serviços ou aplicativos podem depender de respostas ou requisições específicas para iniciar e manter a transmissão. É possível então que os filtros contenham regras que permitem o tráfego destes serviços, mas ao mesmo tempo bloqueiem as respostas/requisições necessárias, impedindo a execução da tarefa.

Esta situação é capaz de ocasionar um sério enfraquecimento da segurança, uma vez que um administrador poderia se ver obrigado a criar regras menos rígidas para evitar que os serviços sejam impedidos de trabalhar, aumentando os riscos de o firewall não filtrar pacotes que deveriam ser, de fato, bloqueados.

A filtragem dinâmica surgiu para superar as limitações dos filtros estáticos. Nesta categoria, os filtros consideram o contexto em que os pacotes estão inseridos para “criar” regras que se adaptam ao cenário, permitindo que determinados pacotes trafeguem, mas somente quando necessário e durante o período correspondente. Desta forma, as chances de respostas de serviços serem barradas, por exemplo, cai consideravelmente.

Firewall de Aplicação ou Proxy de Serviços (Proxy Services)

firewall de aplicação, também conhecido como proxy de serviços (proxy services) ou apenas proxy é uma solução de segurança que atua como intermediário entre um computador ou uma rede interna e outra rede, externa – normalmente, a internet. Geralmente instalados em servidores potentes por precisarem lidar com um grande número de solicitações, firewalls deste tipo são opções interessantes de segurança porque não permitem a comunicação direta entre origem e destino.

A imagem a seguir ajuda na compreensão do conceito. Perceba que em vez de a rede interna se comunicar diretamente com a internet, há um equipamento entre ambos que cria duas conexões: entre a rede e o proxy; e entre o proxy e a internet. Observe:

Proxy

Proxy

Perceba que todo o fluxo de dados necessita passar pelo proxy. Desta forma, é possível, por exemplo, estabelecer regras que impeçam o acesso de determinados endereços externos, assim como que proíbam a comunicação entre computadores internos e determinados serviços remotos.

Este controle amplo também possibilita o uso do proxy para tarefas complementares: o equipamento pode registrar o tráfego de dados em um arquivo de log; conteúdo muito utilizado pode ser guardado em uma espécie de cache (uma página Web muito acessada fica guardada temporariamente no proxy, fazendo com que não seja necessário requisitá-la no endereço original a todo instante, por exemplo); determinados recursos podem ser liberados apenas mediante autenticação do usuário; entre outros.

A implementação de um proxy não é tarefa fácil, haja visto a enorme quantidade de serviços e protocolos existentes na internet, fazendo com que, dependendo das circunstâncias, este tipo de firewall não consiga ou exija muito trabalho de configuração para bloquear ou autorizar determinados acessos.

Proxy transparente

No que diz respeito a limitações, é conveniente mencionar uma solução chamada de proxy transparente. O proxy “tradicional”, não raramente, exige que determinadas configurações sejam feitas nas ferramentas que utilizam a rede (por exemplo, um navegador de internet) para que a comunicação aconteça sem erros. O problema é, dependendo da aplicação, este trabalho de ajuste pode ser inviável ou custoso.

O proxy transparente surge como uma alternativa para estes casos porque as máquinas que fazem parte da rede não precisam saber de sua existência, dispensando qualquer configuração específica. Todo acesso é feito normalmente do cliente para a rede externa e vice-versa, mas o proxy transparente consegue interceptá-lo e responder adequadamente, como se a comunicação, de fato, fosse direta.

É válido ressaltar que o proxy transparente também tem lá suas desvantagens, por exemplo: um proxy “normal” é capaz de barrar uma atividade maliciosa, como um malware enviando dados de uma máquina para a internet; o proxy transparente, por sua vez, pode não bloquear este tráfego. Não é difícil entender: para conseguir se comunicar externamente, o malware teria que ser configurado para usar o proxy “normal” e isso geralmente não acontece; no proxy transparente não há esta limitação, portanto, o acesso aconteceria normalmente.

Inspeção de Estados (Stateful Inspection)

Tido por alguns especialistas no assunto como uma evolução dos filtros dinâmicos, os firewalls de inspeção de estado(stateful inspection) trabalham fazendo uma espécie de comparação entre o que está acontecendo e o que é esperado para acontecer.

Para tanto, firewalls de inspeção analisam todo o tráfego de dados para encontrar estados, isto é, padrões aceitáveis por suas regras e que, a princípio, serão usados para manter a comunicação. Estas informações são então mantidas pelo firewall e usadas como parâmetro para o tráfego subsequente.

Para entender melhor, suponha que um aplicativo iniciou um acesso para transferência de arquivos entre um cliente e um servidor. Os pacotes de dados iniciais informam quais portas TCP serão usadas para esta tarefas. Se de repente o tráfego começar a fluir por uma porta não mencionada, o firewall pode então detectar esta ocorrência como uma anormalidade e efetuar o bloqueio.

Arquitetura dos firewalls

Você certamente percebeu que, a julgar pela variedade de tipos, os firewalls podem ser implementados de várias formas para atender às mais diversas necessidades. Este aspecto leva a outra característica importante do assunto: a arquitetura de um firewall.

Quando falamos de arquitetura, nos referimos à forma como o firewall é projetado e implementado. Há, basicamente, três tipos de arquitetura. Veremos elas a seguir.

Arquitetura Dual-Homed Host

Nesta modalidade, há um computador chamado dual-homed host que fica entre uma rede interna e a rede externa – normalmente, a internet. O nome se deve ao fato de este host possuir ao menos duas interfaces de rede, uma para cada “lado”.

Perceba que não há outro caminho de comunicação, portanto, todo o tráfego passa por este firewall, não havendo acesso da rede interna para a rede externa (e vice-versa) diretamente. A principal vantagem desta abordagem é que há grande controle do tráfego. A desvantagem mais expressiva, por sua vez, é que qualquer problema com o dual-homed – uma invasão, por exemplo – pode pôr em risco a segurança da rede ou mesmo paralisar o tráfego. Por esta razão, o seu uso pode não ser adequado em redes cujo acesso à internet é essencial.

Este tipo de arquitetura é bastante utilizado para firewalls do tipo proxy.

Screened Host

Na arquitetura Screened Host, em vez de haver uma única máquina servindo de intermediadora entre a rede interna e a rede externa, há duas: uma que faz o papel de roteador (screening router) e outra chamada de bastion host.

O bastion host atua entre o roteador e a rede interna, não permitindo comunicação direta entre ambos os lados. Perceba então que se trata de uma camada extra de segurança: a comunicação ocorre no sentido rede interna – bastion host – screening router – rede externa e vice-versa.

Arquitetura Screened Host

Arquitetura Screened Host

O roteador normalmente trabalha efetuando filtragem de pacotes, sendo os filtros configurados para redirecionar o tráfego ao bastion host. Este, por sua vez, pode decidir se determinadas conexões devem ser permitidas ou não, mesmo que tenham passado pelos filtros do roteador.

Sendo o ponto crítico da estrutura, o bastion host precisa ser bem protegido, do contrário, colocará em risco a segurança da rede interna ou ainda poderá torná-la inacessível.

Screened Subnet

A arquitetura Screened Subnet também conta com a figura do bastion host, mas este fica dentro de uma área isolada de nome interessante: a DMZ, sigla para Demilitarized Zone – Zona Desmilitarizada.

A DMZ, por sua vez, fica entre a rede interna e a rede externa. Acontece que, entre a rede interna e a DMZ há um roteador que normalmente trabalha com filtros de pacotes. Além disso, entre a DMZ e a rede externa há outro roteador do tipo.

Arquitetura Screened Subnet

Arquitetura Screened Subnet

Note que esta arquitetura se mostra bastante segura, uma vez que, caso o invasor passe pela primeiro roteador, terá ainda que lidar com a zona desmilitarizada. Esta inclusive pode ser configurada de diversas formas, com a implementação de proxies ou com a adição de mais bastion hosts para lidar com requisições específicas, por exemplo.

O nível segurança e a flexibilidade de configuração fazem da Screened Subnet uma arquitetura normalmente mais complexa e, consequentemente, mais cara.

Firewalls pessoais

O tópico sobre arquiteturas mostra as opções de configuração de firewalls em redes. Mas, como você provavelmente sabe, há firewalls mais simples destinados a proteger o seu computador, seja ele um desktop, um laptop, um tablet, enfim. São os firewalls pessoais (ou domésticos), que DEVEM ser utilizados por qualquer pessoa.

Felizmente, sistemas operacionais atuais para uso doméstico ou em escritório costumam conter firewall interno por padrão, como é o caso de distribuições Linux, do Windows 8 ou do Mac OS X. Além disso, é comum desenvolvedores de antivírus oferecerem outras opções de proteção junto ao software, entre elas, um firewall.

Mas, para quem procura uma solução mais eficiente e que permita vários tipos de ajustes, é possível encontrar inúmeras opções, muitas delas gratuitas. Usuários de Windows, por exemplo, podem contar com o ZoneAlarm, com o Comodo, entre outros.

Independente de qual seja o seu sistema operacional, vale a pena pesquisar por uma opção que possa atender às suas necessidades.

Firewall de hardware

Já foi mencionado neste texto o fato de um firewall poder ser uma solução de software ou hardware. Esta informação não está incorreta, mas é necessário um complemento: o hardware nada mais é do que um equipamento com um software de firewall instalado.

É possível encontrar, por exemplo, roteadores ou equipamentos semelhantes a estes que exercem a função em questão função. Neste caso, o objetivo normalmente é o de proteger uma rede com tráfego considerável ou com dados muito importantes.

Um firewall Netgear modelo FVS318

Um firewall Netgear modelo FVS318

A vantagem de um firewall de hardware é que o equipamento, por ser desenvolvido especificamente para este fim, é preparado para lidar com grandes volumes de dados e não está sujeito a vulnerabilidades que eventualmente podem ser encontrados em um servidor convencional (por conta de uma falha em outro software, por exemplo).

Limitações dos firewalls

Lendo este texto, você já deve ter observado que os firewalls têm lá suas limitações, sendo que estas variam conforme o tipo de solução e a arquitetura utilizada. De fato, firewalls são recursos de segurança bastante importantes, mas não são perfeitos em todos os sentidos.

Resumindo este aspecto, podemos mencionar as seguintes limitações:

  • Um firewall pode oferecer a segurança desejada, mas comprometer o desempenho da rede (ou mesmo de um computador). Esta situação pode gerar mais gastos para uma ampliação de infraestrutura capaz de superar o problema;
  • A verificação de políticas tem que ser revista periodicamente para não prejudicar o funcionamento de novos serviços;
  • Novos serviços ou protocolos podem não ser devidamente tratados por proxies já implementados;
  • Um firewall pode não ser capaz de impedir uma atividade maliciosa que se origina e se destina à rede interna;
  • Um firewall pode não ser capaz de identificar uma atividade maliciosa que acontece por descuido do usuário – quando este acessa um site falso de um banco ao clicar em um link de uma mensagem de e-mail, por exemplo;
  • Firewalls precisam ser “vigiados”. Malwares ou atacantes experientes podem tentar descobrir ou explorar brechas de segurança em soluções do tipo;
  • Um firewall não pode interceptar uma conexão que não passa por ele. Se, por exemplo, um usuário acessar a internet em seu computador a partir de uma conexão 3G (justamente para burlar as restrições da rede, talvez), o firewall não conseguirá interferir.

Finalizando

Como você pôde observar, firewalls são soluções importantes de segurança – não é por menos que surgiram na década de 1980 e são amplamente utilizados até os dias de hoje. Mas, tal como evidencia o tópico sobre limitações, um firewall não é capaz de proteger totalmente uma rede ou um computador, razão pela deve ser utilizado em conjunto com outros recursos, como antivírus, sistemas de detecção de intrusos, VPN (Virtual Private Network) e assim por diante.

O pensamento que se deve ter é o de que o firewall é parte da segurança, não a segurança em si, da mesma forma que acontece em um prédio, por exemplo: muros, portões, câmeras de vigilância e alarmes fazem a segurança de maneira conjunta, havendo menos eficiência se apenas um ou outro item for utilizado.

Fonte:

O que é firewall? Introdução

Introdução

Firewall

Firewall

Mesmo as pessoas menos familiarizadas com a tecnologia sabem que a internet não é um “território” livre de perigos. É por esta razão que é importante conhecer e utilizar ferramentas de proteção para computadores e redes. Este texto trata de uma das opções de segurança mais importantes dos ambientes computacionais: o firewall.

Nas próximas linhas, você entenderá o conceito de firewall, conhecerá os seus tipos mais comuns e entenderá os motivos que levam estas soluções a serem consideradas imprescindíveis.

O que é firewall?

Firewall é uma solução de segurança baseada em hardware ou software (mais comum) que, a partir de um conjunto de regras ou instruções, analisa o tráfego de rede para determinar quais operações de transmissão ou recepção de dados podem ser executadas. “Parede de fogo”, a tradução literal do nome, já deixa claro que o firewall se enquadra em uma espécie de barreira de defesa. A sua missão, por assim dizer, consiste basicamente em bloquear tráfego de dados indesejado e liberar acessos bem-vindos.

Representação básica de um firewall

Representação básica de um firewall

Para compreender melhor, você pode imaginar um firewall como sendo uma portaria de um condomínio: para entrar, é necessário obedecer a determinadas condições, como se identificar, ser esperado por um morador e não portar qualquer objeto que possa trazer riscos à segurança; para sair, não se pode levar nada que pertença aos condôminos sem a devida autorização.

Neste sentido, um firewall pode impedir uma série de ações maliciosas: um malware que utiliza determinada porta para se instalar em um computador sem o usuário saber, um programa que envia dados sigilosos para a internet, uma tentativa de acesso à rede a partir de computadores externos não autorizados, entre outros.

Como um firewall funciona?

Você já sabe que um firewall atua como uma espécie de barreira que verifica quais dados podem passar ou não. Esta tarefa só pode ser feita mediante o estabelecimento de políticas, isto é, de regras, como você também já sabe.

Em um modo mais restritivo, um firewall pode ser configurado para bloquear todo e qualquer tráfego no computador ou na rede. O problema é que esta condição isola este computador ou esta rede, então pode-se criar uma regra para que, por exemplo, todo aplicativo aguarde autorização do usuário ou administrador para ter seu acesso liberado. Esta autorização poderá inclusive ser permanente: uma vez dada, os acessos seguintes serão automaticamente permitidos.

Em um modo mais versátil, um firewall pode ser configurado para permitir automaticamente o tráfego de determinados tipos de dados, como requisições HTTP (sigla para Hypertext Transfer Protocol – protocolo usado para acesso a páginas Web), e bloquear outras, como conexões a serviços de e-mail.

Perceba, como estes exemplos, que as políticas de um firewall são baseadas, inicialmente, em dois princípios: todo tráfego é bloqueado, exceto o que está explicitamente autorizado; todo tráfego é permitido, exceto o que está explicitamente bloqueado.

Firewalls mais avançados podem ir além, direcionando determinado tipo de tráfego para sistemas de segurança internos mais específicos ou oferecendo um reforço extra em procedimentos de autenticação de usuários, por exemplo.

Você terá mais detalhes sobre o funcionamento dos firewalls no tópico a seguir.

O conceito de Cloud Computing

Cloud Computing

Cloud Computing

Cloud Computing ou Computação em Nuvem é um conceito genérico que envolve a entrega de serviços hospedados na Internet. O nome Cloud Computing foi inspirado no símbolo da nuvem que é muitas vezes utilizado para representar a Internet. A definição mais próxima para a Cloud Computing é representada como um tipo de computação escalável através de diversos recursos de TI que entregam como um serviço, sob demanda, para os clientes externos que usam a Internet.

A Cloud Computing é o próximo estágio na evolução da Internet, pois, além de fornecer os meios através da infraestrutura, da tecnologia, aplicações e de processos, podem entregar ao usuário o que ele precisar, em forma de serviço. Esta evolução para a computação em nuvem já é uma realidade e pode mudar completamente a forma como as empresas usam a tecnologia para os clientes, parceiros e fornecedores dos serviços.

Algumas empresas já têm recursos de TI quase que inteiramente na nuvem, mas isso não significa que todos os aplicativos, serviços e processos necessariamente devem ser movidos para a nuvem.

Na síntese, uma Cloud Computing vai entregar um serviço aos seus clientes na Internet, auxiliando o compartilhamento e seu uso de forma escalável e sob demanda, realizando a virtualização de seus recursos.

Exemplos

Há dezenas de fornecedores de Cloud Computing na Internet, e não deve ser nenhuma surpresa que alguns dos maiores nomes em computação em nuvem sejam algumas das maiores empresas do mundo da informática.

Algumas delas são: Google, Microsoft, Yahoo, Salesforce.com, IBM, EMC, VMWare entre outras. Cada qual separada por tipos de serviços oferecidos na nuvem, como as de mídias ou redes sociais, interatividades e jogos online, serviços de armazenamento de arquivos, CRM – Ferramenta de Gerenciamento de Relacionamento com Clientes, serviços de e-mails e aplicações, virtualização e backup de dados.

Segurança da Informação com visão focada nos negócios

Em 11 de setembro de 2001, o mundo ficou estarrecido com o atentado que ocasionou a queda das Torres Gêmeas em Nova York. Muitas vidas foram perdidas e muitas famílias foram repentinamente desfeitas. As empresas que estavam ali sediadas tiveram seus negócios instantaneamente paralisados e, em algumas delas, nunca mais eles puderam ser retomados. Também ocorreram falências por conta do atentado. Você sabe o porquê?

Toda organização que de alguma forma depende de algum nível de infraestrutura de tecnologia da informação (TI), como computadores conectados a uma rede, acesso à internet, informações guardadas em repositórios eletrônicos, etc., precisa tomar certos cuidados para que as informações vitais à continuidade dos seus negócios sejam devidamente preservadas, especialmente no caso de catástrofes.

Ah, ela está falando isso por causa de vírus, porque um computador pode falhar, ou até mesmo por conta de uma invasão ocasionada por hackers em computadores da empresa, por exemplo”. Você pode estar pensando que é por isso. É verdade que isso procede, mas não é só por isso. Note que nada disso aconteceu às Torres Gêmeas.

À época do atentado, lembro-me que saiu diversas reportagens sobre o que aconteceu com a cidade e, sobretudo, com as empresas que ali funcionavam. Como na ocasião eu interessava pela área de Segurança da Informação, o assunto me interessava profundamente, pois queria saber como as organizações estavam fazendo para se recuperar.

Os dois edifícios abrigavam instituições americanas e várias multinacionais, tais como bancos e seguradoras, canais de televisão, empresas de tecnologia da informação, de transporte aéreo, etc. Portanto, pode-se perceber pelo tipo de empresas listadas, o quanto elas dependiam da tecnologia para realizar seus negócios. Agora, imagine o cenário: de repente toda a infraestrutura do seu empreendimento, em questão de segundos, é destruída. Pior ainda, vidas são perdidas. O prejuízo financeiro é alto, mas ainda é possível de ser reduzido. E o prejuízo dos recursos humanos, das vidas que se foram? Não há como rapidamente se refazer.

E é aí que a Segurança da Informação presta seu papel mais valioso: na prevenção e na mitigação dos riscos de perda de informação. É claro que imaginar que aviões poderiam algum dia ocasionar a queda dos prédios é um risco que eu diria ser de probabilidade baixa de ocorrer. Contudo, quando aconteceu, foi de alto impacto. Além disso, eu imaginava que algumas dessas organizações já se preocupavam com os riscos de incêndio e mesmo atentados. Porque ambos já haviam acontecido lá alguns anos antes. Você sabia disso?

Acabei confirmando que algumas empresas conseguiram se recuperar porque tinham se preparado para o pior. Havia planos de continuidade de negócios organizados para diversos cenários. Os funcionários também foram orientados e treinados previamente sobre como reagir em casos de emergência. Havia políticas de salvaguarda das informações (backups) que eram efetivamente praticadas. E, para o pior dos cenários catastróficos, havia até mesmo um segunda unidade de TI, prontinha para funcionar a qualquer momento, caso o centro principal falhasse. Como acabou realmente acontecendo.

As organizações que assim procederam puderam sobreviver. Claro que tiveram prejuízo imediato, mas isso foi diminuído por conta das ações tomadas. Tomadas no tempo certo, porque isso também foi determinante. Outras, embora até tivessem planos e políticas de Segurança da Informação escritas, não os revisavam ou não usavam práticas que contribuíssem para mitigar os riscos. E, quais foram então as consequências disso? Descobri que algumas organizações levaram dias para se recuperar e outras que, infelizmente, como não se precaviam  acabaram falindo. Outras fecharam as suas portas simplesmente porque não havia como repor, de um dia para o outro, centenas de pessoas que trabalhavam em uma mesma empresa! Portanto, a lição que o atentado deixou, pelo menos no que se refere à Segurança da Informação, é bem clara: prevenir ainda realmente é melhor do que remediar.

Novamente, você pode estar pensando: “Ah, mas a minha realidade é outra. A minha empresa é pequena, não precisa dessa parafernália toda! Quanto exagero!” Cuidado com essa visão simplista e reducionista: as ameaças à Segurança da Informação estão por aí a todo momento, para empresas de qualquer porte e em qualquer lugar do mundo.

Inclusive há um fator, na minha opinião, o mais difícil de ser combatido: o humano. Funcionários sem treinamento adequado para operar computadores ou lidar com informações de caráter estratégico ou sigiloso, podem ocasionar perdas ou até colocar em risco os negócios da organização. É muito comum também executivos e proprietários das empresas cometerem esses erros. Não foram poucas as vezes que vi em saguões de aeroportos e em táxis, membros da alta direção falando em seus celulares, em alto e bom tom, sobre informações que deveriam estar apenas restritas ao âmbito da organização. Já soube, inclusive, de um caso em que um gerente falava ao celular sobre informações confidenciais enquanto esperava o seu avião chegar. Sentado ao seu lado, sem que ele se desse conta ou soubesse, estava o seu concorrente, prestando atenção em tudo! Há ainda o caso do gerente que soube que ia ser demitido naquele mesmo dia, através do motorista de táxi que ficava no ponto em frente à sua empresa.

Para saber mais,leia a norma NBR ISO/IEC 27002, Código de Prática para a Gestão da Segurança da Informação.

Fonte: Profissionais TI

Entenda o HTTP

Resumidamente, em uma arquitetura cliente-servidor, como é o caso da Web, um servidor Web recebe uma solicitação de um cliente. O servidor, por sua vez, pega a solicitação, encontra o recurso solicitado, podendo ser uma página HTML, ou um arquivo pdf, e retorna este recurso para o cliente. A Figura 1 ilustra esse cenário, onde existem muitos servidores e muitos clientes.

Arquitetura cliente-servidor presente na Web

Arquitetura cliente-servidor presente na Web

Na realidade, a coisa funciona assim. O browser formata uma Requisição e a envia para um servidor. O servidor por sua vez, procura o recurso solicitado, e caso o encontre, formata a Resposta e retorna para o browser. Este é o cenário perfeito, mas existem outros por menores que não serão tratados agora. A Figura 2 ilustra como funciona uma requisição e resposta típica.

Requisição a um servidor para obter um determinado recurso

Requisição a um servidor para obter um determinado recurso.

Certo, mas onde entra o HTTP? A maioria das conversas que ocorre na web entre clientes e servidores é mantida através do protocolo HTTP. Ele possibilita conversas de requisição (request) e resposta (response). Acontece assim: o cliente envia uma solicitação HTTP e o servidor retoma uma resposta HTTP. Conclusão: o HTTP é um protocolo que permite que um cliente e um servidor consigam se comunicar. Até mesmo para se enviar uma página HTML ao cliente, o servidor faz isso por meio do HTTP.

O protocolo HTTP apresenta diferentes tipos de métodos, capazes de definir diferentes tipos de funcionalidades. Os mais utilizados são os métodos HTTP GET e HTTP POST. Estes métodos possibilitam que durante a requisição feita ao servidor, também sejam enviados dados. A grande diferença entre esses dois métodos ocorre neste momento. O HTTP GET possibilita o envio limitado de dados, é utilizado normalmente para requisições simples. O HTTP POST possibilita que sejam enviados juntamente com a requisição, uma grande quantidade de dados, pois apresenta um formulário próprio para esse fim. A listagem 1 mostra uma típica solicitação GET ao servidor. A figura 3 mostra o retorno de uma solicitação. Uma resposta HTTP inclui, basicamente, um código de status, o tipo de conteúdo (também conhecido por MIME type) e o conteúdo real da resposta, no nosso caso, o HTML, mas poderia ser uma imagem, um arquivo pdf, entre outros.

Listagem1: Exemplo do requisição com método HTTP GET

  GET /select/selectDrink.jsp?color=white&taste=malty HTTP/1.1Host: http://www.testme.comUser-Agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US;

rv:l.4) Gecko/20030624 Netscape/7.1

Accept: text/xml,application/xml,application/xhtml+xml,text/

html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/

gif;q=0.2,*/*;q=0.1

Accept-Language: en-us,en;q=0.5

Accept-Encoding: gzip,deflate

Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7

Keep-Alive: 300

Connection: keep-alive

Exemplo de Resposta HTTP com conteúdo HTML

Exemplo de Resposta HTTP com conteúdo HTML