2010-02-13 7 views
3

Considérons la paire de snippets suivante, les deux font essentiellement la même chose.

<html> 
<body> 
    <?php 
    if(isset($_POST["firstName"]) && isset($_POST["lastName"])){ 
    //I'm copying the POST variable to a local one. 
    $firstName = $_POST["firstName"]; 
    $lastName = $_POST["lastName"];  
    echo "<h1>Thank you for taking the census!</h1>"; 
    echo "On behalf of Sergio's Emporium, we name you: " . $firstName . $lastName . ", conquerer of worlds!"; 
    //Here I'm just pulling it from the POST info. 
    echo "I think that's fitting since you're a " . $_POST["item"]; 
    } 
    else {  
    echo "You didn't write in the necesarry information.";  
    } 
    ?> 
</body> 
</html> 

Ce qui est préférable à utiliser (du point de vue de la sécurité) et qui est encouragé à être utilisé par les normes.

Depuis que je suis nouveau à PHP c'est quelque chose qui tire ma chaîne. Merci les gars! :)

+0

Justin est vraiment cette question subjective? Je pensais qu'il y avait une ligne directrice sur les meilleures pratiques pour cela. –

+0

Voir la réponse de Pascal MARTIN. Ce n'est pas la façon dont vous y accédez qui importe, c'est la façon dont vous l'utilisez. De plus, les lignes directrices sont encore largement subjectives. –

+0

Ceci est très subjectif, car chaque personne a une opinion différente de ce qu'est aseptisé, et si vous devriez le faire dans la variable globale ou variable locale. –

Répondre

7

Je dirais aucune de ces deux solutions changer quoi que ce soit d'un point de vue de la sécurité, que vous correctement:

  • Filter/valider l'entrée
  • et sortie échapper.

Ici, comme vous produisez du HTML, il peut être utile d'échapper à vos données avec htmlspecialchars, par exemple ;-)


Pour faciliter cela, certaines personnes aiment à considérer que:

  • $_POST contient l'entrée brute
  • et une variable locale sont utilisés pour contenir l'entrée filtrée - à savoir que vous pouvez utiliser « en toute sécurité » dans le reste de votre script.
+0

Aha aha.Ce 4e point a beaucoup de sens. :) Est-ce la façon dont les pros le font? –

+0

J'utilise parfois cette solution * (et elle est parfois imposée par des frameworks, d'une certaine manière, je suppose) *; pas toujours: ça dépend de la taille de mon code PHP - si j'écris un script rapide, je ne le fais pas de cette façon, mais pour une application grande/complète, ça aide parfois ^^ –

+0

J'aime mettre des données vérifiées/assainies/échappées dans des tableaux, nommés aux fins pour lesquelles les données ont été modifiées. Comme, par exemple, '$ sqlData',' $ htmlData', etc ... - S'assure que je n'utilise pas accidentellement des données non sécurisées. - Et je considère que les variables de la portée "global" sont aussi sales que celles des superglobales ('$ _POST',' $ _GET', etc.). Vieille habitude des jours de * register_globals *. – Atli

-1

Je crois que vous devriez parce que vous devriez faire une sorte de santizing aux vars post alors assigner à une variable locale

+1

Vous croyez que je devrais quoi? : P –

+2

Je pense qu'il a mentionné local var quelque part, ce qui devrait vous donner un indice. –

+1

On dirait une réponse valide à moi +1 –

-1

Selon le gourou de la performance de Google, copie la variable PHP doit être évitée autant que possible: http://code.google.com/speed/articles/optimizing-php.html

Personnellement, je l'aime quand je peux voir clairement en haut du script les variables du script attend de la demande, donc je l'habitude d'écrire des copies des $_REQUEST et des amis dans le top:

<?php 
    $req_param1 = $_REQUEST['param1']; 
    ... 
    if (isset($req_param1)) { 
     ... 
    } 
    ... 

de nos jours, je le fais differerntly. J'utilise généralement define() ou dans une classe, const pour définir les noms des paramètres que j'attends de la requête. Je peux alors rechercher ceux dans le code pour voir où je les refeernce fait:

define('REQ_PARAM1', 'param1'); 
... 
function foo(){ 
    if (isset($_REQUEST[REQ_PARAM1])){ 
    ... 
    } 
    ... 
} 

exemple avec classe:

class MyClass { 
    const REQ_PARAM1 = "param1"; 
    ... 
    function foo(){ 
     if (isset($_REQUEST[MyClass::REQ_PARAM1])){ 
      ... 
     } 
    } 
} 
+4

La "copie variable à éviter" n'est pas vraie avec les versions récentes de PHP, si je ne me trompe pas: PHP utilise copy-on-write, ce qui signifie que les variables seront vraiment copiées lors de la modification d'une version. –

+2

Correct. Il n'y a vraiment pas de désavantage à copier des variables. La communauté PHP a critiqué le document de Google à ce sujet. –

+0

Merci, bon à savoir! Je dois dire que je ne m'inquiète généralement pas trop à ce sujet, je n'ai tout simplement pas été dans une situation où cela importait. –

Questions connexes