Cómo obtener el origen de la solicitud http en php

6 minutos de lectura

Quiero crear una API y, para autenticar a los consumidores de la API, proporcionaré una CLAVE de API, un ID de aplicación y un Secreto de aplicación. El problema es que quiero saber de dónde viene la Solicitud http, para poder saber si el Host que está realizando la solicitud es el Host registrado. Por ejemplo: www.someone.com tiene una ID de aplicación: 0001, secreto de aplicación: 1200 y clave de API: 458. Si estas credenciales se usan para hacer una solicitud, quiero saber si el solicitante es realmente www.alguien.com

  • Para el origen usa esto header("Access-Control-Allow-Origin: " . $_SERVER['HTTP_ORIGIN'] . ""); y luego verifique las credenciales de la variable GET o POST

    – hex494D49

    27 de agosto de 2014 a las 6:15

  • Usar el origen como medida de seguridad es más que inútil. Este encabezado puede fácilmente ser falso. En su lugar, es posible que desee trabajar con una devolución de llamada para pasar algún “token de solicitud” (piense en cómo funciona el flujo de autenticación).

    – Pee Haa

    27 de agosto de 2014 a las 7:57


  • Usar HTTP_ORIGIN o HTTP_REFERER sin verificarlos es “en esencia” lo mismo que hacer “*”, lo que puede abrir brechas de seguridad sutiles, por lo que no se recomienda, consulte stackoverflow.com/questions/12001269/…

    – rogerdpack

    14/04/2017 a las 19:03

  • Una respuesta a la pregunta real “Cómo obtener el origen de la solicitud http” se puede encontrar aquí: stackoverflow.com/questions/41326257/…

    – Martín Schneider

    3 de julio de 2017 a las 17:24


Avatar de usuario de hex494D49
maleficio494D49

Generalmente, este encabezado debería hacer el trabajo. Tener el nombre de dominio en este encabezado

header("Access-Control-Allow-Origin: " . $_SERVER['HTTP_ORIGIN'] . "");
// use domain name instead of $_SERVER['HTTP_ORIGIN'] above

pero si desea buscar más información, use algo como el siguiente fragmento

$allowed = array('domain1', 'domain2', 'domain3'); 

if(isset($_SERVER['HTTP_ORIGIN']) && in_array($_SERVER['HTTP_ORIGIN'], $allowed)){
    // SELECT credentials for this user account from database
    if(isset($_GET['api_key'], $_GET['app_secret'])
        && $_GET['api_key'] == 'api_key_from_db' 
        && $_GET['app_secret'] == 'app_secret_from_db'
    ){
        // all fine
    }else{
        // not allowed
    }
}else{
    // not allowed
}

Si los usuarios tienen que pasar más datos a su servicio, utilice POST en vez de GET

  • Si el $_SERVIDOR[‘REMOTE_ADDR’] la variable me devuelve Client_IP y no la dirección del sitio web. ¿Cómo se supone que debo autenticar el sitio web?

    – m_junior

    27 de agosto de 2014 a las 14:12

  • @m_junior $_SERVER['REMOTE_ADDR'] devuelve la dirección IP del servidor en el que se ejecuta el script actual.

    – hex494D49

    27 de agosto de 2014 a las 14:18


  • @m_junior El $allowed la matriz desde arriba puede verse incluso de esta manera $allowed = array('domain1' => '1.2.3.4', 'domain2' => '5.6.7.8', 'domain3' => '2.4.6.8'); y luego puedes usar gethostbyname('domain') y compare la IP devuelta del host con la IP en su matriz.

    – hex494D49

    27 de agosto de 2014 a las 14:42


  • @ hex494D49 ¿por qué rechazaste mi edición? Su código tiene 4 errores de sintaxis y no tiene un formato óptimo para SO.

    – Martín Schneider

    3 de julio de 2017 a las 21:37


  • Ya no estoy seguro de lo que sucedió cuando comenté hace como un año. Importante es la matriz $allowed y eso lo convierte en una buena respuesta.

    – Daniel W.

    4 de julio de 2017 a las 7:36

Laravel 5: en el controlador del método de solicitud:

