Sé que la reacción inicial a esta pregunta es "no" y "no se puede hacer" y "no debería necesitarlo, está haciendo algo mal". Lo que estoy tratando de hacer es obtener la dirección IP de la LAN de los usuarios y mostrarla en la página web. ¿Por qué? Porque de eso se trata la página en la que estoy trabajando, que muestra la mayor cantidad de información posible sobre usted, el visitante: http://www.whatsmyip.org/more-info-about-you/
Así que en realidad no estoy HACIENDO nada con la IP, más que mostrársela al usuario con fines informativos. Solía hacer esto usando un pequeño subprograma de Java. Funcionó bastante bien. Pero en estos días, el navegador te hace presionar de acuerdo y confiar tantas veces, para ejecutar incluso el subprograma de Java más pequeño, que prefiero no ejecutar uno en absoluto.
Así que por un tiempo me deshice de esta función, pero me gustaría recuperarla si es posible. Era algo que yo, como consultor informático, usaba de vez en cuando. Es más rápido ir a este sitio web para ver en qué rango de IP se está ejecutando una red, que ir a Preferencias del sistema, Redes y luego cualquier interfaz que esté activa.
Así que me pregunto, con la esperanza, si hay alguna forma de hacerlo solo en javascript. Tal vez algún objeto nuevo al que pueda acceder, similar a la forma en que JavaScript puede preguntarle al navegador dónde está la ubicación geográfica en la tierra. ¿Quizás hay algo similar para la información de redes de clientes? Si no es así, ¿quizás hay alguna otra forma de hacerlo? Las únicas formas en las que puedo pensar son en un applet de Java o un objeto flash. Prefiero no hacer ninguna de esas.
fuente
HTTP_X_FORWARDED_FOR
de esa página, solo digo '.Respuestas:
Resulta que la reciente extensión WebRTC de HTML5 permite a JavaScript consultar la dirección IP del cliente local. Una prueba de concepto está disponible aquí: http://net.ipcalf.com
Esta característica aparentemente es por diseño y no es un error. Sin embargo, dada su naturaleza controvertida, sería cauteloso al confiar en este comportamiento. Sin embargo, creo que se dirige perfecta y adecuadamente a su propósito previsto (revelar al usuario qué está filtrando su navegador).
fuente
Actualizar
Esta solución ya no funcionaría porque los navegadores están arreglando la fuga de webrtc: para obtener más información al respecto, lea esta otra pregunta: RTCIceCandidate ya no devuelve IP
Además de la respuesta de afourney, este código funciona en navegadores compatibles con WebRTC (Chrome y Firefox). Escuché que se está llevando a cabo un movimiento para implementar una función que hace que los sitios soliciten la IP (como en el caso de la ubicación geográfica del usuario o los medios del usuario), aunque aún no se ha implementado en ninguno de esos navegadores.
Aquí hay una versión modificada del código fuente , redujo las líneas, sin hacer ninguna solicitud de aturdimiento ya que solo desea la IP local, no la IP pública:
Estamos creando una conexión de par ficticia para que el par remoto se comunique con nosotros. Generalmente intercambiamos candidatos de hielo entre nosotros y al leer los candidatos de hielo podemos decirle la ip del usuario.
Puede encontrar una demostración en -> Demo
fuente
La API de WebRTC se puede utilizar para recuperar la IP local del cliente.
Sin embargo, es posible que el navegador no lo admita o que el cliente lo haya desactivado por razones de seguridad. En cualquier caso, no se debe confiar en este "truco" a largo plazo, ya que es probable que se repare en el futuro (consulte la respuesta de Cullen Fluffy Jennings).
El código ECMAScript 6 a continuación demuestra cómo hacerlo.
Observe que escribo
return resolve(..)
oreturn reject(..)
como atajo. Ambas funciones no devuelven nada.Entonces puede tener algo como esto:
fuente
Limpié la publicación de mido y luego limpié la función que encontraron. Esto volverá
false
o unarray
. Al realizar la prueba, recuerde que debe contraer la matriz en la consola del desarrollador web, de lo contrario, su comportamiento predeterminado no intuitivo puede engañarlo y hacerle pensar que está devolviendo un vacíoarray
.Además, tenga en cuenta que esto no es algo antiguo como CSS,
border-radius
aunque es uno de esos bits que no son compatibles con IE11 y versiones anteriores. Utilice siempre la detección de objetos, pruebe en navegadores razonablemente más antiguos (por ejemplo, Firefox 4, IE9, Opera 12.1) y asegúrese de que sus scripts más nuevos no rompan los bits de código más nuevos. Además, siempre detecte primero el código compatible con los estándares, por lo que si hay algo con, por ejemplo, un prefijo CSS, detecte primero el código estándar sin prefijo y luego retroceda, ya que a largo plazo el soporte eventualmente se estandarizará por el resto de su existencia.fuente
ip
- línea 3 y línea 8.<input name="example1" type="hidden" value="whatever" />
o usar un POST AJAX en tal situación. Recomiendo encarecidamente estudiar miajax()
función aquí: jabcreations.com/docs/javascriptfuente
Chrome 76+
El año pasado utilicé la respuesta de Linblow (2018-Oct-19) para descubrir con éxito mi IP local a través de javascript. Sin embargo, las actualizaciones recientes de Chrome (¿76?) Se han equivocado sobre este método, por lo que ahora devuelve una IP ofuscada, como:
1f4712db-ea17-4bcf-a596-105139dfd8bf.local
Si tiene control total sobre su navegador, puede deshacer este comportamiento desactivándolo en Chrome Flags, escribiendo esto en su barra de direcciones:
y DESHABILITANDO la bandera
Anonymize local IPs exposed by WebRTC
En mi caso, necesito la IP de un script de TamperMonkey para determinar mi ubicación actual y hacer cosas diferentes según mi ubicación. También tengo control total sobre la configuración de mi propio navegador (sin políticas corporativas, etc.). Entonces, para mí, cambiar la
chrome://flags
configuración funciona.Fuentes:
https://groups.google.com/forum/#!topic/discuss-webrtc/6stQXi72BEU
https://codelabs.developers.google.com/codelabs/webrtc-web/index.html
fuente
Puede encontrar más información sobre las limitaciones que probablemente agregarán los navegadores para mitigar esto y qué está haciendo el IETF al respecto, así como por qué es necesario en IETF SPEC sobre el manejo de IP
fuente
Se
RTCPeerConnection
puede utilizar una. En navegadores como Chrome dondegetUserMedia
se requiere un permiso , podemos simplemente detectar los dispositivos de entrada disponibles y solicitarlos.fuente