La única forma segura de hacerlo
Todas las otras respuestas en esta página tienen implicaciones de seguridad que debe tener en cuenta.
El único método seguro garantizado para recuperar el dominio actual
es 𝓼𝓽𝓸𝓻𝓮 𝓲𝓽 𝓲𝓷 𝓪 𝓼𝓮𝓬𝓾𝓻𝓮 𝓵𝓸𝓬𝓪𝓽𝓲𝓸𝓷 𝔂𝓸𝓾𝓻𝓼𝓮𝓵𝓯.
La mayoría de los marcos se encargan de almacenar el dominio por usted, por lo que deberá consultar la documentación de su marco particular. Si no está utilizando un marco, considere almacenar el dominio en uno de los siguientes lugares:
+ ------------------------------------------------- --- + ----------------------------------- +
| Métodos seguros de almacenamiento del dominio | Usado por |
+ ------------------------------------------------- --- + ----------------------------------- +
| Un archivo de configuración | Joomla, Drupal / Symfony |
El | La base de datos | WordPress |
El | Una variable ambiental | Laravel |
El | Un registro de servicio | Kubernetes DNS |
+ ------------------------------------------------- --- + ----------------------------------- +
Puedes usar lo siguiente ... pero son inseguros
Los hackers pueden hacer que estas variables generen el dominio que deseen. Esto puede provocar envenenamiento de caché y ataques de phishing apenas perceptibles.
$_SERVER['HTTP_HOST']
Esto obtiene el dominio de los encabezados de solicitud que están abiertos a la manipulación por parte de piratas informáticos . Lo mismo con:
$_SERVER['SERVER_NAME']
Esto puede mejorarse si la configuración de Apache usecanonicalname está desactivada; en cuyo caso $_SERVER['SERVER_NAME']ya no se permitirá que se rellenen con valores arbitrarios y será seguro. Sin embargo, esto no es predeterminado y no es tan común en una configuración.
En sistemas populares
A continuación se muestra cómo puede obtener el dominio actual en los siguientes marcos / sistemas:
WordPress
$urlparts = parse_url(home_url());
$domain = $urlparts['host'];
Si está construyendo una URL en WordPress, simplemente use home_url o site_url , o cualquiera de las otras funciones de URL .
Laravel
request()->getHost()
La request()->getHostfunción se hereda de Symfony y ha sido segura desde que se reparó el CVE-2013-4752 2013 .
Drupal
El instalador aún no se encarga de hacer esto seguro ( problema # 2404259 ). Pero en Drupal 8 hay documentación que puede seguir en la Configuración de host de confianza para asegurar su instalación de Drupal, después de lo cual se puede usar lo siguiente:
\Drupal::request()->getHost();
Otros marcos
Siéntase libre de editar esta respuesta para incluir cómo obtener el dominio actual en su marco favorito. Al hacerlo, incluya un enlace al código fuente relevante o cualquier otra cosa que me ayude a verificar que el marco está haciendo las cosas de forma segura.
Apéndice
Ejemplos de explotación:
El envenenamiento de la memoria caché puede ocurrir si una botnet solicita continuamente una página con el encabezado de hosts incorrecto. El HTML resultante incluirá enlaces al sitio web de los atacantes donde pueden phishing a sus usuarios. Al principio, los enlaces maliciosos solo se enviarán de vuelta al hacker, pero si el hacker hace suficientes solicitudes, la versión maliciosa de la página terminará en su caché, donde se distribuirá a otros usuarios.
Un ataque de phishing puede ocurrir si almacena enlaces en la base de datos en función del encabezado de los hosts. Por ejemplo, supongamos que almacena la URL absoluta en los perfiles de un usuario en un foro. Al usar el encabezado incorrecto, un hacker podría hacer que se envíe un sitio de phishing a cualquiera que haga clic en el enlace de su perfil.
La intoxicación por restablecimiento de contraseña puede ocurrir si un pirata informático utiliza un encabezado de host malicioso al completar el formulario de restablecimiento de contraseña para un usuario diferente. Ese usuario recibirá un correo electrónico que contiene un enlace de restablecimiento de contraseña que conduce a un sitio de phishing.
Aquí hay algunos ejemplos más maliciosos
Advertencias y notas adicionales:
- Cuando usecanonicalname está desactivado,
$_SERVER['SERVER_NAME']se rellena con el mismo encabezado $_SERVER['HTTP_HOST']que habría utilizado de todos modos (más el puerto). Esta es la configuración predeterminada de Apache. Si usted o Devops activan esto, entonces está bien, es decir, pero ¿realmente desea confiar en un equipo separado, o en usted mismo dentro de tres años, para mantener lo que parece ser una configuración menor en un -¿valor por defecto? Aunque esto hace que las cosas sean seguras, advertiría que no confíe en esta configuración.
- Redhat, sin embargo, activa usecanonical por defecto [ fuente ].
- Si se usa serverAlias en la entrada de hosts virtuales y se solicita el dominio con alias,
$_SERVER['SERVER_NAME']no devolverá el dominio actual, pero devolverá el valor de la directiva serverName.
- Si serverName no se puede resolver, el comando hostname del sistema operativo se usa en su lugar [fuente] .
- Si se omite el encabezado del host, el servidor se comportará como si usecanonical estuviera en [fuente] .
- Por último, intenté explotar esto en mi servidor local y no pude falsificar el encabezado de los hosts. No estoy seguro de si hubo una actualización de Apache que solucionó esto, o si simplemente estaba haciendo algo mal. En cualquier caso, este encabezado aún sería explotable en entornos donde no se utilizan hosts virtuales.
Little Rant:
¡Esta pregunta recibió cientos de miles de visitas sin una sola mención de los problemas de seguridad en cuestión! No debería ser así, pero solo porque una respuesta de desbordamiento de pila sea popular, eso no significa que sea segura.