$origin = request()->headers->get('origin');

  • para obtener todos los encabezados: request()->headers->all();

    – Kamil Kielczewski

    11 de abril de 2019 a las 13:41


  • ¿No puede una persona no autorizada simplemente cambiar los encabezados de solicitud en su cliente para enviar un dominio de un dominio autorizado y de esta manera eludir el control?

    – alev

    4 de febrero de 2020 a las 10:49


  • Acabo de encontrar la respuesta en un hilo diferente: stackoverflow.com/a/21058346/4688612

    – alev

    4 de febrero de 2020 a las 10:53

  • origin no se envía con GET

    – mangusta

    27 de mayo de 2020 a las 1:45

  • Agregar navegador @mangusta origin encabezado para solicitudes de CORS – más aquí – si no envía una solicitud de CORS, entonces el navegador no agrega este encabezado y probablemente php no lo configure también (o probablemente establezca algún valor predeterminado, pero no verifico esto en el lado de php).

    – Kamil Kielczewski

    27 de mayo de 2020 a las 10:10


Avatar de usuario de Sunit
sol

Usar $_SERVER['HTTP_REFERER']. Es la dirección de la página (si la hay) que refirió al agente de usuario a la página actual. Esto lo establece el agente de usuario. No todos los agentes de usuario configurarán esto, y algunos brindan la capacidad de modificar HTTP_REFERER como característica.

Para más restricciones, puede realizar lo siguiente. example.com debe cambiarse a su dominio.

IIS establecido a continuación en la configuración web:

add name="Access-Control-Allow-Origin" value="http://www.example.com"

Apache establecido a continuación en httpd.conf/apache.conf

Header add Access-Control-Allow-Origin "http://www.example.com"

  • El referente y el origen son dos cosas diferentes.

    – Daniel W.

    16 de junio de 2016 a las 14:15

  • No todos los agentes de usuario configurarán esto, y algunos brindan la capacidad de modificar HTTP_REFERER como una característica. En resumen, realmente no se puede confiar.

    – LeonanCarvalho

    03/02/2017 a las 11:00

  • Puede encontrar una mejor respuesta a esa pregunta aquí: stackoverflow.com/questions/41326257/…

    – Martín Schneider

    3 de julio de 2017 a las 17:23

  • Como mencionó @DanFromGermany, ORIGIN y REFERER son dos cosas diferentes: HTTP_ORIGIN es mejor en este caso que HTTP_REFERER; si HTTP_ORIGIN falta, es posible que desee volver a utilizar HTTP_REFERERpero desaconsejaría esto por seguridad (es más fácil cambiar la referencia que el origen, ya que el origen aparece como un encabezado “prohibido” y los navegadores debería evitar que se produzcan cambios en el origen).

    – SteJ

    23 de abril de 2018 a las 9:59

Usando un var_dump puedes ver todo lo que request tiene que ofrecer.

var_dump($_REQUEST);

hacer un var_dump sobre el server mundial también. Contiene mucha información útil.

var_dump($_SERVER);

Técnicamente tampoco origin ni referer son encabezados HTTP requeridos, todas estas respuestas se basan en encabezados de navegador específicos enviados, y basar su sistema en diferentes comportamientos de los clientes es una mala idea.

La respuesta correcta es que no puede obtener de manera confiable el origen del cliente en cada solicitud porque no se requiere como parte de la especificación HTTP.

Avatar de usuario de Paolo Gibellini
paolo gibellini

Creo que lo que quiere decir es que desea acceder al encabezado “Origen” en los encabezados de solicitud (en lugar de configurarlo en los encabezados de respuesta).

Para ello, la forma más sencilla es acceder a la función integrada obtener todos los encabezados () función – que es un alias para apache_request_headers() – NB esto supone que está utilizando php como módulo.

Esto devuelve una matriz, por lo que el encabezado Origen debería estar disponible así:

$request_headers = getallheaders();
$origin = $request_headers['Origin'];

Si está utilizando php a través de algo como fastcgi, entonces creo que estaría disponible en el entorno, generalmente en mayúsculas y con el prefijo “HTTP_”, por lo que debería ser $_SERVER['HTTP_ORIGIN'].

Espero que ayude a cualquiera que busque esto 🙂

Avatar de usuario de Ar0010r
Ar0010r

en laravel 7 esto funcionó para mí

request()->headers->get(‘referer’);

  • primero verifíquelo con request()->headers; luego puede agregar “->get(‘ ..parámetro necesario… ‘);”

    – Vit

    3 de abril de 2020 a las 12:48

¿Ha sido útil esta solución?