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="" onclick="alert('XSS')"">" 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 转义的。
【讨论】:
几乎,当变量在属性中使用时它们会转义,但在其他情况下不会转义。因此,只有在以不安全的方式使用时,它们才会“神奇地”转义变量。 您能否突出显示其他示例?<div data=" user_name ">
- 在这种情况下 Shopify 会转义该值。
<div> user_name </div>
- 在这种情况下,Shopify 不会转义该值
我相信两者都在您在问题本身中提到的组合示例中被转义,问题是 " 在 div 内正确显示 - 未转义。跨度>
以上是关于Shopify 如何确保他们的流动模板安全(避免 XSS)?的主要内容,如果未能解决你的问题,请参考以下文章
Shopify - 使主题 Git 存储库和 Live Shopify 站点文件同步的最佳实践