Os navegadores implementam a política SOP - Same Origin Policy. Essa política é um recurso de segurança do navegador que previne que um script de uma origem (Ex.: dominio A) acesse recursos de outra origem (Ex.: dominio B). Dessa forma, sites maliciosos não conseguem acessar ou manipular dados de um site legítimo.
Um site ou aplicação não consegue carregar recursos de outro domínio se não tiver o CORS habilitado.
CORS - Cross-Origin Resource Sharing
Quando uma aplicação precisa acessar recursos de outra origem, isto é, de outro domínio, usamos CORS - Cross-Origin Resource Sharing.
O CORS é um mecanismo seguro para que uma aplicação acesse recursos de outra origem, e mantenha esse acesso controlado e aderente a política SOP dos navegadores.
Na imagem abaixo estão listadas as características do CORS.
Origin HeaderÉ um identificador que informa a origem da requisição, e possui a estrutura ilustrada na imagem abaixo:
Cross-Origin
Quando duas urls tem Origins diferentes, ou seja, tem schema, host ou porta diferentes, então isso é chamado de Cross-Origin.
- https://exemplo.com -> https://api.exemplo.com = host diferente
- https://exemplo.com -> http://exemplo.com = schema diferente
- https://exemplo.com:443 -> https://exemplo.com:8443 = porta diferente
CORS Preflight
Uma solicitação CORS preflight é uma requisição HTTP especial que os navegadores enviam automaticamente antes de fazer determinadas solicitações entre origem diferentes.
O método Options é usado para fazer a requisição preflight e o servidor responde com o header CORS e as regras de Cross-Origin.
Exemplo: O navegador faz a seguinte requisição:
OPTIONS /data HTTP/1.1
Host: api.example.com
Origin: https://app.example.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-Custom-Header, Content-Type
Explicação:
OPTIONS -> método usado
Origin -> a origem que fez a requisição
Access-Control-Request-Method -> o método HTTP usado na solicitação
Access-Control-Request-Headers -> o header que vai ser usado na requisição
O servidor responde:
HTTP/1.1 204 No Content
Access-Control-Allow-Origin: https://app.example.com
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: X-Custom-Header, Content-Type
Access-Control-Max-Age: 600
Explicação:
Access-Control-Allow-Origin -> origem permitida
Access-Control-Allow-Methods -> métodos permitidos
Access-Control-Allow-Headers -> qual header pode ser usado
A etapas da solicitação preflight são:
1. Preflight request -> Solicita a permissão para compartilhamento de recurso Cross-Origin -> Método Options
2. Preflight resposta -> Servidor responde com as regras CORS
3. Requisição principal -> A requisição principal é enviada
CORS Header
O header CORS se comunica com o navegador ao definir regras para o carregamento de recurso entre domínios.
Access-Control-Allow-Credentials = informa ao navegador se é permitido incluir cookies, autenticação HTTP ou certificados SSL do lado do cliente em solicitações entre domínios diferentes (origens diferentes). Por padrão, os navegadores bloqueiam credenciais (como cookies ou cabeçalhos de autorização) em solicitações de origem cruzada por motivos de segurança.
Access-Control-Allow-Headers = informa quais cabeçalhos são permitidos na requisição, por exemplo:
- Access-Control-Allow-Headers: Content-Type, X-Auth-Token
- Access-Control-Allow-Headers: Authorization, X-Requested-With
No contexto do CORS, o parâmetro Access-Control-Max-Age define o período de tempo em segundos que o conteúdo da requisição CORS Preflight fica em cache.
Access-Control-Allow-Methods = informa quais são os métodos permitidos na requisição.
Access-Control-Expose-Headers = informa cabeçalhos customizados que serão usados na requisição. Deve ser usado com cuidado pois pode expor informações sensíveis que o servidor não deveria disponibilizar ao cliente (ex.: tokens, IDs internos, etc.).
Access-Control-Request-Headers = é um cabeçalho emitido pelo navegador automaticamente em uma requisição preflight para solicitar ao servidor quais os cabeçalhos personalizados são permitidos.
Access-Control-Request-Methods = é adicionado pelo navegador na requisição preflight para solicitar aos servidor quais são os métodos permitidos.
O uso de headers CORS é uma forma segura que consumir recursos entre origens diferentes. Durante a comunicação, o header Origin vai validar o domínio correto para o uso de recursos.
Estratégias de proteção com CORS
Whitelist Origins = lista com domínios permitidos onde a aplicação pode carregar e manipular conteúdo. Configure Access-Control-Allow-Origin para definir explicitamente os domínos permitidos, e evite usar wildcard (*), pois pode resultar em bypass por um atacante que pode forjar um subdomínio conhecido como amazonaws.com.
A validação das origens deve ser realizada no lado do servidor (Server-Side Code), e não do lado do cliente para evitar manipulação da requisição.
Métodos HTTP = define quais métodos HTTP são permitidos em requisições entre origens diferentes.
Use credenciais corretamente = se o uso de credenciais não for necessário, configure o cabeçalho Access-Control-Allow-Credentials como false para limitar o vazamento ou captura de credenciais por atacantes.
Implemente requisições Preflight = requisições com cabeçalhos customizados devem usar Preflight request para validar as regras do CORS antes da requisição principal.
Access-Control-Expose-Headers = whitelist de cabeçalhos permitidos.
Cookies com SameSite = configure o atributo SameSite no Cookie para controlar o envio de cookies entre domínios (origens) diferentes. Os valores "Strict" ou "Lax" ajudam a prevenir ataques de CSRF e vulnerabilidades associadas a troca de conteúdo entre origens.
Rate Limit de requisições Cross-Origin = implemente limite de requisição entre origens para evitar ataques de negação de serviço. Monitore e defina limites razoáveis com base nos padrões de uso esperados do seu aplicativo.
Teste as regras de CORS = periodicamente ou quando houver mudanças significativas, realize testes nas regras do CORS.
#HACKINGBR
Comentários
Postar um comentário