Eu sei que a reação inicial a esta pergunta é "não" e "não pode ser feito" e "você não deveria precisar, você está fazendo algo errado". O que estou tentando fazer é obter o endereço IP da LAN dos usuários e exibi-lo na página da web. Por quê? Porque é disso que se trata a página em que estou trabalhando, mostrando o máximo de informações possível sobre você, o visitante: http://www.whatsmyip.org/more-info-about-you/
Portanto, não estou FAZENDO nada com o IP, a não ser mostrá-lo ao usuário para fins informativos. Eu costumava fazer isso usando um pequeno miniaplicativo Java. Funcionou muito bem. Mas hoje em dia, o navegador faz com que você concorde e confie tantas vezes, para executar até mesmo o menor miniaplicativo Java, que prefiro não executar nenhum.
Então, por um tempo, acabei de me livrar desse recurso, mas gostaria que ele voltasse, se possível. Era algo que eu, como consultor de informática, usaria de vez em quando. É mais rápido ir a este site para ver em qual intervalo de IP uma rede está sendo executada, do que ir em Preferências do Sistema, Rede e, em seguida, qualquer interface que esteja ativa.
Portanto, espero que haja alguma maneira de fazer isso apenas em javascript? Talvez algum novo objeto que você possa acessar, semelhante ao modo como o javascript pode perguntar ao navegador onde está a localização geográfica na Terra. Talvez haja algo semelhante para informações de rede do cliente? Se não, talvez haja alguma outra maneira inteiramente de fazer isso? As únicas maneiras que consigo pensar são em um miniaplicativo java ou um objeto flash. Prefiro não fazer nada disso.
fonte
HTTP_X_FORWARDED_FOR
nessa página, basta dizer.Respostas:
Acontece que a recente extensão WebRTC do HTML5 permite que o javascript consulte o endereço IP do cliente local. Uma prova de conceito está disponível aqui: http://net.ipcalf.com
Esse recurso é aparentemente por design e não é um bug. No entanto, devido à sua natureza controversa, eu seria cauteloso ao confiar nesse comportamento. No entanto, acho que ele atende de forma perfeita e apropriada ao objetivo pretendido (revelar ao usuário o que o navegador está vazando).
fonte
Atualizar
Esta solução não funcionaria mais porque os navegadores estão corrigindo o vazamento do webrtc: para mais informações sobre isso, leia esta outra pergunta: RTCIceCandidate não retorna mais o IP
Além da resposta de uma revista, este código funciona em navegadores que suportam WebRTC (Chrome e Firefox). Ouvi dizer que há um movimento em andamento para implementar um recurso que faz os sites solicitarem o IP (como no caso de geo-localização ou mídia do usuário), embora ainda não tenha sido implementado em nenhum desses navegadores.
Aqui está uma versão modificada do código-fonte , reduziu as linhas, não fazendo nenhuma solicitação de atordoamento, pois você deseja apenas o IP local, não o IP público:
Estamos criando uma conexão de par fictícia para o par remoto entrar em contato conosco. Geralmente trocamos candidatos de gelo uns com os outros e, lendo os candidatos de gelo, podemos dizer o ip do usuário.
Você pode encontrar uma demonstração em -> Demonstração
fonte
A API WebRTC pode ser usada para recuperar o IP local do cliente.
No entanto, o navegador pode não suportá-lo ou o cliente pode tê-lo desativado por motivos de segurança. Em qualquer caso, não se deve confiar neste "hack" a longo prazo, pois é provável que seja corrigido no futuro (veja a resposta de Cullen Fluffy Jennings).
O código ECMAScript 6 abaixo demonstra como fazer isso.
Observe que escrevo
return resolve(..)
oureturn reject(..)
como um atalho. Ambas as funções não retornam nada.Então você pode ter algo assim:
fonte
Limpei a postagem do mido e depois limpei a função que eles encontraram. Isso irá retornar
false
ou umarray
. Ao testar, lembre-se de que você precisa recolher o array no console do desenvolvedor da web, caso contrário, seu comportamento padrão não intuitivo pode enganá-lo ao pensar que ele está retornando um vazioarray
.Além disso, lembre-se, pessoal, de que isso não é algo novo como o CSS,
border-radius
embora seja um daqueles bits que não é totalmente suportado pelo IE11 e anteriores. Sempre use a detecção de objetos, teste em navegadores razoavelmente mais antigos (por exemplo, Firefox 4, IE9, Opera 12.1) e certifique-se de que seus scripts mais recentes não estão quebrando seus bits de código mais recentes. Além disso, sempre detecte o código compatível com os padrões primeiro, portanto, se houver algo com, digamos, um prefixo CSS, detecte o código padrão não prefixado primeiro e, em seguida, retroceda, pois a longo prazo o suporte será padronizado para o resto de sua existência.fonte
ip
- linha 3 e linha 8.<input name="example1" type="hidden" value="whatever" />
ou usar um AJAX POST em tal situação. Recomendo enfaticamente estudar minhaajax()
função aqui: jabcreations.com/docs/javascriptfonte
Chrome 76+
No ano passado, usei a resposta do Linblow (19 de outubro de 2018) para descobrir com sucesso meu IP local via javascript. No entanto, as atualizações recentes do Chrome (76?) Conquistaram esse método para que agora ele retorne um IP ofuscado, como:
1f4712db-ea17-4bcf-a596-105139dfd8bf.local
Se você tiver controle total sobre seu navegador, poderá desfazer esse comportamento desativando-o nos sinalizadores do Chrome, digitando o seguinte na barra de endereço:
e DESATIVANDO a bandeira
Anonymize local IPs exposed by WebRTC
No meu caso, exijo o IP de um script TamperMonkey para determinar minha localização atual e fazer coisas diferentes com base na minha localização. Também tenho controle total sobre as configurações do meu próprio navegador (sem políticas corporativas, etc.). Então, para mim, mudar a
chrome://flags
configuração resolve.Fontes:
https://groups.google.com/forum/#!topic/discuss-webrtc/6stQXi72BEU
https://codelabs.developers.google.com/codelabs/webrtc-web/index.html
fonte
Você pode encontrar mais informações sobre quais limitações os navegadores provavelmente irão adicionar para mitigar isso e o que a IETF está fazendo sobre isso, bem como por que isso é necessário no IETF SPEC no tratamento de IP
fonte
Um
RTCPeerConnection
pode ser usado. Em navegadores como o Chrome, onde umagetUserMedia
permissão é necessária , podemos apenas detectar os dispositivos de entrada disponíveis e solicitá-los.fonte