【问题标题】:How does Shopify make their liquid templates safe (avoid XSS)?Shopify 如何确保他们的流动模板安全(避免 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 }}

谢谢

【问题讨论】:

    标签: ruby-on-rails xss shopify liquid


    【解决方案1】:

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

    【讨论】:

    • 几乎,当变量在属性中使用时它们会转义,但在其他情况下不会转义。因此,只有在以不安全的方式使用时,它们才会“神奇地”转义变量。
    • 您能否突出显示其他示例?
    • &lt;div data="{{ user_name }}"&gt; - 在这种情况下 Shopify 会转义该值。
    • &lt;div&gt;{{ user_name }}&lt;/div&gt; - 在这种情况下,Shopify 不会转义该值
    • 我相信两者都在您在问题本身中提到的组合示例中被转义,问题是 " 在 div 内正确显示 - 未转义。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 2012-07-10
    • 2013-06-24
    相关资源
    最近更新 更多