Coffre-fort à l'évaluation des expressions arithmétiques en Javascript
J'ai besoin pour évaluer saisies par l'utilisateur de l'arithmétique des expressions comme "2 * (3 + 4)" en Javascript mais je ne veux pas utiliser eval
pour des raisons de sécurité.
J'ai pu dépouiller tous les caractères qui ne sont pas des numéros ou des opérateurs, mais je ne suis pas sûr que ce serait à l'abri de toute façon, et ce serait bien si l'utilisateur peut utiliser des fonctions comme cos
, sqrt
, etc...
Existe-il des bibliothèques Javascript qui ne l'arithmétique de l'évaluation de l'expression?
Sauf si vous obtenez votre propre, vous n'aurez pas à surmonter les problèmes de sécurité?
OriginalL'auteur Giuseppe Ottaviano | 2011-02-21
Vous devez vous connecter pour publier un commentaire.
vous pouvez essayer JavaScript Évaluateur D'Expression:
puis votre code sera comme ça:
OriginalL'auteur
Comme déjà mentionné, la plupart des dommages de n'importe quel utilisateur puisse faire est à peu près ce qu'ils pouvaient déjà le faire en utilisant le haut de la console dans tous les principaux navigateurs. Cependant, si vous souhaitez restreindre l'utilisateur à l'aide de
Math
propriétés/méthodes, vous pouvez écrire une simple regex pour gérer cela pour vous. Quelque chose comme ceci devrait fonctionner:Je me rends compte que vous ne souhaitez pas utiliser
eval
pour des raisons de sécurité, mais les regex devrait le faire assez sûr qu'elle exclut tous les mots qui ne sont pas direct propriétés de laMath
objet et la plupart des non-math JS opérateurs, y compris l'opérateur d'affectation (=
) et des opérateurs binaires. Le plus difficile de la méthode d'écriture d'un générateur de jetons pour analyser l'expression mathématique, parce que ce n'est pas un langage régulier.N'hésitez pas à essayer et à briser le exemple de travail je l'ai écrit, si vous le pouvez, ou si vous remarquez un problème, laissez un commentaire et je vais voir ce que je peux faire pour résoudre le problème.
Remarque: Yi Jiang mentionné en JavaScript chat, il pourrait également être utile d'autoriser les minuscules pour des choses comme
Math.PI
. Si c'est le cas, vous pouvez simplement ajouter le suivantelse if
instruction dans la fonction de remplacement:Ajouter entre les
if
etelse
déclaration (exemple)."La plupart des dommages de n'importe quel utilisateur puisse faire est à peu près ce qu'ils pouvaient déjà le faire en utilisant le haut de la console dans tous les grands navigateurs" est basé sur de fausses prémisses. Les chaînes de venir de l'extérieur du navigateur via les serveurs et les Url. La meilleure politique est de code en supposant que les entrées de votre fonction, à partir de lieux à ne pas attendre que les autres devs ajouter à votre application, ce qui signifie ne pas utiliser trop puissant opérateurs comme
eval
.J'aurais du mal à être d'accord à 100%. Tout ce que vous avez dit est vrai lors de l'évaluation d'entrée en provenance d'autres sources, je maintiens ma réponse pour quand vous êtes seulement à l'évaluation de la saisie de l'utilisateur.
Ma lecture de l'expression "évaluation des entrées de l'utilisateur" comprend l'évaluation de l'entrée de l'utilisateur Carol utilisateur dans le navigateur d'Alice. Avant chaque PM et leur mère a été d'essayer de rendre leur site web "social", plus limitée, la lecture serait raisonnable, mais aujourd'hui, je pense que le plus vaste de la lecture doit être la valeur par défaut, sauf si l'application spec dit précisément le contraire.
Le usecases peut inclure l'évaluation de la saisie de l'utilisateur sur le serveur. Ensuite, la sécurité est importante.
OriginalL'auteur
Vous pouvez utiliser l'avancée analyseur d'expression de math.js qui n'utilise pas de JavaScript eval.
http://mathjs.org
Utilisation:
ou de l'utilisation de l'analyseur (qui prend en charge variable et fonction des affectations):
OriginalL'auteur
Vous pouvez utiliser une regex pour remplacer tout, sauf pour votre liste blanche. Mais depuis que le javascript est exécuté sur le client (sauf si vous utilisez AOL le serveur http) n'importe qui peut modifier les entrées peuvent modifier le code en tant que bien de sorte que vous n'êtes pas vraiment le rendre tout plus ou moins sûr qu'il l'est déjà.
OriginalL'auteur