web-dev-qa-db-fra.com

Pourquoi utiliser $ _SERVER ['PHP_SELF'] au lieu de ""

Dans un formulaire sur une page PHP, vous pouvez utiliser:

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" ...>

ou

<form action="#" ...>

ou

<form action="" ...>

dans l'attribut d'action du formulaire. Depuis echo $_SERVER['PHP_SELF'] ne passe pas les variables pour utiliser GET et vous devez utiliser "", pourquoi utiliseriez-vous cela ou "#"?

Je pose la question car il m'a fallu un certain temps pour comprendre que les variables ne sont pas transmises avec $_SERVER['PHP_SELF']. Merci.

41
robk27

L'attribut action sera par défaut l'URL actuelle. C'est la manière la plus fiable et la plus simple de dire "soumettez le formulaire au même endroit d'où il provient".

Il n'y a aucune raison d'utiliser $_SERVER['PHP_SELF'], et # ne soumet pas du tout le formulaire (à moins qu’un gestionnaire d’événements submit soit associé pour gérer la soumission).

61
Niet the Dark Absol

Utiliser une chaîne vide est parfaitement correct et beaucoup plus sûr que de simplement utiliser $_SERVER['PHP_SELF'].

Lorsque vous utilisez $_SERVER['PHP_SELF'] il est très facile d’injecter des données malveillantes en ajoutant simplement /<script>... après le whatever.php partie de l'URL, vous ne devez donc pas utiliser cette méthode et cesser d'utiliser un tutoriel PHP) qui le suggère.

43
ThiefMaster

Lorsque vous insérez une variable N’IMPORTE LAQUELLE dans le code HTML, sauf si vous souhaitez que le navigateur interprète la variable elle-même en tant que code HTML, il est préférable d’utiliser htmlspecialchars() sur il. Entre autres choses, il empêche les pirates informatiques d'insérer du code HTML arbitraire dans votre page.

La valeur de $_SERVER['PHP_SELF'] Provient directement de l'URL entrée dans le navigateur. Par conséquent, si vous l'utilisez sans htmlspecialchars(), vous autorisez les pirates à manipuler directement la sortie de votre code.

Par exemple, si je vous envoie un lien par courrier électronique à http://example.com/"><script>malicious_code_here()</script><span class=" et que vous avez <form action="<?php echo $_SERVER['PHP_SELF'] ?>">, Le résultat sera le suivant:

<form action="http://example.com/"><script>malicious_code_here()</script><span class="">

Mon script va courir, et vous ne serez pas le plus sage. Si vous étiez connecté, j'ai peut-être volé vos cookies ou rayé des informations confidentielles de votre page.

Cependant, si vous utilisiez <form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']) ?>">, le résultat serait:

<form action="http://example.com/&quot;&gt;&lt;script&gt;cookie_stealing_code()&lt;/script&gt;&lt;span class=&quot;">

Lorsque vous avez soumis le formulaire, vous aviez une URL étrange, mais au moins mon script diabolique ne s'est pas exécuté.

D'un autre côté, si vous utilisiez <form action="">, Le résultat serait le même, peu importe ce que j'ai ajouté à mon lien. C'est l'option que je recommanderais.

23
Mark Eirich

Je sais que la question a deux ans, mais c’est le premier résultat de ce que je recherche. J'ai trouvé une bonne réponse et j'espère pouvoir aider d'autres utilisateurs.

Regardez ceci

Je vais faire ce brief:

  • utilisez le $_SERVER["PHP_SELF"] Variable avec htmlspecialchars ():

    `htmlspecialchars($_SERVER["PHP_SELF"]);`
    
  • PHP_SELF renvoie le nom du fichier du script en cours d'exécution.

  • La fonction htmlspecialchars () convertit les caractères spéciaux en entités HTML. -> NO XSS
11
Micha93

En plus des réponses ci-dessus, une autre façon de le faire est d'utiliser $_SERVER['PHP_SELF'] Ou simplement d'utiliser une chaîne vide, c'est d'utiliser __DIR__.
OU
Si vous utilisez une version inférieure PHP version (<5.3)), une alternative plus courante consiste à utiliser dirname(__FILE__)
Les deux renvoie le nom du dossier du fichier en contexte.

EDIT
Comme Boann l'a fait remarquer, cela renvoie l'emplacement du fichier sur le disque. Ce que vous n’exposeriez pas idéalement en tant qu’URL. Dans ce cas, dirname($_SERVER['PHP_SELF']) peut renvoyer le nom du dossier du fichier en contexte.

0
maxxon15