Извлечение переменной из шаблона веточки, сохраненного в базе данных. Twig, PHP / Symfony - PullRequest
1 голос
/ 09 июля 2020

Я работаю над системой шаблонов электронной почты. Сценарий: в текстовом поле пользователь составляет шаблон электронной почты, он может использовать текст и ветку, чтобы он мог использовать циклы, блоки условий, переменные и т. Д. c. Затем пользователь сохраняет шаблон в базе данных. Перед этим шаблон проверяется с точки зрения структуры ветки. Затем мы можем загрузить шаблон из базы данных (строку), извлечь все необходимые переменные и в качестве сервиса для него. После того, как служба вернет все необходимые переменные, я вставляю их в шаблон и отправляю электронное письмо.

Например, шаблон может выглядеть так

Hello {% if gender == 'm' %}Ms.{% else %}Mrs.{% endif% } {{name}}

Bla bla bla {{variable}} bla bla bal {{variable2}}

Итак, в основном я хочу извлечь все имена переменных из строка.

Я могу создать шаблон веточки прямо из базы данных:

$template = $this->twig->createTemplate($templateFromDatabase);

Я могу получить токены

$tokens = $twig->tokenize($source);

но это не говорит мне какие токены являются переменными

Наконец, я могу проанализировать его и go через структуру и извлечь переменные.

$parsed = $twig->parse($tokens);

Но, возможно, есть более простой способ получить все имена переменных из шаблон. Кроме того, знаете ли вы, как проверить шаблон ветки перед сохранением в базе данных? может использовать PHP функции веточки

Или, может быть, уже есть пакет или что-то в этом роде (я ничего не нашел) Заранее спасибо

1 Ответ

0 голосов
/ 09 июля 2020

Хорошо, tl; dr: используйте расширение Sandbox , максимально ограничьте возможности пользователя. НЕ анализируйте шаблон, чтобы определить, какие переменные используются, ВЫ определяете доступные переменные, а затем предоставляете их, когда пришло время визуализировать шаблон. Не доверяйте себе писать «тесты», которые определяют, безопасен ли шаблон. (Внесение в черный список ошибочно, закрытие «дыр» - это бесконечная битва, если программное обеспечение - сыр.) Twig позволяет хранить переменные, макросы и циклы. Это означает, что вы можете вызвать бесконечные циклы, исчерпание памяти и другие вещи, которые вы не хотите, чтобы пользователь мог вызвать.

Теперь я могу полностью понять, где вы исходящий из, предоставляя пользователю возможность настраивать электронные письма с помощью шаблона. Но выходить за рамки if - это безумие.

Вместо этого вам следует использовать расширение песочницы , чтобы ограничить возможности пользователя и четко определить, что доступно пользователю . И наоборот. А затем вы просто указываете эти переменные. Не по запросу или что-то в этом роде. Просто предоставьте их и покончите с этим. Любой лог c, который может показаться вам привлекательным, вероятно, ошибочен. Это связано с безопасностью или, по крайней мере, с производительностью, и вы должны сделать это правильно.

Есть причина, по которой почти каждая опция шаблонов, доступная пользователям, предписывает, какие ключевые слова / заполнители / конструкции могут использоваться. Эта причина - безопасность и здравомыслие. Не будьте тем парнем, который должен объяснять, почему вашей компании «нужно больше серверов», потому что те, которые у вас есть, постоянно ломаются или забиты.

Если вы хотите убедиться, что шаблон в порядке: используйте его в песочнице . Используйте команду try-catch для анализа шаблона и визуализации некоторых переменных по умолчанию. Вы их предоставляете, так что это не должно быть проблемой. Если возникает исключение, передайте его пользователю разумным образом.

Не позволяйте недопустимым шаблонам попадать в производственный код. Всегда используйте песочницу для кода шаблона, предоставленного пользователем. Без исключений. Не доверяйте пользователю. Всегда. Пользователь в лучшем случае глуп, а в худшем - откровенно злонамерен. Оба вызовут проблемы.

...