2009-06-11 17 views
17

¿Hay alguna manera fácil de identificar el archivo que maneja inicialmente la solicitud, ignorando los argumentos de obtención y el manejo (al menos básico) de las asignaciones como / a /index.php?Cómo identificar la página solicitada en PHP

Idealmente, lo que estoy buscando es algo como $_SERVER['REQUEST_URI'], excepto que devuelve el mismo valor independientemente de los argumentos get y ese valor es el archivo solicitado, no el URI ni el archivo que se está ejecutando ($_SERVER['PHP_SELF']). En otras palabras, un $_SERVER['REQUESTED_FILE'] o algo así. No he visto nada como eso. ¿Existe, o debo escribir algo manualmente?

actualización Estas son algunas URL de ejemplo emparejado con lo que me gustaría que el resultado sea:

example.com/mypage.php  : /mypage.php 
example.com/     : /index.php 
example.com/foo/?hello=world : /foo/index.php 

y estos valores de retorno son verdad incluso en archivos incluidos. Vea mi respuesta a continuación antes de responder, creo que he encontrado lo que estaba buscando.

+0

¿Puede actualizar su pregunta y agregar un ejemplo hipotético de lo que está buscando? No está claro si le interesa la URL que lo solicita (http://example.org) o el archivo que se utiliza para atender la solicitud (/var/www/.../index.php) – Shoan

Respuesta

23

decidí probarlo yo mismo. La variable $_SERVER['SCRIPT_NAME'] sirve la ruta al archivo solicitado, incluso si es un archivo de índice y sin obtener parámetros ni nada. La documentación de PHP indica que contiene la ruta del archivo, pero parece ser relativa a la raíz del documento, al igual que PHP_SELF, pero sin la vulnerabilidad de seguridad.

Aquí está el código que utiliza para probar esto: https://gist.github.com/dimo414/5484870

La salida al solicitar example.com/?foo=bar:

__FILE__:    /var/www/index.php 
PHP_SELF:    /index.php 
SCRIPT_NAME:   /index.php 
REQUEST_URI:   /?foo=bar 
parse_url(REQUEST_URI):/


__FILE__:    /var/www/pathtest.php 
PHP_SELF:    /index.php 
SCRIPT_NAME:   /index.php 
REQUEST_URI:   /?foo=bar 
parse_url(REQUEST_URI):/

Y la salida al solicitar example.com/index.php/<strong>XSS</strong>:

__FILE__:    /var/www/index.php 
PHP_SELF:    /index.php/XSS # note the XSS exploit (this is bold in browser) 
SCRIPT_NAME:   /index.php  # No exploit here 
REQUEST_URI:   /index.php/%3Cstrong%3EXSS%3C/strong%3E 
parse_url(REQUEST_URI): /index.php/%3Cstrong%3EXSS%3C/strong%3E 


__FILE__:    /var/www/pathtest.php 
PHP_SELF:    /index.php/XSS 
SCRIPT_NAME:   /index.php 
REQUEST_URI:   /index.php/%3Cstrong%3EXSS%3C/strong%3E 
parse_url(REQUEST_URI): /index.php/%3Cstrong%3EXSS%3C/strong%3E 

Como se puede ver , $_SERVER['SCRIPT_NAME'] siempre devuelve el archivo que originalmente manejó la solicitud, es decir, el archivo en la URL, con sin ningún riesgo XSS.

+0

. Vale la pena señalar que si utilizas algún tipo de MVC o método de controlador frontal y luego "SCRIPT_NAME" devolverá el script que proporcionó el include, por lo que si todo se ejecuta a través del ejemplo de index.php esto es lo que volverá, en este caso $ _SERVER ['REQUEST_URI'] parece Haz el truco. –

+2

@MatthewRiches tenga en cuenta que 'REQUEST_URI' tiene un propósito diferente de' SCRIPT_NAME'; el primero es el URI que el usuario solicitó, incluidos los parámetros GET, donde 'SCRIPT_NAME' intencionalmente no, ya que es una ruta en el servidor. Si está trabajando en una biblioteca de MVC, debe consultar la documentación de la biblioteca para saber cuál es la mejor manera de identificar el archivo realmente solicitado. – dimo414

-1

Su pregunta muy vieja y no muy clara también. Lo que entendí es que quiere saber qué página está enviando la solicitud GET/POST.Esto se puede implementar por:

$ _SERVER [ 'HTTP_REFERER']

Ahora, para obtener el nombre real de la página, escribir como: = nombre base ($ _ SERVER [ 'HTTP_REFERER']);

Esto resolverá su problema.

+0

No, la pregunta es de ninguna manera preguntar acerca de la referencia HTTP. Eso (cuando se configura) indica en qué página estaba el usuario anteriormente que los refirió a esta página. La pregunta es solicitar el archivo que se solicita actualmente, y la respuesta aceptada demuestra que es '$ _SERVER ['SCRIPT_NAME']'. – dimo414

0

Vaya a obtener el nombre de archivo de la URL solicitada, use el siguiente código.

basename($_SERVER['URL']); 
basename($_SERVER['REQUEST_URI']); 
basename($_SERVER['SCRIPT_NAME']); 
basename($_SERVER['SCRIPT_FILENAME']); 
basename($_SERVER['REQUEST_URI']); 
basename($_SERVER['PATH_TRANSLATED']); 
basename($_SERVER['PHP_SELF']); 

usa cualquiera de ellas en la condición anidada if para que no te pierdas el nombre del archivo de ninguna manera.

+0

Esto no tiene nada que ver con la pregunta. – dimo414

Cuestiones relacionadas