我不想编写自己的递归下降数学解析器或对语法思考得太深,所以我(重新)使用 Perl 模块 Safe.pm作为一个带变量的算术计算器。我的任务是让一个匿名网络用户 A 在文本字段中输入几个数学表达式,例如:
**Input Formula:** $x= 2; $y=sqrt(2*$x+(25+$x)*$x); $z= log($y); ...
理想情况下,这应该只包含数学表达式,而不是通用 Perl 代码。稍后,我想将它用于网络用户 B:
**Input Print:** you start with x=$x and end with z=$z . you don't know $a.
到
文本输出,如下所示:**Output Txt:** you start with x=2 and end with z=2.03 . you don't know $a.
($a 没有被替换的事实是它自己的警告。)理想情况下,我想检查我的网络用户不仅没有尝试闯入,而且没有出现语法错误。
我当前基于 Safe.pm 的实现有缺点:
:base_math
仅将 Safe.pm 扩展到 :base_core
之外,所以我必须与不仅可以访问数学代数表达式的用户一起生活。例如,Web 用户可能会不小心尝试使用 Perl 保留名称、定义 subs 或做谁知道什么。有没有更好的解决方案只选择递归下降数学语法解析器? (而且,像 system()
这样的子程序不应该被允许使用数学函数!) print "..."
围绕文本进行另一个安全评估,但这会替换 $a
与 undef
.我真正的意思是我的代码要做的是浏览新添加的变量表( $x
、 $y
和 $z
),如果它们没有转义,则替换它们;其他的应该被忽略。我还必须在这里仔细观察,我的伙计们并没有一起努力尝试逃避和输入像 "; system("rm -rf *"); print ";
这样的文本。 ,尽管 Safe 会捕捉到这个特定问题。更有可能的是,A 可能会尝试为 B 注入(inject)一些讨厌的 JavaScript,或者谁知道呢。 问题:
最佳答案
Safe.pm 似乎是一个糟糕的选择,因为您将冒着忽略某些可利用操作的风险。我建议查看解析工具,例如 Marpa .它甚至有一个 calculator implementation 的开头。你可能会适应你的目的。
关于perl - Safe.pm base_math 作为数学计算器和新变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33022214/