Позвольте мне предвосхитить это, сказав, что я хорошо знаю, что запускать пользовательский код в серверной среде рискованно. Забавьте меня - мой вопрос относится к оценке строк и подмножеству языка, который может быть выполнен в этом контексте.
Итак, я сейчас создаю систему генерации шаблонов и хочу, чтобы она была быстрой. Супер, супер, супер быстро. Эта вещь будет избита за массовые рассылки по электронной почте и тому подобное. Подход, который я использую, заключается в том, чтобы пользователи предоставляли введенные пользователем теги шаблонов, которые перед сохранением превращаются в подстановки переменных PHP через регулярные выражения. Предполагая, что мои регулярные выражения являются пуленепробиваемыми, считаете ли вы, что безопасность этого процесса приемлема?
- шаблон вводится пользователем, с такими тегами, как
[[contact.name]]
и аналогичными.
- после сохранения regex преобразует их в переменные PHP, поэтому вышеуказанный подстановочный знак становится
{$contact['name']}
в строке шаблона.
- Мы также проверяем наличие чего-либо, что может быть преобразовано в доступную переменную из суперглобальной области, поэтому
[[_SERVER]]
, [[GLOBALS]]
и т. Д., А также [[this
все запрещены и регистрируются как попытки взлома.
- Другие символы, имеющие особое значение в строке в двойных кавычках (
$
, "
и \
), также экранируются.
- процесс генерации выглядит следующим образом:
- генерация - это метод класса, который запускается. Единственная передаваемая переменная - это
$contact
, который является массивом.
- строка шаблона считывается в другую локальную переменную (в данном случае
$__templateString
). Теоретически пользователи могут получить доступ к этой переменной в своих шаблонах, но на самом деле не имеет значения, делают ли они - не угроза безопасности, просто глупость.
- Код для генерации шаблона будет просто
eval('return "' . $__templateString . '";');
Есть ли здесь какие-нибудь дыры, которые мне не хватает? Я почти уверен, что единственными потенциальными рисками являются вопросы доступа к области, и я думаю, что я охватил все свои базы там.