如何阻止 DustJS 将实体转换回普通字符?
How can I stop DustJS converting entities back to normal characters?
要重现我的问题,请转到 here,然后将此代码粘贴到相应的部分:
灰尘模板:
{title|s}
数据:
{
"title": "<script>alert('yo');</script>"
}
您将看到以下输出:
<script>alert('yo');</script>
在我看来这是错误的行为,因为实体被转换回普通字符。这导致 alert
被执行。
我想控制我插入到模板中的值是否通过 JS HTML-转义。所以 Dust JS 不应该在背后做任何智能操作,而只是将我想要的内容准确地提供给模板。我怎样才能做到这一点?
|s
似乎代表抑制图书馆完成的任何额外转义例程。由于您已经输入了转义 HTML 的数据,因此它会准确地吐出您提供的内容。浏览器将其呈现为 <script>alert('yo');</script>
,但在幕后它仍然是 <script>alert('yo');</script>
由于您的字符串已经转义,因此未执行任何警报:
var data = {
"title": "<script>alert('yo');</script>"
};
//innerHTML version
var src = document.getElementById('template-s').textContent;
var compiled = dust.compile(src, 'output-s');
dust.loadSource(compiled);
dust.render('output-s', data, function(err, out) {
document.getElementById('output-s').innerHTML = out;
});
// textContent version
src = document.getElementById('template-s-textContent').textContent;
compiled = dust.compile(src, 'output-s-textContent');
dust.loadSource(compiled);
dust.render('output-s-textContent', data, function(err, out) {
document.getElementById('output-s-textContent').textContent = out;
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/dustjs-linkedin/2.7.3/dust-full.js"></script>
<script type="text/dust" id="template-s">Output {title|s}</script>
<script type="text/dust" id="template-s-textContent">Output {title|s}</script>
<h3>Flag: |s set as innerHTML</h3>
<div id="output-s"></div>
<h3>Flag: |s set as textContent</h3>
<div id="output-s-textContent"></div>
This article 似乎比官方文档更好地解释了过滤器。他的示例有一个未转义的字符串,说明何时根据您使用的标志执行警报。
要重现我的问题,请转到 here,然后将此代码粘贴到相应的部分:
灰尘模板:
{title|s}
数据:
{
"title": "<script>alert('yo');</script>"
}
您将看到以下输出:
<script>alert('yo');</script>
在我看来这是错误的行为,因为实体被转换回普通字符。这导致 alert
被执行。
我想控制我插入到模板中的值是否通过 JS HTML-转义。所以 Dust JS 不应该在背后做任何智能操作,而只是将我想要的内容准确地提供给模板。我怎样才能做到这一点?
|s
似乎代表抑制图书馆完成的任何额外转义例程。由于您已经输入了转义 HTML 的数据,因此它会准确地吐出您提供的内容。浏览器将其呈现为 <script>alert('yo');</script>
,但在幕后它仍然是 <script>alert('yo');</script>
由于您的字符串已经转义,因此未执行任何警报:
var data = {
"title": "<script>alert('yo');</script>"
};
//innerHTML version
var src = document.getElementById('template-s').textContent;
var compiled = dust.compile(src, 'output-s');
dust.loadSource(compiled);
dust.render('output-s', data, function(err, out) {
document.getElementById('output-s').innerHTML = out;
});
// textContent version
src = document.getElementById('template-s-textContent').textContent;
compiled = dust.compile(src, 'output-s-textContent');
dust.loadSource(compiled);
dust.render('output-s-textContent', data, function(err, out) {
document.getElementById('output-s-textContent').textContent = out;
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/dustjs-linkedin/2.7.3/dust-full.js"></script>
<script type="text/dust" id="template-s">Output {title|s}</script>
<script type="text/dust" id="template-s-textContent">Output {title|s}</script>
<h3>Flag: |s set as innerHTML</h3>
<div id="output-s"></div>
<h3>Flag: |s set as textContent</h3>
<div id="output-s-textContent"></div>
This article 似乎比官方文档更好地解释了过滤器。他的示例有一个未转义的字符串,说明何时根据您使用的标志执行警报。