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="" onclick="alert('XSS')"">" 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 转义了。
如果以不安全的方式使用值,Shopify 会自动转义值,但我没有在 liquid gem 中找到此功能。
示例:
模板: <div data="{{ user_name }}">{{ user_name }}</div>
user_name: '" onclick="alert(\'XSS\')'
Shopify 将其呈现为:
<div data="" onclick="alert('XSS')"">" 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 转义了。