ruby-on-rails 是否有办法限制Liquid Render可以渲染/包括哪些文件

c3frrgcw  于 2023-03-09  发布在  Ruby
关注(0)|答案(1)|浏览(164)

bounty将在5天后过期。回答此问题可获得+100的声誉奖励。Jake McAllister正在寻找来自声誉良好的来源的答案

我想建立一个ruby on rails应用程序,允许终端用户上传他们自己的liquid主题,类似于shopify。
我想将主题中的文件存储在它们自己的文件夹中,并允许使用render和include来拉入其他文件/组件。
渲染Liquid文件时,是否有办法限制渲染的Liquid文件可以访问的文件,例如,将其限制在它所在的目录和任何子目录中。以阻止边缘情况,即有人可以猜测文件夹路径并进入其主题目录之外的其他主题目录?

dvtswwa3

dvtswwa31#

我以前没有使用过liquid,但是代码中有这样的代码:
https://github.com/Shopify/liquid/blob/v5.4.0/lib/liquid/file_system.rb#L46
以下是ab文件夹的快速示例:

require 'liquid'

template = Liquid::Template.new

file_system = Liquid::LocalFileSystem.new('a/')

template.registers[:file_system] = file_system
template.parse(file_system.read_template_file('foo'))

puts template.render
.
├── Gemfile
├── Gemfile.lock
├── a
│   ├── _bar.liquid
│   └── _foo.liquid
├── b
│   └── _other.liquid
└── script.rb
➜ cat a/_foo.liquid
<h1>foo</h1> {% for i in (1..3) %} {{ i }} {% endfor %}

{% render 'bar' %}

{% render '../other' %}
➜ ruby script.rb
<h1>foo</h1>  1  2  3

<h1>bar</h1>  1  2  3

Liquid error: Illegal template name '../other'

相关问题