2010-01-26 7 views
2

Les utilisateurs doivent pouvoir entrer un tableau de paramètres PHP.Convertir en toute sécurité la chaîne de tableau fournie par l'utilisateur dans le tableau PHP?

Actuellement, ils voient une zone de texte où ils devraient entrer du code PHP qui définit un tableau:

<textarea name="foo"> 
$bar = array('key' => 'value'); 
</textarea> 

Je reçois la valeur de la zone de texte, par exemple, la chaîne $ _GET [ » foo '].

Comment est-ce que je peux analyser ceci pour que je puisse utiliser le tableau $ bar? Je préfère ne pas utiliser eval si je peux l'aider.

Merci!

+2

Vous devriez reconsidérer votre conception. À tout le moins, pensez à utiliser JSON au lieu de demander à l'utilisateur de taper PHP. –

+0

@Bacon - L'une des réponses vous a-t-elle aidé? – Nicole

Répondre

0

Si vous devez absolument que l'utilisateur définisse le tableau de cette manière, il vaudra mieux que vous le définissiez comme json. Il est facile à convertir et vous n'avez pas à lexer comme le code php; beaucoup plus sûr que eval. De plus, json est un moyen léger et facile de définir des tableaux, donc ce sera une expérience utilisateur plus agréable pour eux aussi :)

+0

Nous avions essayé à l'origine d'utiliser JSON, mais nous avons aimé l'idée de ne pas forcer les utilisateurs à apprendre une nouvelle syntaxe. Eval() n'est pas très sympa, donc, nous revenons en arrière et faisons une interface utilisateur javascript, donc la construction de tableaux JSON devient plus intuitive. Merci pour toutes les réponses, tout le monde! – Bacon

0

Je ne suis pas sûr que vous ne voulez pas utiliser eval, car c'est exactement pour le but que vous décrivez. Cependant, étant donné que l'entrée de l'utilisateur est si dangereuse, est-ce la raison pour laquelle vous essayez de l'éviter? Si oui, votre seule option sera probablement d'analyser la valeur de $_GET['foo'], supprimer tout code dangereux ou indésirable, puis eval.

[Modifier ] - Nouvelle réponse

Maintenant que je pense, si vous avez besoin d'une solution simple pour l'utilisateur de données à base de tableau-entrée, regardez parse_ini_string-http://us3.php.net/parse_ini_string. Il prendra une chaîne au format suivant et vous donnera un tableau associatif. Vous pouvez même utiliser des tableaux multidimensionnels si vous en avez besoin.

one = 1 
five = 5 
animal = BIRD 
phpversion[] = "5.0" 
phpversion[] = "5.1" 
phpversion[] = "5.2" 
phpversion[] = "5.3" 
+3

"Si eval est votre réponse, vous posez la mauvaise question." ~ Rasmus Lerdorf, je pense – robertbasic

0

Oh bizarre. Ouais évitez Eval, c'est demander des ennuis. J'écrirais probablement une fonction d'analyse caractère par caractère pour vérifier que l'entrée est dans le bon format, puis j'utiliserai les fonctions de traitement de chaîne de php pour obtenir la clé 'key' et 'value' et construire le tableau de cette façon.

0
if(is_set($_GET['foo'])) // we have something 
{ 
// do your security testing and ad it to var $foos 
// now proceed 
    foreach($foos as $foo) 
    { 
    echo $foo; 
    } 
} 
0

Utilisation parse_str() est la meilleure option si vous ne souhaitez pas utiliser eval():

$str = 'first=value&arr[]=foo+bar&arr[]=baz'; 

parse_str($str, $arr); 

echo $arr['first']; // value 
echo $arr['arr'][0]; // foo bar 
echo $arr['arr'][2]; // baz 

Les tokenizer fonctions peuvent également être une option, mais ce sera plus compliqué.

Questions connexes