Question

Je travaille sur un projet php, et je veux exécuter du code qui est tiré par les cheveux à partir d'une base de données MySQL. Il n'y a aucune chance de code non sécurisé étant injecté, de sorte que la seule chose que je suis inquiet est performace. Dois-je utiliser eval () pour que je puisse exécuter le code directement, ou l'analyser afin que call_user_func () exécute la place?

Par exemple, si le code que j'allé chercher était "myfunc (1,2,3); anotherFunc (3,2,1);"
Je peux eval () directement pour exécuter le code.

Mais pour call_user_func (), je dois analyser la chaîne afin qu'il puisse être exécuté. Alors, qui est la meilleure fonction à utiliser dans ce cas?

Était-ce utile?

La solution

En règle générale, j'essaie toujours de rester aussi loin de eval () que possible. Ce cas, cependant, ressemble à un bon candidat pour lui.

Vous dites « Il n'y a aucune chance de code non sécurisé étant injecté » , de sorte que la grande question est: est-il une chance code désoeuvrement étant dans la base de données

Dans le cas contraire, eval () est la solution, mais s'il est alors l'enregistrement d'analyse et d'erreur appropriée / etc peut-être un pari plus sûr. (Je crois qu'utiliser call_user_func_array () est plus rapide en théorie, de sorte que toute les frais généraux d'analyse syntaxique pourrait devenir négligeable)

Autres conseils

PHP dans la Mémorisation base de données est une mauvaise odeur de la conception en elle-même; même si, dans ce cas, vous êtes sûr qu'il ne peut jamais contenir du code dangereux, il est toujours bon de réduire le nombre d'hypothèses ou moyens de défense comme que vous devez faire. Si vous stockez du code PHP dans la base de données, puis une attaque dans laquelle un gain attaquant l'accès à votre base de données devient rapidement beaucoup plus sérieux, se transformant en une attaque dans laquelle un attaquant peut exécuter du code arbitraire! Je sais que votre base de données ayant compromis comme celui-ci est très peu probable, mais il est néanmoins de bonnes pratiques de sécurité de ne pas laisser même une situation improbable compromettre votre système plus que nécessaire.

Beaucoup de gens sont d'accord que eval () doit toujours, sans exception, être évitée dans le code PHP. Il y a toujours une alternative.

Dans ce cas, cependant, je pense que je dois dire que l'utilisation de eval () serait la meilleure solution pour vous, parce que vous stockez déjà du code PHP dans le DB, donc en utilisant eval () ne va pas augmenter votre risque plus loin que cela.

Je voudrais cependant recommander que

  1. Vous essayez de valider le code avant eval () il, en étant prudent dans ce que vous permettez. On suppose que en quelque sorte un attaquant est entré dans votre base de données même pensée qui est peu probable.
  2. Vous au moins donner une réflexion sérieuse à réécrire votre application afin que le code PHP ne sont pas stockées dans une base de données. Si vous stockez des structures de données complexes, pensez à quelque chose comme JSON ou même XML au lieu. parseurs sûrs existent pour ces derniers.

Je suis désolé si cette réponse semble un peu réactionnaire; Je viens d'arriver à se sentir ce genre de chose est très important.

Je pense que l'analyse syntaxique ajouterait les frais généraux, mais la seule façon que vous pouvez être sûr est d'exécuter des tests il. Expérimentez avec différentes fonctions et voir ce que vos résultats sont. Utilisez le code qui représente ce que vous vous attendez à stocker.

Bonne chance!

Utiliser eval (). Tout le reste ne vaut pas l'effort -. Ils n'ont pas d'effets secondaires positifs

Vous pouvez jeter un oeil à la runkit extention, qui peut exécuter php dans un bac à sable ne pas effectuer le code de fonctionnement.

Si le code est censé effectuer votre code en cours d'exécution, allez eval ().

Vous devez enveloppez le code que vous êtes sur le point d'exécuter dans un bloc try / catch aussi, dans le cas où il y a une erreur (même si vous avez dit qu'il n'y aura pas, il y a une possibilité, et il est la meilleure pratique)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top