sintaxis - ¿Por qué tengo que llamar ''exit'' después de la redirección a través del encabezado(''Location..'') en PHP?
sintaxis de header en php (6)
podría el código después de la llamada de la ubicación del encabezado ser ejecutado efectivamente?
Sí, siempre El header
es solo una línea de datos que le pide al navegador que redirija. El resto de la página seguirá siendo servida por PHP y puede ser vista por el cliente simplemente impidiendo que se ejecute el comando del header
.
Eso es bastante fácil de hacer con un cliente de línea de comandos como wget
, por ejemplo, simplemente diciéndole que no siga los redireccionamientos.
En pocas palabras: si no lo previene, PHP enviará todo el cuerpo, incluso después de una llamada de header
. Ese cuerpo está completamente disponible para el destinatario sin ninguna habilidad especial de pirateo.
Usted sabe que si desea redirigir a un usuario en PHP puede 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 una exit;
después de la llamada del header
, para evitar la ejecución de otro código php. Entonces mi pregunta es: ¿podría el código después de la llamada de la ubicación del encabezado ser ejecutado efectivamente? En que casos? ¿Puede un usuario malintencionado ignorar por completo la llamada del header(''Location..'')
? ¿Cómo?
Si redirige pero no die()
/ exit()
el código siempre se ejecuta y se muestra .
Toma el siguiente ejemplo:
admin.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 la ubicación, todos los usuarios obtendrán acceso.
Sin la llamada de salida, el punto / hora exacto en el que terminará el script se reducirá a dos factores:
- Qué tan rápido el navegador del cliente reacciona a la redirección
- Cuánto tiempo demora el resto del script en ejecutarse.
Supongamos que el navegador INMEDIATAMENTE inicia la acción de redireccionamiento en el momento en que ve aparecer el encabezado de la ubicación. Eso significa que cerrará la conexión desde la cual se produce el redireccionamiento, por lo que puede comenzar a conectarse a la nueva ubicación. Esto generalmente significa que el servidor web terminará el script de redireccionamiento. Sin embargo, el tiempo que tarda el encabezado en pasar de server-> client y el proceso de cierre del enlace TCP para pasar de cliente-> servidor es la cantidad de tiempo que su script puede seguir ejecutándose.
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 es el momento de enviarlos (típicamente, cuando PHP necesita comenzar a enviar el cuerpo de la respuesta, que podría ser más tarde de lo que piensas, cuando output_buffering
es ejercitado) .
Entonces, si solo llamas 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 indiques que no debe hacerlo, usando exit
/ die
.
El usuario puede ignorar el encabezado de Location
si lo desea; pero no cambiará nada en el hecho de que el código después de la llamada de header()
podría o no ser ejecutado: esa cuestión es del lado del servidor.
re: ¿podría el código después de la llamada de la ubicación del encabezado ser ejecutado efectivamente?
Sí, si no cierra el script.
re: ¿En qué casos?
En cada caso.
¿Puede un usuario malintencionado ignorar por completo la llamada del encabezado ("Ubicación ...")?
No, se impondrá que el usuario no tenga voz en el asunto.