我在tomcat服务器上运行了maxima,我使用php访问它。
在我的网站上,用户能够执行maxima命令,这些命令使用php发送到我的tomcat服务器。
但是,这给我留下了确保用户提供的输入是安全的问题。例如,我想禁止使用危险的极大值函数,如writefile
(以及许多其他函数)。
目前,我只是使用 php 验证输入,使用黑名单单词列表,我使用 strpos
检查其出现次数。显然这根本不安全,因为用户可以简单地输入'write' . 'file' . '()'
而不是writefile()
,从而绕过对列入黑名单的单词的检查。
我怀疑 PHP 是否是我应该用来确保提供的输入是安全的,所以我想知道是否有办法在我的 tomcat 服务器上将某些函数 INSIDE maxima 列入黑名单?
IMO,多层安全解决方案是您唯一的选择。
-
尽可能多地验证 php 用户输入。不要忘记限制允许的最大输入长度
-
Maxima是开源的,所以你可以撕掉所有"危险"的命令。 我的 lisp 知识有限,所以我不能说用户是否能够绕过这个限制。
-
把你的雄猫放在监狱/虚拟机中。
我同意 w/strangeqargo 关于多层安全性的看法,并且只有一些想法可以贡献。
这些千米之外的步骤可能是最重要的:
- 监狱/虚拟机
- 限制输入和输出的大小
- 限制在任何一个计算上花费的内存和/或 CPU 时间
一旦涵盖了上述内容,这些 Maxima 内部步骤就不那么重要了:
- 禁止
:lisp
输入 - 不允许 Lisp 符号(即
?foo
) - 重新定义通常具有副作用的函数(例如读取和写入文件的函数)以不执行任何操作
我认为如果你重新定义副作用功能,你不需要为黑名单而烦恼。用户可以调用writefile
或其他任何内容,但它不起作用。您可以在 Maxima 中重新定义内置函数,您的新定义优先于内置版本。请注意,表示法foo([a]) := ...
意味着a
是所有参数(任意数量的参数)的列表,因此您无需考虑每个函数采用多少参数。
writefile ([a]) := false;
为了更好地衡量,你也可以删除内置的Lisp函数。
?fmakunbound (writefile);
参见 Common Lisp Hyperspec 中的 FMAKUNBOUND。