使用 PHP 和/或 Maxima 对 Maxima 命令进行用户输入验证


User input validation of Maxima commands using PHP and/or Maxima

我在tomcat服务器上运行了maxima,我使用php访问它。

在我的网站上,用户能够执行maxima命令,这些命令使用php发送到我的tomcat服务器。

但是,这给我留下了确保用户提供的输入是安全的问题。例如,我想禁止使用危险的极大值函数,如writefile(以及许多其他函数)。

目前,我只是使用 php 验证输入,使用黑名单单词列表,我使用 strpos 检查其出现次数。显然这根本不安全,因为用户可以简单地输入'write' . 'file' . '()'而不是writefile(),从而绕过对列入黑名单的单词的检查。

我怀疑 PHP 是否是我应该用来确保提供的输入是安全的,所以我想知道是否有办法在我的 tomcat 服务器上将某些函数 INSIDE maxima 列入黑名单?

IMO,多层安全解决方案是您唯一的选择。

  1. 尽可能多地验证 php 用户输入。不要忘记限制允许的最大输入长度

  2. Maxima是开源的,所以你可以撕掉所有"危险"的命令。 我的 lisp 知识有限,所以我不能说用户是否能够绕过这个限制。

  3. 把你的雄猫放在监狱/虚拟机中。

我同意 w/strangeqargo 关于多层安全性的看法,并且只有一些想法可以贡献。

这些千米之外的步骤可能是最重要的:

  • 监狱/虚拟机
  • 限制输入和输出的大小
  • 限制在任何一个计算上花费的内存和/或 CPU 时间

一旦涵盖了上述内容,这些 Maxima 内部步骤就不那么重要了:

  • 禁止:lisp输入
  • 不允许 Lisp 符号(即 ?foo
  • 重新定义通常具有副作用的函数(例如读取和写入文件的函数)以不执行任何操作

我认为如果你重新定义副作用功能,你不需要为黑名单而烦恼。用户可以调用writefile或其他任何内容,但它不起作用。您可以在 Maxima 中重新定义内置函数,您的新定义优先于内置版本。请注意,表示法foo([a]) := ...意味着a是所有参数(任意数量的参数)的列表,因此您无需考虑每个函数采用多少参数。

writefile ([a]) := false;

为了更好地衡量,你也可以删除内置的Lisp函数。

?fmakunbound (writefile);

参见 Common Lisp Hyperspec 中的 FMAKUNBOUND。