я имею максима работает на Кот сервер, к которому я обращаюсь, используя PHP.
На моем сайте пользователи могут выполнять команды maxima, которые отправляются на мой сервер Tomcat с помощью php.
Тем не менее, это оставляет меня с проблемой обеспечения безопасности введенного пользователем ввода. Например, я хочу запретить использование опасных функций максимумов, таких как writefile
(среди многих других).
В настоящее время я просто проверяю ввод с помощью php, используя список слов в черном списке, чье появление я проверяю с помощью strpos
, Очевидно, что это совсем не безопасно, потому что пользователь может просто ввести 'write' . 'file' . '()'
вместо writefile()
, таким образом обходя проверку на черные слова.
Я сомневаюсь, что PHP — это то, что я должен использовать, чтобы убедиться, что предоставленный ввод безопасен, поэтому мне интересно, есть ли способ занести в черный список определенные функции INSIDE maxima на моем сервере Tomcat?
IMO, Многоуровневое решение для безопасности — ваш единственный выбор.
Проверяйте пользовательский ввод php столько, сколько сможете. Не забудьте ограничить максимально допустимую длину ввода
Максима с открытым исходным кодом, так что вы можете срывать все «опасные» команды. У меня ограниченные знания lisp, поэтому я не могу сказать, смогут ли пользователи взломать это ограничение.
Поместите своего кота в тюрьму / виртуальную машину.
Я согласен с мнением странного советника о многоуровневой безопасности, и у меня есть несколько идей, чтобы внести свой вклад.
Эти шаги за пределами Maxima, вероятно, наиболее важны:
Эти шаги внутри максимума становятся менее важными, когда покрыты все предыдущие элементы:
:lisp
вход?foo
)Я думаю, что если вы переопределите функции побочных эффектов, вам не нужно беспокоиться о черном списке. Пользователи могут звонить writefile
или что угодно, но это не имеет никакого эффекта. Вы можете переопределить встроенную функцию в Maxima, и ваше новое определение имеет приоритет над встроенной версией. Обратите внимание, что обозначение foo([a]) := ...
Значит это a
это список всех аргументов (любое количество аргументов), поэтому вам не нужно думать о том, сколько аргументов принимает каждая функция.
writefile ([a]) := false;
Для хорошей меры вы также можете удалить встроенную функцию Lisp.
?fmakunbound (writefile);
Увидеть FMAKUNBOUND в Common Lisp Hyperspec.