渲染<作为文本而不是<或者>因为它不是>在jquery模板中

时间:2013-03-27 09:47:32

标签: jquery asp.net-mvc-3 jquery-templates javascript-injection

我有一个文本&lt;script&gt;alert('injection');&lt;/script&gt;,我希望它在视图中呈现,在ASP MVC3应用程序中呈现为jquery模板。但是,&lt;被视为<

我的jquery模板如下:

<script id="nameTemplate" type="text/x-jquery-tmpl">
    <p>${Name}</p>
</script>

我们如何将其呈现为纯文本?

2 个答案:

答案 0 :(得分:1)

正如SpaceBison所暗示的,您的浏览器将解码HTML编码的值并将其写为“纯文本”HTML。

为了将值写出编码,您将有效地对该值进行“双重编码”,因此当浏览器对其进行解码和渲染时,它仍将被编码一次。

如果您的值最初来自ASP.NET MVC模型属性或类似属性(假设基于您的标记),则可以在服务器端代码中使用HttpUtility.HtmlEncode,例如:

Model.Name = HttpUtility.HtmlEncode(Model.Name);

但是,如果您需要在前端执行此操作,则可以编写一个简单的jQuery函数来对值进行编码(从this answer无耻地窃取):

function HtmlEncode(str) {
    return String(str)
        .replace(/&/g, '&amp;')
        .replace(/"/g, '&quot;')
        .replace(/'/g, '&#39;')
        .replace(/</g, '&lt;')
        .replace(/>/g, '&gt;');
}

然后,在将项目添加到容器之前,可以在jQuery中执行以下操作:

Name = HtmlEncode(Name);

要查看它的实际效果:http://jsfiddle.net/Rb2VJ/1/

答案 1 :(得分:0)

要按字面意思获得&amp;,请使用&amp;lt;

$(elem).text("&lt;");也会将其显示为纯文本。

HTML的

$(elem).html("&amp;lt;");

http://jsfiddle.net/yCuZt/