Shopify 如何确保他们的流动模板安全(避免 XSS)?

Posted

技术标签:

【中文标题】Shopify 如何确保他们的流动模板安全(避免 XSS)?【英文标题】:How does Shopify make their liquid templates safe (avoid XSS)? 【发布时间】:2017-09-29 11:28:46 【问题描述】:

如果以不安全的方式使用值,Shopify 会自动转义值,但我在 liquid gem 中没有找到此功能。

例子:

模板: <div data=" user_name "> user_name </div>

用户名: '" onclick="alert(\'XSS\')'

Shopify 将其呈现为:

<div data="&quot; onclick=&quot;alert('XSS')&quot;">" onclick="alert('XSS')"</div>

Liquid gem 将其呈现为:

<div data="" onclick="alert('XSS')">" onclick="alert('XSS')"</div>

Ruby 代码:

markup = '<div data=" user_name "> user_name </div>'
template = Liquid::Template.parse(markup)

template.render!('user_name' => '" onclick="alert(\'XSS\')')   

Shopify 是如何做到的?

我知道液体中有escape 过滤器,或者我可以在后端转义值。但是 Shopify 的解决方案看起来更安全:如果忘记对值进行编码,您不会遇到 XSS 漏洞并且代码看起来更干净: value 而不是 value | encode

谢谢

【问题讨论】:

【参考方案1】:

我不确定它是如何“完全完成”的,但在 Shopify 呈现的输出中,似乎 user_name 是 html 转义的。

【讨论】:

几乎,当变量在属性中使用时它们会转义,但在其他情况下不会转义。因此,只有在以不安全的方式使用时,它们才会“神奇地”转义变量。 您能否突出显示其他示例? &lt;div data=" user_name "&gt; - 在这种情况下 Shopify 会转义该值。 &lt;div&gt; user_name &lt;/div&gt; - 在这种情况下,Shopify 不会转义该值 我相信两者都在您在问题本身中提到的组合示例中被转义,问题是 " 在 div 内正确显示 - 未转义。跨度>

以上是关于Shopify 如何确保他们的流动模板安全(避免 XSS)?的主要内容,如果未能解决你的问题,请参考以下文章

Shopify - 使主题 Git 存储库和 Live Shopify 站点文件同步的最佳实践

在 Shopify JSON 模板中添加自定义表单字段

Shopify 应用程序可以在商店主题内自动注入液体代码吗?

Shopify:如何在集合模板上显示特定集合

如何链接到 Shopify 中的自定义模板?

如何在 Shopify 在线商店 2.0 中的一个部分中拥有超过 12 个块?