90 votes

Quand est-eval mal en php?

Durant toutes ces années, j'ai développé en php, j'ai toujours entendu dire que l'utilisation d' eval() est le mal.

Considérant le code suivant, ne serait-il judicieux d'utiliser la seconde (et la plus élégante) option? Si non, pourquoi?

// $type is the result of an SQL statement
// e.g. SHOW COLUMNS FROM a_table LIKE 'a_column';
// hence you can be pretty sure about the consistency
// of your string
$type = "enum('a','b','c')";

// possibility one
$type_1 = preg_replace('#^enum\s*\(\s*\'|\'\s*\)\s*$#', '', $type);
$result = preg_split('#\'\s*,\s*\'#', $type_1);

// possibility two
eval('$result = '.preg_replace('#^enum#','array', $type).';');

136voto

Michał Rudnicki Points 8424

Je serais prudent dans l'appel de la fonction eval() mal pur. Évaluation dynamique est un outil puissant qui peut parfois être un épargnant de vie. Avec la fonction eval (), on peut contourner shortcommings de PHP (voir ci-dessous).

Les principaux problèmes avec la fonction eval() sont:

  • Potentiel dangereux d'entrée. En passant un paramètre non fiables est une façon d'échouer. Il n'est souvent pas une mince tâche de veiller à ce que l'un des paramètres (ou une partie) est entièrement fiable.
  • Trickyness. À l'aide de la fonction eval() rend le code intelligent, donc plus difficile à suivre. Pour citer Brian Kernighan "Débogage est deux fois plus dur que l'écriture du code en premier lieu. Par conséquent, si vous écrivez le code le plus intelligemment possible, vous êtes, par définition, pas assez intelligent pour le déboguer"

Le principal problème avec l'utilisation réelle de la fonction eval() est une seule:

  • inexpérimenté développeurs qui l'utilisent sans considération.

En règle générale, j'ai tendance à suivre ce:

  1. Parfois eval est le seul/la bonne solution.
  2. Pour la plupart des cas, il faut essayer autre chose.
  3. En cas de doute, goto 2.
  4. Autre chose, être très, très prudent.

42voto

eval est le mal quand il y a une petite possibilité que userinput est inclus dans le évalués chaîne. Lorsque vous ne eval sans contenu qui est venu à partir d'un utilisateur, vous devriez être en sécurité.

Néanmoins, vous devriez réfléchir à deux fois au moins avant de l'utiliser eval, il semble trompeusement simple, mais avec la gestion des erreurs (voir VBAssassins commentaire), debuggability etc. dans l'esprit, il n'est pas si simple plus.

Donc, comme une règle du pouce: L'oublier. Lorsque eval est la réponse que vous êtes probablement se poser la mauvaise question! ;-)

21voto

thomasrutter Points 42905

eval() est tout aussi mal en tout temps.

"Quand est-eval() pas mal?" est la bonne question à se poser, à mon avis, parce qu'elle semble impliquer que les inconvénients à l'utilisation de eval() comme par magie disparaître dans certains contextes.

À l'aide de la fonction eval() est généralement une mauvaise idée, car il diminue la lisibilité du code, la possibilité pour vous de prévoir le chemin d'accès du code (et les possibles implications en matière de sécurité de l') avant l'exécution, et donc la possibilité de déboguer le code. En outre, il n'existe pas de situation pour laquelle il est absolument nécessaire d'utiliser la fonction eval() - PHP est un langage de programmation fonctionnel sans elle.

Si vous n'avez pas voir ces maux ou vous pouvez personnellement justifier l'utilisation de la fonction eval() dans certains cas, c'est à vous. Pour certains, les maux sont trop grands pour justifier cela, et pour d'autres, la fonction eval() est un raccourci pratique.

Toutefois, si vous voyez eval() comme le mal, c'est mal, en tout temps. Il n'a pas la baguette magique pour perdre sa méchanceté selon le contexte.

15voto

BlackAura Points 2195

Dans ce cas, la fonction eval est probablement assez sûr, tant qu'il n'est jamais possible pour arbitraire colonnes doivent être créés dans un tableau par un utilisateur.

C'est pas vraiment plus élégant. Il s'agit d'un texte d'analyse de problème, et d'abuser de PHP analyseur de poignée est semble un peu hacky. Si vous voulez abus de langage caractéristiques, pourquoi ne pas l'abus de parser le JSON? Au moins avec le parser JSON, il n'y a aucune possibilité de l'injection de code.

$json = str_replace(array(
	'enum', '(', ')', "'"), array)
	'',     '[', ']', "'"), $type);
$result = json_decode($json);

Une expression régulière est probablement la façon la plus évidente. Vous pouvez utiliser une seule expression régulière pour extraire toutes les valeurs de cette chaîne:

$extract_regex = '/
	(?<=,|enum\()	# Match strings that follow either a comma, or the string "enum("...
	\'		# ...then the opening quote mark...
	(.*?)		# ...and capture anything...
	\'		# ...up to the closing quote mark...
	/x';
preg_match_all($extract_regex, $type, $matches);
$result = $matches[1];

12voto

GreenieMeanie Points 1652

Lorsque vous utilisez des données étrangères (telles que la saisie de l'utilisateur) à l'intérieur de l'eval.

Dans l'exemple ci-dessus, ce n'est pas un problème.

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