У нас есть редактор 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 , потому что у него есть встроенная песочница, которая позволяет вам ограничить использование определенных тегов, функций, …
Это будет очень сложно защитить себя.
Как я вижу, у вас есть несколько вариантов:
Найдите предопределенные строки, которые не разрешены в вашем контенте (например, file_get_contents), и отобразите сообщение об ошибке, в котором говорится, что пользователь не может сохранить из-за этого. Это, однако, приведет к «взломам», в результате чего вы сможете найти все возможные символы, например ()
которые могут быть действительны в некоторых случаях.
Используйте token_get_all и попытайтесь проанализировать содержимое как PHP. Затем вы можете пропустить весь исходный код, токен с помощью токена и посмотреть, не найден ли маркер, который вы не принимаете.
Для этого напишите свой собственный язык или DSL. Этот язык должен быть способен выполнять именно то, что вы хотите. В зависимости от ваших требований это может быть самым простым и удобным способом.
Для этого вы можете использовать preg_match . Использование:
if(preg_match("#(file_get_contents|file)\(#i",$text))