¿Por qué tengo que llamar a 'salir' después de la redirección a través del encabezado ('Ubicación...') en PHP?
Ya sabes que si quieres redirigir a un usuario en PHP puedes usar la función de encabezado:
header('Location: http://smowhere.com');
También es bien sabido que es una buena práctica poner también un exit;
después de la header
llamada, para evitar la ejecución de otro código php. Entonces mi pregunta es: ¿podría ejecutarse efectivamente el código después de la llamada a la ubicación del encabezado? ¿En qué casos? ¿ Puede un usuario malintencionado ignorar completamente la header('Location..')
llamada? ¿Cómo?
¿Podría ejecutarse efectivamente el código después de la llamada a la ubicación del encabezado?
Sí, siempre. Es header
solo una línea de datos que le pide al navegador que redirija. El resto de la página seguirá siendo servido por PHP y el cliente podrá verla simplemente impidiendo header
que se ejecute el comando.
Esto es bastante fácil de hacer con un cliente de línea de comandos como wget
, por ejemplo, simplemente diciéndole que no siga las redirecciones.
En pocas palabras: si no lo evita, PHP enviará el cuerpo completo incluso después de una header
llamada. Ese cuerpo está totalmente disponible para el destinatario sin ninguna habilidad especial de piratería.
Si redirige pero no lo hace die()
, exit()
el código siempre se ejecuta y se muestra .
Tomemos el siguiente ejemplo:
administrador.php:
if (authenticationFails)
{
// redirect and don't die
}
// show admin stuff
Si no se asegura de finalizar la ejecución después del encabezado de ubicación, todos los usuarios obtendrán acceso.
header()
indica a PHP que se debe enviar un encabezado HTTP... Cuando se envían los encabezados HTTP.
Y esos no se envían inmediatamente cuando escribes la llamada al encabezado(), sino cuando llega el momento de enviarlos (normalmente, cuando PHP necesita comenzar a enviar el cuerpo de la respuesta, lo que puede ser más tarde de lo que piensas, cuando output_buffering
está habilitado ) .
Por lo tanto, si simplemente llama a header()
, no hay absolutamente ninguna garantía de que el código escrito después de esta declaración no se ejecute, a menos que indique que no debe hacerlo mediante el uso de exit
/ die
.
El usuario puede ignorar el Location
encabezado si lo desea; pero no cambiará nada por el hecho de que el código después de la llamada de header()
podría o no ejecutarse: ese asunto es del lado del servidor.
Se ejecutará el código PHP después de un encabezado(). A veces, sin embargo, esto es necesario, como muestra el ejemplo en php.net. Para asegurarse de que no sea así, finalice el flujo del programa por completo.