Información sobre la petición web en PHP con HttpRequest
Cada vez que el servidor web recibe una petición de visualización de página hay mucha información de contexto que podemos utilizar en nuestra aplicación PHP. Hay información referente al cliente, como su dirección IP o los encodings o idiomas soportados por el navegador, información referente a la propia petición, como la URL, parámetros GET y POST o cookies, e información referente al propio servidor, como ubicación del script que recibe la petición en el servidor, ruta donde está instalada la aplicación, etc…
Toda esta información es de extrema utilidad para hacer nuestras aplicaciones y normalmente está diseminada por diferentes matrices y funciones. Hace ya algún tiempo preparé una clase de nombre HttpRequest, que permite reunir toda esta información en una única clase y que de paso la complementa con alguna otra funcionalidad. A la gente familiarizada con .NET, quizás le recuerde al interfaz de la clase que lleva el mismo nombre, ya que la idea está sacada parcialmente de ella.
Antes de explicar los atributos que hacen disponible toda esta información, hay que indicar dos características importantes que aporta esta clase y que no están contempladas de forma directa en PHP.
- Dirección IP del usuario: la dirección ip que indica la clase es la real del usuario, aunque éste acceda a través de algún proxye. La función que se utiliza para ello es la comentada en el post
obtención de la ip real de una visita web
. - Información GET, POST y cookies: un problema frecuente en la portabilidad de las aplicaciones PHP es la utilización de las magic_quotes. Independientemente de si están activadas o no en el servidor, esta clase permite acceder al contenido de las matrices _GET, _POST y _COOKIE limpio de slashes. Para ello copia y limpia el contenido de estas matrices en atributos internos de la clase, por lo que aún seguiremos teniendo el valor original en ellas. Si lo que queremos es sustituirlas por sus contenidos «limpios», en el ejemplo 2 que viene con el descargable se puede ver cómo hacerlo.
Tras estas dos puntualizaciones, vamos a ver el conjunto de atributos ofrecidos por la clase:
- acceptTypes: matriz con los tipos de documentos aceptados por el navegador, en orden descendente de prioridad.
- acceptLanguages: matriz con los lenguajes aceptados por el navegador, en orden descendente de prioridad.
- acceptCharsets: matriz con los juegos de caracteres aceptados por el navegador, en orden descendente de prioridad.
- browser: cadena de texto con la firma enviada por el navegador indicando su modelo, versión…
- httpMethod: método de la petición, normalmente GET o POST
- isAuthenticated: booleano que indica si el usuario ha realizado algún tipo de autenticación contra el servidor
- authenticationUser: nombre de usuario indicado por el usuario. En caso de que isAuthenticated sea true, indicará que el usuario se ha autenticado con ese login, si isAuthenticated es false la autenticación deberíamos realizarla nosotros, por lo que este campo tenga valor no es suficiente para saber si está realmente autenticado en este caso.
- authenticationPass: contraseña proporcionada por el usuario
- isSecureConnection: indica si se está utilizando SSL en la conexión
- applicationPath: ruta absoluta donde está ubicado el web (DOCUMENT_ROOT)
- absoluteFilePath: ruta completa del script que se ha solicitado (PATH_TRANSLATED)
- filePath: path del script solicitado a partir de la ruta del servidor web (PHP_SELF)
- file: nombre del script solicitado
- rawUrl: solicitud URL original (REQUEST_URI)
- queryString: variables _GET. Si magic_quotes está activo se les elimina los slashes.
- form: variables _POST. Si magic_quotes está activo se les elimina los slashes.
- cookies: variables _COOKIE. Si magic_quotes está activo se les elimina los slashes.
- serverVariables: matriz de variables del servidor
- urlReferrer: solicitud anterior
- hostAddress: dirección IP del servidor
- hostName: nombre del servidor
- remoteAddr: ip real del cliente
- datetime: fecha y hora de la petición
- date: fecha de la petición
- time: hora de la petición
En el archivo de descarga se encuentra disponible la clase así como dos ejemplos básicos de utilización. El primero únicamente crea una instancia de la clase y muestra el contenido de todos los atributos, y el segundo ejemplo utiliza la clase para sobreescribir la matrices _GET, _POST y _COOKIE y disponer así de la información sin problemas con los magic_quotes.
Descargar el archivo: HttpRequest.tgz
Me parece un artículo interresante y muy útil, pero cuando lo ejecute en mi equipo me muestra toda la información menos la de la autenticación con el servidor.
[isAuthenticated],[authenticationUser],[authenticationPass],[isSecureConnection]
Me gustaría saber por que y como debo hacer para obtener está información.
Hola Gloría. Esos campos están vacíos a no ser que hayas realizado previamente una autenticación con el servidor o que estés usando una conexión https. Para probar el funcionamiento de los tres primeros campos podrías crear un .htaccess que limitase el acceso a una carpeta y crearte dentro un php que pruebe a mostrar dentro sus valores, te aparecerá un 1 en isAuthenticated y el nombre de usuario y el password usado en los otros dos campos.
Hola,
Resulta que necesito realizar un http request a un servidor, con una url como la siguient «http://IP:PUERTO/xbi/eventR?id=1&User=x&servicio=1&subservicio=1.1», el cual, me regresará un EventOk?id=1&Result=123 ó EventError?id=1&Error=456. La clase que comentas,¿me serviría?. ó podrías darme una pista de que clase utilizar?
Hola tengo el mismo problema que Isabel, agradeceria que dierais alguna pista sobre como hacerlo.
En mi caso me han pedido que genere en el body un Ok si todo es correcto o un 404 en caso de error.
En el caso de Ok debo enviar por request el resultado.
Hola, me podrias decir si el http_referer es confiable ??, funciona para IE y para Firefox ??, depende del servidor ?.
Ojala puedas ayudarme, he realizado algunas pruebas y a veces entrega referer y otras no. Estoy confundido.
Gracias, ojala puedas ayudarme.
Atte.
Esteban
Hola Esteban, HTTP_REFERER es una cabecera que envían los navegadores automáticamente al pasar de una página a otra dentro de la misma ventana, tanto firefox como ie. Por otra parte, la configuración habitual de los servidores web es que pasen esta cabecera a las aplicaciones. Por lo tanto deberías tener acceso a ella siempre, salvo que estés abriendo páginas en ventanas nuevas, o utilizando quizás peticiones ajax.
hola
Espero que alguien me pueda ayudar
Lo que necesito en mi sitio es evitar que existan robos de sesion y para esto lo que se dedican a seguridad en la empresa donde trabajo me comentan que debo realizar una validacion de ip
lo que entiendo es que debo obtener la ip con la que se conecta en un principio el cliente (esta ya la tengo gracias a esta pagina) y compararla cada que se haga una peticion, esto se puede con request?? si es asi me gustaria que me dijeran como o si no alguna sugerencia para hacer esto
Muchas gracias
Saludos
Patxi, me podrias comentar brevemente como puedo cargar datos en HttpRequest para asi mandar informacion via POST sin tener un form??
Muchisimas gracias si me podes ayudar!