0

ノードに慣れるのに役立つ基本的なブログプラットフォームを作成しようとしています。フレームワークとして Express を使用し、レンダリング エンジンとして ejs を使用しています。ホームページに、最近の 10 件のブログを表示したいと考えています。これまでのところ、私は持っています:

"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 はプレーン テキストとして解釈されるため、

AwesomeBlog!

<h4>Hi</h4> <p>test 123</p> <h4>Awesome title</h4> <p>Awesome text</p> <h4>FIRST</h4> <p>POST!</p> Admin section

この場合、これを修正するにはどうすればよいですか?

私がやろうとしていることのベストプラクティスは何ですか?

4

1 に答える 1

2

これは、EJS に組み込まれた安全機能です。これにより、ユーザーが JavaScript エクスプロイト (XSS) を含む html をページに埋め込むことができなくなります。(フォーム リクエストなどで安全でない文字列を送信することはできますが、テンプレートはブラウザーの悪用を防ぐためにそれをエスケープします。)

オフにするには (信頼できる HTML コンテンツの場合):

Escapes html by default with <%= code %>
Unescaped buffering with <%- code %>

テンプレートのタグを次のように切り替えるだけです。

<h4><%= title %></h4>
<p><%- content %></p>
于 2012-11-11T20:03:13.130 に答える