Nodejs ejs 页面直接显示 html 标签问题
Nodejs ejs 页面直接显示 html 标签问题
发现问题了有个页面是这样写的 <%= post.post %>
2 回复
Nodejs ejs 页面直接显示 HTML 标签问题
在使用 EJS(Embedded JavaScript)模板引擎时,如果你希望页面直接显示 HTML 标签而不是将其作为纯文本处理,你需要使用 <%-
语法而不是 <%=
。EJS 默认会自动转义 HTML 内容以防止 XSS(跨站脚本攻击),但有时你可能需要显示原始的 HTML。
示例代码
假设你有一个简单的 Express 应用,并且你在数据库中存储了一些 HTML 内容,例如:
// app.js
const express = require('express');
const ejs = require('ejs');
const app = express();
app.set('view engine', 'ejs');
app.get('/', (req, res) => {
const post = {
post: '<h1>Hello World</h1>'
};
res.render('index', { post });
});
app.listen(3000, () => console.log('Server is running on port 3000'));
在这个例子中,我们定义了一个简单的 Express 应用,并在根路由 /
上渲染一个 EJS 模板。post
对象包含一个带有 HTML 标签的字符串。
接下来,我们在 views/index.ejs
文件中编写模板代码:
<!-- views/index.ejs -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>EJS Example</title>
</head>
<body>
<!-- 使用 <%- %> 显示原始 HTML -->
<%- post.post %>
<!-- 如果使用 <%= %>,则会将 HTML 转义为纯文本 -->
<!-- <%= post.post %> -->
</body>
</html>
解释
<%-
:这会告诉 EJS 直接输出原始 HTML,而不进行任何转义。<%=
:这是默认的 EJS 语法,它会将输出内容进行 HTML 转义,以防止 XSS 攻击。
如果你希望用户输入的内容能够正确地显示为 HTML,可以使用 <%-
。但是,请务必确保这些内容是可信的,以避免潜在的安全风险。
通过这种方式,你可以根据需要选择合适的语法来显示 HTML 或纯文本。
在使用 EJS 模板引擎时,默认情况下 <%= ... %>
会自动转义 HTML 内容以防止 XSS 攻击。如果你希望直接显示 HTML 标签而不是将其转义为文本,可以使用 <%- ... %>
语法来实现。
示例代码
假设你有一个包含 HTML 的字符串,并且你想在 EJS 页面中直接显示这些 HTML 标签。
后端代码 (Node.js)
const express = require('express');
const app = express();
app.set('view engine', 'ejs');
app.get('/', (req, res) => {
const post = {
post: '<h1>Hello World</h1>'
};
res.render('index', { post });
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
前端模板 (EJS)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>EJS Example</title>
</head>
<body>
<%- post.post %>
</body>
</html>
解释
<%= post.post %>
会将post.post
中的内容作为文本输出,例如<h1>Hello World</h1>
会被显示为<h1>Hello World</h1>
。<%- post.post %>
会将post.post
中的内容作为 HTML 输出,因此<h1>Hello World</h1>
将被解析并显示为一个实际的 HTML 标签,即 “Hello World” 会以标题的形式显示。
注意:使用 <%- ... %>
时要确保输入内容是安全的,避免 XSS 攻击。