2010-09-01 13 views
2

Je viens de réaliser que, pour des circonstances étranges, je faisais ce que je crois être des soumissions personnelles, sans aucune référence à PHP_SELF sur l'attribut de formulaire d'action.

Je suis perplexe, peut-on utiliser soit

<?php echo filter_var($_SERVER['PHP_SELF'], FILTER_SANITIZE_STRING); ?> 

Ou

action="" 

? Si non, dans quelles circonstances devrions-nous en considérer un ou un autre?

Merci à l'avance, MEM

Répondre

3

Vous pouvez utiliser (PHP_SELF ou chaîne vide). mais pourquoi utiliseriez-vous FILTER_SANITIZE_STRING pour cela? Il est préférable d'utiliser htmlentities() au lieu de filter_var dans ce cas, si votre chemin contient des caractères filtrés (par exemple, <), le formulaire ne sera pas envoyé.

Je préfère donner une chaîne, <base href=> peut causer des problèmes lors de l'utilisation de valeurs vides. Exemple:

<form action="<?php echo htmlentities($_SERVER['PHP_SELF']);?>" method="post"> 
</form> 
+0

Pourquoi l'un au lieu d'un autre, pouvez-vous élaborer? Merci beaucoup. – MEM

+0

Les caractères comme '<' dans les chemins seront filtrés, la ressource ne sera pas accessible. – Lekensteyn

+0

cette réponse est manquante 'ENT_QUOTES', au moins. Je ne vois pas vraiment le point - pourquoi ne pas utiliser une chaîne vide? S'échapper pour toutes les entrées possibles a tendance à ne pas être trivial, mais utiliser une chaîne vide est. – eis

0

Si je ne me trompe pas Safari a/a des problèmes avec ce dernier, donc je suis passé à l'utiliser.

+0

@nikic - Merci beaucoup. @All - Quelqu'un d'autre peut-il confirmer si ce qui précède s'applique toujours? Ou si c'est un cas courant ... J'ai besoin de plus de preuves pour décider de l'utiliser ou non. : D – MEM

+0

Pour plus d'informations à ce sujet, voir [this] (http://stackoverflow.com/questions/415234/forms-with-action) et [this] (https: //bugs.webkit.org/show_bug.cgi? id = 19884). En bref, le bug a été résolu en 2009. – eis

-1

S'il vous plaît faire pas utilisation PHP_SELF, car cela peut aussi être /index.php/"><script>alert(1)</script>/.

Il est souvent utilisé pour les attaques XSS.

Utilisez l'index SCRIPT_NAME à la place! SCRIPT_NAME pointera toujours sur le fichier PHP réel et non sur l'entrée utilisateur.

Cordialement

Edit:

Deux personnes font remarquer que SCRIPT_NAME ne fonctionnerait pas lors de l'utilisation mod_rewrite. C'est faux et je pense que ces gens devraient lire avant de voter.

est ici un scénario de test pour vous ***:

$ cat .htaccess 
RewriteEngine On 
RewriteRule testme/ /testmenot.php 

$ cat testmenot.php 
<? echo $_SERVER['SCRIPT_NAME']; ?> 

$ GET hostname/testme/ 
/testmenot.php 

$_SERVER['REQUEST_URI'] est la tenue "/ testme /", que je suppose que ces gens auraient attendu SCRIPT_NAME. Mais cela peut aussi être trouvé dans PHP_SELF.

/me croise les doigts
: E

+0

-1, SCRIPT_NAME ne fonctionnera pas pour les URL réécrites. PHP_SELF peut être utilisé si vous le vérifiez bien. – Lekensteyn

+0

@Jan: le filter_var ou htmlentities ne gère-t-il pas cela? – MEM

+0

'$ _SERVER ['SCRIPT_NAME']' ne fonctionne pas avec l'URL réécrite: s. Le XSS n'est pas un problème si la page de réception redirige après l'analyse de la demande. – chelmertz

-1
 <?php 
    session_start(); 
     $msg = ''; 

     if (isset($_POST['login']) && !empty($_POST['username']) 
      && !empty($_POST['password'])) { 

      if ($_POST['username'] == 'abc' && 
       $_POST['password'] == 'xyz') { 
       $_SESSION['valid'] = true; 
       $_SESSION['timeout'] = time(); 
       $_SESSION['username'] = 'abc'; 
       ?> 

       <script type="text/javascript"> 

      location.href="index.php" 

     </script> 
       <?php 
      } 
      else 
      { 
       $msg ='Invalid username or password'; 
      } 
     } 
    ?> 
     <form 
     action ="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); 
     ?>" method = "post"> 
       <input type = "text" class = "form-control" 
      name = "username" placeholder = "username" 
      required autofocus ></br> 
      <input type = "password" class = "form-control" 
      name = "password" placeholder = "password" required> 

     <input class="button" type = "submit" name = "login" value="Log in"/>