Resumo
- Ao obter o "Real Client IP" do cabeçalho X-Forwarded-For, use o IP mais à direita
- O IP mais à esquerda no cabeçalho XFF costuma ser considerado o "mais próximo do cliente", o "quase real", mas pode ser falsificado (
spoofable). Não o use para nada relacionado à segurança
- Ao selecionar o IP XFF mais à direita, deve-se usar a última instância desse cabeçalho
- Valores de "True Client IP" definidos pelo proxy reverso (
X-Real-IP, True-Client-IP etc.) também podem ser bons, mas
- isso depende de como o proxy reverso define esse valor
- o próprio proxy reverso pode já ter sido enganado (
spoofed)
- depende de como a configuração do proxy reverso foi feita
- Cabeçalhos que o proxy reverso não configurou explicitamente não são confiáveis
- Por exemplo, se não estiver atrás do Nginx, ou se ele não estiver configurado para sempre definir o cabeçalho, não se deve ler o cabeçalho
X-Real-IP. Você pode acabar lendo um valor falsificado
- Muitas implementações de rate limiter usam IPs falsificáveis e estão vulneráveis a evasão de limitação de taxa e ataques de esgotamento de memória
- Se você estiver usando algo relacionado a "real client ip" no código ou na infraestrutura, consulte os detalhes técnicos a seguir
Detalhes (como é longo, só vou traduzir os títulos)
- Introdução: descobrir o "real client ip" hoje em dia é terrível
- Armadilhas
- Cabeçalhos não são confiáveis
- Vários cabeçalhos
- IP privado
- Divisão de IP
- Dados não criptografados nunca são confiáveis
- Coisas como
X-Client-IP, True-Client-IP podem ser falsificadas
- Entendendo
X-Forwarded-For
- Como evitar armadilhas
- Algoritmo para obter o IP real
- Obter todos os valores de IP
- Escolher qual usar dependendo da segurança
- O mais à esquerda, o mais à direita
- Exemplos práticos
- Cloudflare, Nginx, Apache
- Akamai
- Fastly
- Azure
- go-chi/chi
- didip/tollbooth
- ulule/limiter
- sethvargo/go-limiter
- Let's Encrypt
- Express
- Traefik
- phpList
- IIS
- Tor
- Avançado: armadilhas teóricas e métodos de ataque
- RFC 7239: Forwarded HTTP Extension, June 2014
3 comentários
Acho que esta parte está levemente mal traduzida. O original é este.
Por exemplo, se você não estiver atrás do Nginx ou de algo configurado para sempre definir esse cabeçalho, não deve ler o cabeçalho X-Real-IP, porque acabará lendo um valor falsificado.
Ah, vou corrigir isso. Obrigado!
Em geral, usa-se a variável de ambiente TRUSTED_PROXY para ir excluindo, da direita para a esquerda, um a um os proxies "confiáveis" e então utilizar o primeiro IP que aparecer.
Também é comum tratar IPs internos (192.168.0.0/16) e afins como proxies confiáveis.