无法渲染原始html

问题描述 投票:0回答:2

我正在尝试作为ajax响应返回原始html,这是返回响应的函数:

res.render('partial/messages', {
        successMsg: 'An email has been sent to you.' +
            '<a href="' + req.headers.host + '/user/resendToken?email=' + user.email + '">Send Again.</a>',
        layout: false
    }, function (err, list) { 
        res.set('Content-Type', 'text/html');
        res.status(200).send({ msg: list }); 
    });

局部视图message包含以下内容:

<% if(successMsg != ''){ %>
<div class="alert alert-success alert-dismissible fade show" role="alert">
    <%= successMsg %>
    <button type="button" class="close" data-dismiss="alert" aria-label="Close">
        <span aria-hidden="true">&times;</span>
    </button>
</div>
<% } %>

ajax响应是:

" 
<div class="alert alert-success alert-dismissible fade show" role="alert">
    An email has been sent to you.`&lt;a href=&#34;127.0.0.1:3000/user/[email protected]&#34;&gt;Send Again.&lt;/a&gt;`
    <button type="button" class="close" data-dismiss="alert" aria-label="Close">
        <span aria-hidden="true">&times;</span>
    </button>
</div>
  "

为什么<a href标签是渲染&alt;

我该如何解决这个问题?

node.js express ejs
2个回答
1
投票

&alt;是与<对应的HTML实体。这用于防止代码注入。

当您使用<%= something %>语法包含字符串时,EJS正在进行转换。

要防止它,请使用<%- something %>语法。

请记住,不转义这些字符可能会使您的服务暴露于XSS攻击。


1
投票

因为<%= ... %>逃脱了HTML。如果您确定可以信任user.email和其他用户生成的数据,则可以使用<%- successMsg %>代替,这不会逃脱HTML。

您可以在Docs section of EJS here中阅读有关标签的更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.