【问题标题】:Embedded Crystal variables in templating模板中的嵌入式 Crystal 变量
【发布时间】:2017-01-16 11:55:10
【问题描述】:

我是 Crystal 的新手(从未真正使用过 ruby​​),因此对这里的无知表示歉意!我查看了ecr docs,但似乎无法在那里找到答案。

我正在考虑在 Kemal 中将 Embedded Crystal 用于动态模板。我可以确认 - 模板只能呈现调用范围内可用的变量,还是可以从模板本身进行方法/函数调用? IE。是否存在能够从模板中执行“恶意”水晶代码的可能性/风险(在这种情况下,恶意是指 I/O 或文件访问等)?

以 Kemal 文档为例:

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

在视图中hello.ecr - name 是模板中唯一可用的项目,还是可以从模板中调用File.delete("./foo")

【问题讨论】:

    标签: crystal-lang kemal


    【解决方案1】:

    一个模板被编译成水晶代码,你可以在里面写任何类型的代码,比如File.delete("./foo"),例如如果你在你的模板里面写<% File.delete("./foo") %>

    如果您担心name 将包含代码并且会以某种方式执行,那么请不要担心,这不会发生。 Crystal 中的动态运行时代码执行是不可能的,因此不可能有人将恶意代码注入到您的模板中。

    【讨论】:

    • 感谢@asterite 的快速回复。我担心的不是变量会包含代码,而是我正在寻找一种解决方案来解析外部提供的 html 模板(我可能/不会提前知道的内容),并希望避免任何执行的可能性如果可能,代码超出基本变量和控制结构(如果、否则、除非等)。
    • This snippet ,虽然很老,但详细说明了我正在寻找的内容:“一个更简单的解决方案是拥有一个无法执行任意代码的模板系统。如果,否则,你可以有,一种用于迭代的 for 就是这样。然后在运行时你会解释那个模板,我猜。你会把一个对象传递给那个模板。它可以是一个包含值的散列。或者也许是一个结构......“我很感激这将需要运行时解释,但这对于这种特殊情况就足够了。有什么想法吗?
    • @corkington 使用 ECR 绝对无法执行任意代码,因为在 Crystal 中不可能运行时执行任意代码
    • 抱歉,我之前的评论不是很清楚。经过一番调查,我真正想要的是一个类似于 Liquid 的模板引擎。方便的是,A port to crystal 似乎是最近制作的,看起来它提供了我需要的功能。
    • 哦,我想我明白你的意思了。您的应用程序的用户将提供模板,而您无法控制它们?在这种情况下,ECR 和 Liquid(至少不是那个端口)都不会有用,因为它们都在编译时将模板编译为 Crystal 代码。我们仍然缺少一个在运行时执行操作的模板引擎。
    猜你喜欢
    • 2013-05-26
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多