É seguro confiar em $ _SERVER ['REMOTE_ADDR']?

89

É seguro confiar $_SERVER['REMOTE_ADDR']? Ele pode ser substituído alterando o cabeçalho da solicitação ou algo parecido?

É seguro escrever algo assim?

if ($_SERVER['REMOTE_ADDR'] == '222.222.222.222') { // my ip address
    $grant_all_admin_rights = true;
}
Luz cinza
fonte
3
Somando-se as respostas existentes, sempre será o endereço IP que fez a solicitação ao seu servidor, mas isso não significa que é o endereço IP do computador que iniciou a solicitação. Qualquer número de servidores proxy pode estar entre você e o usuário final, e o mais próximo de você é o endereço IP que você obtém.
Dan Grossman
sim, é seguro porque não pode ser legendado por outros truques ou alguma trapaça. mas certifique-se de adicionar mais verificação para a variável $ grant_all_admin_rights.
Yuda Prawira
Qualquer variável $ _SERVER pode ser falsificada - por exemplo, curl_setopt ($ ch, CURLOPT_HTTPHEADER, array ("REMOTE_ADDR: $ ip", "HTTP_X_FORWARDED_FOR: $ ip")); Portanto, depende inteiramente do contexto: se o invasor estiver esperando uma resposta, ele voltará para $ ip. Se eles não se importarem com a resposta, eles certamente podem falsificar o cabeçalho. Se o seu código após a verificação do cabeçalho disser: "open_the_door_to_badguys ();" você teria um problema.
TMG
3
@TMG Você não pode falsificar a $_SERVER['REMOTE_ADDR']variável definindo um cabeçalho de solicitação HTTP. O PHP automaticamente prefixa todos os cabeçalhos de solicitação HTTP HTTP_ao criar chaves na $_SERVERsuperglobal.
MrWhite

Respostas:

110

Sim, é seguro. É o IP de origem da conexão TCP e não pode ser substituído alterando um cabeçalho HTTP.

Um caso com o qual você pode querer se preocupar é se você está atrás de um proxy reverso, caso em que REMOTE_ADDR será sempre o IP do servidor proxy e o IP do usuário será fornecido em um cabeçalho HTTP (como X-Forwarded-For ) Mas para o caso de uso normal, a leitura de REMOTE_ADDR é adequada.

sagi
fonte
4
E sobre falsificação de endereço IP?
Abdull
1
@Abdull As pessoas que podem fazer isso geralmente são as mesmas que têm acesso físico à sua caixa. então não se preocupe muito com isso.
Behrooz de
5
@Abdull IP spoofing só pode enviar mensagens de uma maneira, você não pode falsificar seu IP e receber uma mensagem em troca.
1
Os roteadores da Internet não estão verificando o IP de origem e de destino para rotear os pacotes? Duvido que um pacote falsificado chegue ao destino nos nós da Internet.
Viktor Joras
57

$_SERVER['REMOTE_ADDR']é o endereço IP em que a conexão TCP entrou. Embora seja tecnicamente possível falsificar endereços IP bidirecionalmente na Internet (anunciando rotas incorretas via BGP), esses ataques provavelmente serão detectados e não estarão disponíveis para o invasor típico - basicamente, seu invasor deve ter controle sobre um ISP ou operadora. Não há ataques de spoofing unidirecional viáveis ​​contra TCP (ainda). Porém, spoofing de IP bidirecional é trivial em uma LAN.

Também esteja ciente de que pode não ser um endereço IPv4, mas sim um endereço IPv6. A sua verificação atual é adequada nesse aspecto, mas se você verificar que 1.2.3.4ocorre apenas em qualquer lugar interno $_SERVER['REMOTE_ADDR'], um invasor pode simplesmente se conectar de 2001:1234:5678::1.2.3.4.

Resumidamente, para qualquer coisa diferente de aplicativos críticos (bancários / militares / danos potenciais> 50.000 €), você pode usar o endereço IP remoto se puder excluir atacantes em sua rede local.

phihag
fonte
4
Você parece muito informado sobre o protocolo da Internet.
Brian Peterson
@phihag, Se $_SERVER['REMOTE_ADDR']é o endereço IP que a conexão TCP veio depende inteiramente do seu SAPI.
Pacerier
está longe de ser inviável para um invasor em uma WLAN WEP / WPA expulsar o cliente real e falsificar aquele endereço IP - tanto o WEP quanto o WPA têm pontos fracos que tornam os you have been kicked off the wlanpacotes de falsificação fáceis de criar com as ferramentas certas. google WPA downgrade test, por exemplo
hanshenrik
O endereço IP é o nível IP, não o nível TCP.
Viktor Joras
3

Conforme mencionado acima, não é absolutamente seguro. Mas isso não significa que você não deve usá-lo. Considere combinar isso com alguns outros métodos de autenticação, por exemplo, verificar os valores COOKIE.

Áudio
fonte
7
Depois de falsificar um endereço IP, alterar a solicitação de http e enviar cookies falsos é moleza ... (ou um pedaço de cookie)
Uri Goren
1
Explique o que você quer dizer com "não absolutamente seguro"
Jake,