Вот моя ситуация. Я создаю приложение, которое содержит некоторые тяжелые математические вычисления, где формула должна быть доступна для редактирования достаточно привилегированным, но ненадежным пользователем.Выполнение пользователем на стороне сервера
Мне нужен безопасный серверный скриптовый язык. Мне нужно иметь доступ к константам и значениям из таблиц базы данных 4+, результаты предыдущих вычислений, определять пользовательские переменные и функции, использовать выражения if/then/else, и я уверен, что я не могу думать о правильном Теперь.
Некоторые опции я Рассмотренные:
Я рассмотрел использовать что-то вроде this matheval library, но я бы в конечном итоге нужно продлить его значительно для моего использования. По существу я бы создал свой собственный язык.
PHP runkit sandbox. Я никогда не использовал это раньше, но я очень обеспокоен проблемами безопасности. Учитывая возможные проблемы с безопасностью, я не думаю, что это жизнеспособный вариант.
Еще одна идея, которая пришла мне в голову, что я не знаю, возможно ли это, использовать на сервере что-то вроде javascript. Я видел, что js используется в качестве платформы сценариев в настольных приложениях для расширения функциональности, и похоже, что подобный подход может быть осуществим. Я мог бы в идеале определить среду, в которой все это выполнялось, например, отключить доступ к файловой системе и т. Д. Опять же, безопасность кажется такой проблемой.
Из исследования, которое я сделал, похоже, что № 1, вероятно, является моим единственным вариантом, но я думал, что я проверил бы с большим пулом талантов. :-)
Если # 3 возможно, кажется, что это будет путь, но я не могу показать ничего полезного. С другой стороны, между № 2 и № 3 не может быть большой разницы.
Производительность - еще одно соображение. Будет около 65 некоторых нечетных формул, каждый из которых будет выполняться около 450 раз. Каждая формула будет иметь доступ к приблизительно 15 уникальным переменным сотню констант и результатам предыдущих формул. (Да, существует конкретный порядок выполнения.)
Я могу работать с асинхронным подходом к вычислению, когда вычисление будет инициировано пользовательским событием и сохранено в db, но предпочтет, что этого не потребуется.
Каков наилучший способ работы с этой ситуацией? Существуют ли какие-либо другие сторонние библиотеки, которые я не обнаружил в своих исследованиях? Есть ли еще один вариант в дополнение к моим 3, который я должен рассмотреть?
Посмотрите узел.js. «Еще одна идея, которая перешла мне на ум, что я не знаю, возможно ли это использовать что-то вроде javascript на стороне сервера». –
@MrSmith Я не знаком с node.js. Не могли бы вы немного объяснить? Из того, что я понимаю в node.js, он полностью сопоставим с PHP. Разве у меня не было бы проблем с безопасностью, связанных с 'eval'? – Icode4food
У symfony2 twig есть набор инструментов DSL, поэтому вы можете создать свой собственный язык легко и на чистом PHP. – hakre