54 votes

Pourquoi dois-je appeler 'exit' après une redirection par header('Location..') en PHP ?

Vous savez que si vous voulez rediriger un utilisateur en PHP, vous pouvez utiliser la fonction header :

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

Il est également bien connu que c'est une bonne pratique de mettre aussi une exit; après le header pour empêcher l'exécution d'un autre code php. Ma question est donc la suivante : le code après l'appel à l'emplacement de l'en-tête pourrait-il être effectivement exécuté ? Dans quels cas ? Un utilisateur malveillant peut-il être en mesure d'ignorer complètement l'appel de l'en-tête header('Location..') appel ? Comment ?

58voto

Pekka 웃 Points 249607

le code après l'appel à l'emplacement de l'en-tête pourrait-il être effectivement exécuté ?

Oui, toujours. Le site header est seulement une ligne de données en demandant à le navigateur à rediriger. Le reste de la page seront toujours servis par PHP et peuvent être consultés par le client en empêchant simplement l'accès à l'application header de l'exécution de la commande.

C'est assez facile à faire avec un client en ligne de commande comme wget par exemple, en lui demandant simplement de ne pas suivre les redirections.

En résumé : Si vous ne l'empêchez pas, PHP enverra tout le corps même après un header appel. Ce corps est entièrement disponible pour le destinataire sans aucune compétence particulière en matière de piratage.

25voto

Alix Axel Points 63455

Si vous redirigez mais que vous ne die() / exit() le code est toujours exécuté et affiché .

Prenons l'exemple suivant :

admin.php :

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

// show admin stuff

Si vous ne le faites pas, assurez-vous de terminer l'exécution après l'en-tête de localisation. cada l'utilisateur aura accès.

8voto

Pascal MARTIN Points 195780

header() indique à PHP qu'un en-tête HTTP doit être envoyé... Lorsque les en-têtes HTTP sont envoyés.

Et ils ne sont pas envoyés immédiatement lorsque vous écrivez l'appel à header(), mais au moment de les envoyer. _(typiquement, lorsque PHP a besoin de commencer à envoyer le corps de la réponse - ce qui peut être plus tard que vous ne le pensez, lorsque l'utilisateur a besoin d'une réponse. output_buffering est enabed)_ .

Donc, si vous appelez juste header() il n'y a absolument aucune garantie que le code écrit après cette déclaration ne soit pas exécuté -- à moins que vous n'indiquiez qu'il ne doit pas l'être, en utilisant la fonction exit / die .

L'utilisateur peut ignorer le Location s'il le souhaite ; mais cela ne changera rien au fait que le code après l'appel de header() peut être exécuté ou non : cette question est du côté du serveur.

1voto

Alister Bulman Points 12913

Le code PHP après un header() sera exécuté. Parfois, c'est pourtant nécessaire, car le ejemplo sur php.net montre. Pour être sûr que ce n'est pas le cas, il faut arrêter complètement le déroulement du programme.

1voto

Marc B Points 195501

Sans l'appel de sortie, le moment exact auquel votre script se terminera dépendra de deux facteurs :

  1. la vitesse à laquelle le navigateur du client réagit à la redirection.
  2. Le temps que prend le reste de votre script pour s'exécuter.

Disons que le navigateur lance IMMÉDIATEMENT l'action de redirection dès qu'il voit l'en-tête Location arriver. Cela signifie qu'il va fermer la connexion d'où provient la redirection, afin de pouvoir commencer à se connecter au nouvel emplacement. Cela signifie généralement que le serveur web terminera le script de redirection. Le temps nécessaire pour que l'en-tête aille du serveur->client et que le processus de fermeture de la liaison TCP aille du client->serveur est le temps pendant lequel votre script peut continuer à fonctionner.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X