Shopify 如何使他们的液体模板安全(避免 XSS)?

How does Shopify make their liquid templates safe (avoid XSS)?

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

示例:

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

user_name: '" onclick="alert(\'XSS\')'

Shopify 将其呈现为:

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

液体 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 是如何做到的?

我知道 liquid 中有 escape 过滤器,或者我可以在后端转义值。但是 Shopify 的解决方案看起来更安全:如果忘记对值进行编码并且代码看起来更简洁,则不会出现 XSS 漏洞:{{ value }} 而不是 {{ value | encode }}

谢谢

我不确定它是怎么回事 "exactly done",但在 Shopify 呈现的输出中似乎 user_name 被 html 转义了。