2010-04-30 6 views
50

Usted sabe que si desea redirigir un usuario en PHP se puede utilizar la función de cabecera:¿Por qué tengo que llamar a 'exit' después de la redirección a través del encabezado ('Location ..') en PHP?

header('Location: http://smowhere.com'); 

También es bien sabido que es una buena práctica para poner también un exit; después de la llamada header, a prevenir 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 header('Location..')? ¿Cómo?

Respuesta

55

¿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 pidiendo el navegador para redirigir. El resto de la página seguirá siendo servido por PHP por y puede ser examinado por el cliente simplemente impidiendo la ejecución del comando 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 header. Ese cuerpo está completamente disponible para el destinatario sin ninguna habilidad especial de pirateo.

+0

La mejor manera de probar y ver esto en acción es hacer redirecciones de encabezado, y luego observar que si se comenta el dado, pasa al segundo, con él allí, solo ejecuta el primero. Pero con esto puedes ejecutar CURL u otros comandos después de la redirección. Lo cual es genial en muchas situaciones. EJEMPLO EN VIVO: https://codenvy.com/factory?id=fkugtmevk9qfl24d – Ezos

8

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 escribe la llamada al encabezado(), pero cuando es el momento de enviarlos (típicamente, cuando PHP necesita comenzar a enviar el cuerpo de la respuesta, que podría ser posterior a usted piense, cuando se activa output_buffering).

Por lo tanto, si lo que llama header(), no hay garantía de absolutamente ne que el código escrito después de esta declaración no se ejecuta - a menos que indique que no debe, mediante el uso de exit/die.

El usuario puede ignorar el encabezado Location si así 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.

25

Si redirige pero no lo hace die()/exit()el código siempre se ejecuta y se muestra.

Tome el ejemplo siguiente:

admin.php:

if (authenticationFails) 
{ 
    // redirect and don't die 
} 

// show admin stuff 

Si no nos aseguramos de poner fin a la ejecución después de que el encabezado de ubicación cada usuario tendrá acceso.

1

Código PHP después de ejecutar un encabezado(). A veces, eso es obligatorio, como muestra el example en php.net. Para asegurarse de que no sea así, finaliza el flujo del programa por completo.

1

re: ¿podría ejecutarse efectivamente el código después de la llamada de la ubicación del encabezado?

Sí, si no cierra el script.

re: ¿En qué casos?

En todos los casos.

¿Puede un usuario malintencionado ignorar por completo la llamada del encabezado ('Ubicación ...')?

No, se supondrá que el usuario no tiene nada que decir al respecto.

+0

Su último punto depende del navegador. –

+0

No, no, @CarsonMyers, el código PHP después de que siempre se ejecutará. –

1

Sin la llamada de salida, el punto/hora exacta a la que dará por terminado su guión se reducirá a dos factores:

  1. La rapidez con el navegador del cliente reacciona a la redirección
  2. ¿Cuánto tiempo se tarda el resto de tu script para ejecutar.

Digamos que el navegador INMEDIATAMENTE inicia la acción de redirección en el momento en que ve 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.

+0

Consulte http://stackoverflow.com/questions/14847010/will-php-script-be-executed-after-header-redirect para obtener otras respuestas – user1032531

Cuestiones relacionadas