perl - Safe.pm base_math 作为数学计算器和新变量

标签 perl

我不想编写自己的递归下降数学解析器或对语法思考得太深,所以我(重新)使用 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 "..."围绕文本进行另一个安全评估,但这会替换 $aundef .我真正的意思是我的代码要做的是浏览新添加的变量表( $x$y$z ),如果它们没有转义,则替换它们;其他的应该被忽略。我还必须在这里仔细观察,我的伙计们并没有一起努力尝试逃避和输入像 "; system("rm -rf *"); print "; 这样的文本。 ,尽管 Safe 会捕捉到这个特定问题。更有可能的是,A 可能会尝试为 B 注入(inject)一些讨厌的 JavaScript,或者谁知道呢。

  • 问题:
  • Safe.pm 是适合这项工作的工具吗? Perl 在这里看起来像是一门沉重的大炮,但不必重新发明轮子也不错。
  • 可以进一步将 Safe.pm 限制为仅 Perl 的算术吗?
  • 是否有一个“新符号”表可以迭代以进行替换?
  • 最佳答案

    Safe.pm 似乎是一个糟糕的选择,因为您将冒着忽略某些可利用操作的风险。我建议查看解析工具,例如 Marpa .它甚至有一个 calculator implementation 的开头。你可能会适应你的目的。

    关于perl - Safe.pm base_math 作为数学计算器和新变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33022214/

    相关文章:

    javascript - Markdown -> detab 正则表达式中的摊牌错误?

    perl - 打包一个简单的 perl 脚本供运行 Windows 的 "average Joes"使用

    linux - 将十进制数序列转换为大端 float

    perl - 我想在Perl中支持多种返回类型。

    Perl,如何从 url 并行获取数据?

    perl - 如何grep perl Hash Keys 到一个数组?

    multithreading - 使用STDOUT(屏幕)与常规文件的性能

    perl - 如何获得 __LINE__ 调用函数?

    DOS批处理文件中的Perl脚本返回值

    mysql - last_insert_id 是否在多处理环境中返回正确的 auto_increment id?