我不想编写我自己的递归下降数学解析器或者深入思考语法,所以我(重新)使用Perl模块
Safe.pm作为带变量的算术计算器.我的任务是让一个匿名的Web用户将一个类型放入一个文本字段中的几个数学表达式,如:
**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.
到< pre>文本输出如下所示:
**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,或者谁知道什么.有没有更好的解决方案,只选择递归下降数学语法解析器? (并且,不应该允许子系统()使用数学函数!)
>对于打印,我可以在文本周围打印“…”并转到另一个Safe eval,但这会用undef替换$a.我的真正意思是我的代码是通过新添加的变量表($x,$y和$z),如果它们看起来未转义,则替换它们;其他人应该被忽视.我还必须在这里仔细观察,我的家伙们并没有共同努力逃避并输入文字,如“; system(”rm -rf *“); print”;尽管Safe会抓住这个特殊问题.更有可能的是,A可能会尝试为B注入一些讨厌的JavaScript或谁知道什么.
问题:
> Safe.pm是适合这项工作的合适工具吗? Perl在这里看起来像一个沉重的大炮,但不必重新发明轮子是很好的.
>是否可以进一步将Safe.pm限制为Perl的算术?
>是否有一个“新符号”表,我可以迭代替换?
最佳答案 Safe.pm似乎是一个糟糕的选择,因为你将冒险忽视一些可利用的操作.我建议看一个解析工具,比如
Marpa.它甚至有一个
calculator implementation的开头,你可能可以适应你的目的.