Intereting Posts
Требуются ли скобки в PSR-2 PHP-синтаксисе? Как установить цену скидки для всех продуктов в глобальном масштабе в opencart каковы недостатки, нужно заботиться о загрузке файла Используя документ PHP DOM, выберите элемент HTML по его классу и получите его текст. Вызов cron дважды или три раза Отправлять сообщения FCM с серверной части на устройство Android График потока приложений PHP (или график вызовов функций) Хорошая библиотека флексирования для PHP? PHP7 method_exists Неисправность Ошибка: имя функции должно быть строкой Почему мои веб-страницы увеличиваются, когда я открываю их в Opera Mobile? сортировка значения массива без использования встроенных php, таких как sort () и т. д. Как я могу получить бесконечное максимальное время выполнения с PHP? Как преобразовать временную метку LDAP в временную метку Unix Рекурсивная замена переменных PHP MAMP / Symfony: MAMP переопределяет параметр date.timezone от php.ini, Symfony не работает

Выполнить PHP-код с ограничениями

У нас есть редактор CMS, в котором php разрешено использовать внутри него, однако нам нужно ограничить доступ некоторыми командами, такими как file_get_contents, file () и global.

Может ли кто-нибудь помочь мне с регулярным выражением с булевым ответом? Текст из шаблона сохраняется в строке.

Я знаю, вероятно, не идеальный метод для этого, но это все, что я могу придумать сейчас 🙂

То, что вы хотите сделать, практически невозможно. Очень сложно защитить себя от атак, если вы разрешаете людям выполнять код на вашем компьютере.

Вот попытка, которую я использовал: Песочница . Исходный код .

То, что он делает, в основном поддерживает большой список вложенных в черный список функций для доступа к файловой системе, доступа к оболочке, aso (я разрешил некоторые функции для чтения файловой системы, такой как show_source которая не должна быть разрешена, если вы хотите использовать ее для чего-то реального).

Он также пытается защитить от более скрытых атак, таких как $func = 'unlink'; $func(__FILE__); $func = 'unlink'; $func(__FILE__); превратив его в $func = 'unlink'; ${'___xyz'.!$___xyz=Sandbox::checkVarFunction($func)}(__FILE__) $func = 'unlink'; ${'___xyz'.!$___xyz=Sandbox::checkVarFunction($func)}(__FILE__) aso

PS: Тем не менее вы, вероятно, не хотите, чтобы люди запускали PHP-код на вашем сайте. Риск слишком велик. Вместо этого я бы позволил людям использовать язык шаблонов внутри редактора. Хорошим кандидатом будет Twig , потому что у него есть встроенная песочница, которая позволяет вам ограничить использование определенных тегов, функций, …

Это будет очень сложно защитить себя.

Как я вижу, у вас есть несколько вариантов:

  1. Найдите предопределенные строки, которые не разрешены в вашем контенте (например, file_get_contents), и отобразите сообщение об ошибке, в котором говорится, что пользователь не может сохранить из-за этого. Это, однако, приведет к «взломам», в результате чего вы сможете найти все возможные символы, например () которые могут быть действительны в некоторых случаях.

  2. Используйте token_get_all и попытайтесь проанализировать содержимое как PHP. Затем вы можете пропустить весь исходный код, токен с помощью токена и посмотреть, не найден ли маркер, который вы не принимаете.

  3. Для этого напишите свой собственный язык или DSL. Этот язык должен быть способен выполнять именно то, что вы хотите. В зависимости от ваших требований это может быть самым простым и удобным способом.

Для этого вы можете использовать preg_match . Использование:

 if(preg_match("#(file_get_contents|file)\(#i",$text))