我正在尝试创建一个基本的博客平台,以帮助我了解节点。我使用Express作为框架,ejs作为我的渲染引擎。在我的主页上,我想显示最近十个博客。到目前为止,我有:
"use strict";
var mongo = require("mongodb")
, server = new mongo.Server("localhost", mongo.Connection.DEFAULT_PORT, {auto_reconnect: true, safe:true})
, mdb = new mongo.Db("blog", server)
, querystring = require("querystring")
, express = require('express')
, app = express();
app.configure(function() {
app.set('view engine', 'ejs');
});
module.exports = {
home: function home(req, res) {
var blogs;
//Load blogs from db
mdb.open(function(err, db) {
db.collection("blogs", function(err, collection) {
var stream = collection.find({}, {"limit": 10, "sort": {"created": -1}}).stream();
stream.on("data", function(item) {
app.render('blogItem', {title: item.title, content: item.content}, function(err, html) {
if(err) { console.error(err); return; }
blogs += html;
});
});
//Render the finished page
stream.on("end", function() {
res.render('home', {title: "AwesomeBlog", content: blogs});
db.close();
});
});
});
}
};
ejs文件:
home.ejs
<!DOCTYPE html>
<head>
<title><%= title %></title>
</head>
<body>
<h1><%= title %>!</h1>
<%= content %>
<a href="/admin">Admin section</a>
</body>
blogItem.ejs
<h4><%= title %></h4>
<p><%= content %></p>
虽然这在技术上“有效”,但渲染的HTML per-blog被解释为纯文本,从而产生
AwesomeBlog!
<h4>Hi</h4> <p>test 123</p> <h4>Awesome title</h4> <p>Awesome text</p> <h4>FIRST</h4> <p>POST!</p> Admin section
在这种情况下如何解决这个问题?
我正在尝试做什么的最佳做法是什么?
答案 0 :(得分:2)
这是EJS内置的安全功能。它会阻止您的用户在您的网页中嵌入包含javascript漏洞利用(XSS)的html。 (他们仍然可以在表单请求等中提交不安全的字符串,但是您的模板会将其转义以防止浏览器漏洞利用。)
要关闭它(对于您可以信任的HTML内容):
Escapes html by default with <%= code %>
Unescaped buffering with <%- code %>
只需在模板中切换标签,如下所示:
<h4><%= title %></h4>
<p><%- content %></p>