2017-01-16 8 views
1

Я новичок в Crystal (и никогда не использовал рубин), поэтому приношу извинения за незнание здесь! Я посмотрел на ecr docs, но, похоже, не нашел ответа.Встроенные переменные кристалла в шаблонах

Я ищу использование встроенного кристалла для динамических шаблонов в Kemal. Могу ли я подтвердить - могут ли шаблоны отображать только переменные, доступные в области вызова, или же можно вызвать вызовы метода/функции из самого шаблона? И.Е. есть ли вероятность/риск возможности выполнить «вредоносный» хрустальный код из шаблона (в этом случае вредоносное относится к вводу-выводу или доступу к файлам и т. д.)?

Возьмем пример из документации Кемаль:

get "/:name" do |env| 
    name = env.params.url["name"] 
    render "src/views/hello.ecr" 
end 

По мнению hello.ecr - это name единственный элемент, который будет доступен в шаблоне, или может один вызов File.delete("./foo") в шаблоне, например?

ответ

1

Шаблон скомпилирован в код Crystal, вы можете написать любой код, например File.delete("./foo"), например, если вы напишете <% File.delete("./foo") %> внутри вашего шаблона.

Если вы беспокоитесь, что name будет содержать код, который каким-то образом будет выполнен, то не беспокойтесь, это не произойдет. Выполнение динамического исполнения во время выполнения Crystal невозможно, поэтому некому вводить вредоносный код в ваши шаблоны.

+0

Благодарим @asterite за ваш быстрый ответ. Моя проблема заключается не столько в том, что переменные будут содержать код, а в том, что я искал решение для синтаксического анализа внешних шаблонов html, которые я могу/не знаю заранее, и хотел бы избежать любой возможности выполнения код за базовыми переменными и структурами управления (если, кроме того, если есть и т. д.), если это возможно. – corkington

+0

[Этот фрагмент] (https://groups.google.com/forum/#!topic/crystal-lang/jX_dRFSdh78), хотя он довольно старый, детали, которые я искал: «Проще было бы решить проблему есть система шаблонов, в которой вы не можете выполнить произвольный код. У вас может быть if, else, своего рода для итерации, и это все. Тогда во время выполнения вы могли бы интерпретировать этот шаблон, я думаю. Вы передали бы объект этому шаблону Это может быть хэш, содержащий значения, или, может быть, struct ... » Я ценю, что для этого потребуется интерпретация времени выполнения, но этого было бы достаточно для этого конкретного случая. Есть идеи? – corkington

+0

@corkington с ECR нет абсолютно никакого способа выполнить произвольный код, потому что выполнение исполнения произвольного кода невозможно в Crystal – asterite