Skip to content

Latest commit

 

History

History
120 lines (94 loc) · 7.88 KB

Protocolo HTTP-HTTPS.md

File metadata and controls

120 lines (94 loc) · 7.88 KB

Protocolo HTTP e HTTPS

Começando do começo...

Para que possamos hackear alguma coisa devemos primeiro entender seu funcionamento.

Dito isto veremos o como funciona o protocolo HTTP (Hypertext Transfer Protocol), que é a base da World Wide Web.

O que é:

O HTTP é um protocolo da camada de aplicação do modelo TCP/IP que foi criado para possibilitar a transmissão de dados na internet.

Funcionamento:

Este protocolo funciona em cima de um modelo chamado cliente-servidor, onde o cliente faz requisições a um servidor, que como resposta lhe envia informações. Uma analogia para este modelo pode ser feita com a relação entre as pizzarias (servidores) e seus respectivos clientes, onde estes solicitam suas pizzas e as aguardam como resposta.

Sendo assim, quando um cliente acessa um site, ele está simplesmente solicitando ao servidor uma página web, que lhe é retornada (uma vez que exista) e renderizada pelo seu navegador.

Funcionamento Técnico:

Entendido o sistema cliente-servidor, veremos agora exemplos de requisições (requests) e repostas (responses) aplicadas ao protocolo HTTP:

Este é um exemplo de uma request:

GET / HTTP/1.1
Host: www.google.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:76.0) Gecko/20100101 Firefox/76.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3
Connection: close
Cookie: 

A princípio isto pode parecer confuso, mas vamos simplificar.

Tudo o que está escrito acima representa o cabeçalho (header) da request. Ele é usado para enviar todas as informações necessárias para que a conexão funcione adequadamente. Além do cabeçalho, podem ser anexados também um corpo (body), no qual são colocados os dados que o usuário deseja enviar para o servidor. Observe que o cabeçalho e o corpo da request são separados por uma quebra de linha.

POST / HTTP/1.1 
Host: localhost:8000
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:76.0) Gecko/20100101 Firefox/76.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Content-Type: text/plain
Content-Lenght: 325
Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3
Connection: keep-alive
Cookie: 

body

A primeira linha de toda request é usada para definir três coisas:

  1. O método da request, que pode ser:
GET - O cliente requisita algum recurso, como uma página ou uma imagem.
HEAD - Muito parecido com o GET, porém aqui o cliente requisita somente o cabeçalho header da página.
POST - O cliente está enviando dados que estão contidos no corpo da request.
PUT - Parecido com o POST, diferindo apenas em como o servidor irá lidar com os dados enviados. Por exemplo: Caso seja necessário atualizar os dados de um usuário, usa-se o método PUT, pois com ele o servidor irá sobrescrever os dados antigos com os novos, gerando somente um registro, com o POST o servidor cria vários registros, um para cada request feita.
DELETE - O cliente requisita que algum recurso seja excluído do servidor.
  1. A rota da aplicação para a qual a request está sendo feita.

  2. A versão do protocolo HTTP.

O restante do header contém diversos itens, sendo eles sempre definidos por CHAVE: VALOR. Os mais comuns são:

Host - Nome de domínio do servidor. Ex: www.google.com; www.youtube.com
User-Agent - Usado pelo servidor para identificar quem está fazendo a request. Ela contém dados como navegador e sistema operacional do cliente.
Accept - Exprime quais tipos de dados o cliente é capaz de entender. Ex: text/plain; application/json
Content-Type - Indica qual o tipo dos dados que o servidor ou o cliente está enviando. Ex: text/plain; application/json
Accept-Language - Indica qual linguagem o cliente entende. Usado para definir se uma página estará em português ou inglês, por exemplo.
Connection - Define se a conexão com o servidor deve ser mantida para futuras requisições, no primeiro caso seu valor é keep-alive, no segundo close.
Cookie - Funciona como um identificador e mantenedor de sessão. Por definição o HTTP é um protocolo stateless, o que significa que ele não mantém estado, ou seja, se você fizer login na sua rede social e tentar fazer outra ação, como mandar uma mensagem, você teria que se autenticar novamente, pois não há nada que defina você como logado, por isto foram definidos os cookies, com eles o usuário não precisa se autenticar toda vez. Entretanto, eles precisam ser enviados em todas as requisições subsequentes.
Referer - Contém o endereço de onde a request foi originada. Isto é usado pelo servidor para saber de onde os visitantes de seu site se originam.
Origin - Este header é muito parecido com o Referer, pois ambos indicam de onde a solicitação foi originada, no entanto este indica só o nome do site, não o caminho todo. Exemplo: Referer: exemplo.com/artigos/protocolo%20HTTP%20HTTPS Origin: exemplo.com

Uma vez feita a request, agora analisaremos a resposta do servidor.

HTTP/1.1 200 OK
Date: Mon, 11 May 2020 19:45:35 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=UTF-8
Strict-Transport-Security: max-age=31536000
Server: gws
X-Frame-Options: SAMEORIGIN
Set-Cookie: 
Connection: close
Content-Length: 194814

Essa é a resposta para a primeira request que fizemos, além deste conteúdo há também um corpo, porém não o anexarei por ser muito grande.

Vamos analisar os cabeçalhos dessa resposta, na primeira linha há duas coisas: A versão do protocolo HTTP usado e o status da resposta, que podem ser:

1XX: Passa informações: Se a solicitação foi aceita, ou se o processo continua em desenvolvimento.
2XX: A solicitação foi executada com sucesso.
3XX: Indica que há a necessidade de redirecionamento para que a solicitação possa ser concluída.
4XX: Mostra que houve um erro na solicitação por parte do cliente.
5XX: Indica que o servidor não pôde responder a solicitação.

As seguintes linhas mostram cabeçalhos comuns das respostas, são eles:

Date: Data em que a resposta foi originada.
Expires: Indica quando o conteúdo deve ser considerado desatualizado, neste caso o valor -1 significa que o conteúdo expira imediatamente após ser enviado.
Cache-Control: Define políticas de cache.
Etag: Identifica uma versão específica de algum recurso. Permite assim que o servidor não envie a resposta completa, proporcionando uma maior velocidade.
Server: Define informações acerca do servidor.
Set-Cookie: Usado para o servidor enviar cookies para o cliente.
X-Frame-Options: Indica se o navegador deve ou não renderizar uma página em ```<iframe>```.

HTTP vs. HTTPS:

A diferença entre o Hypertext Transfer Protocol e o Hyper Text Transfer Protocol Secure, como o próprio nome nos induz, está na questão da segurança. O segundo é uma junção do protocolo HTTP e do protocolo SSL/TLS. O SSL/TLS permite que dados sejam transmitidos por meio de uma conexão criptografada e que o servidor e o cliente sejam autênticos. O HTTPS se faz necessário principalmente porque as conexões Wi-fi estão suscetíveis a ataques Man-in-the-Middle, no qual um atacante engana o servidor e o cliente para que as requisições e respostas passem por ele, vide a imagem: