0

Nodejs の初心者である私は、優れたセキュリティ プラクティスを実際に読むことなく、単純なアプリの作成に飛びつきました。bodyParser()マルチパート ファイルを使用した DOS 攻撃が可能になるため、すべてのルートを使用することは実際には悪いことであることがわかりました。

推奨される修正方法は、ルートに応じて特定のモジュールのみをロードすることです。つまり、マルチパート ファイルのアップロードの場合は、 を使用しますmultipart。ファイルのアップロードを伴わない通常の POST (つまり、テキスト フォームの送信) の場合は、 を使用しますexpress.json(), express.urlencoded()

または、 busboy をconnect-busboyとともに使用することもできます。しかし、私が混乱しているのは、マルチパート データを処理する必要があるルートと処理しないルートを指定する方法です。そうでなければ、私は と同じ問題を抱えていませんか?bodyParser

さらに、busboyドキュメントはそれが処理しないと言いますGET

If you find that req.busboy is not defined in your code when you expect it to be, check that the following conditions are met. If they are not, req.busboy won't be defined:
  1. The request method is not GET or HEAD

paramsそのため、 で解析する方法についてさらに混乱していGETます。bodyParserでデータにアクセスできるように、これを行うと思いますreq.params

たとえば、次の単純なアプリでからbodyParser()に移行するにはどうすればよいですか。busboy/connect-busboy

var express = require('express');
var app = express();
var http = require('http').Server(app);

var bodyParser = require('body-parser');
app.use(bodyParser.json());

var busboy = require('connect-busboy');
app.use(busboy());

// How to use busboy to prevent multipart files here?
app.post("/form_data_no_fileupload", function(req, res) {
    var somedata = req.body.somedata;
});

// Use busboy to handle both regular form data + fileuploads 
app.post("/form_data_AND_fileupload", function(req, res) {

});

// What would handle GET without bodyparser?
app.get("/get_something", function(req, res) {
    var params = req.params;
});

http.listen(3000, function() {});
4

1 に答える 1

3

[方法] マルチパート データを処理するルートと処理しないルートを指定できますか?

Express のすべてのルーティング方法で、ルートに固有のミドルウェアを提供できます。これにはRouterメソッドが含まれます。

app.METHOD(path, callback [, callback ...])

個々のルートに期待される本文に応じて、異なるモジュールを使用してそれぞれを処理できます (アプリケーション全体に適用するのではなくapp.use())。

var express = require('express');
var app = express();
var http = require('http').Server(app);

var bodyParser = require('body-parser');
var busboy = require('connect-busboy');

app.post("/form_data_no_fileupload",
    bodyParser.urlencoded(),
    function(req, res, next) {
        // check that the request's body was as expected
        if (!req.body) return next('route'); // or next(new Error('...'));

        // ...
    });

app.post("/form_data_AND_fileupload",
    busboy({
        limits: {
            fileSize: 10 * 1024 * 1024
        }
    }),
    function(req, res, next) {
        // check that the request's body was as expected
        if (!req.busboy) return next('route'); // or next(new Error('...'));

        // ...
    });

// ...

さらに、busboy docs は、GET を処理しないと述べています。

paramsそのため、 で解析する方法についてさらに混乱していGETます。

Busboy と BodyParser は、リクエストの本文を読み込んで解析するように設計GETHEADれています。

このようなリクエストの場合、パラメーターは、Express 自体が解析する URL 内のクエリ文字列内でのみ渡すことができます。から入手できますreq.query

app.get('/get_something', function () {
    console.log(req.originalUrl);
    // "/get_something?id=1

    console.log(req.query);
    // { id: "1" }
});

req.paramsルートによってパスで一致したプレースホルダーを表します。これらは、方法に関係なく、どのルートでも使用できます。

app.get('/thing/:id', function (req, res) {
    console.log(req.originalUrl);
    // "/thing/2"

    console.log(req.params);
    // { id: "2" }
});
于 2015-04-12T21:03:41.777 に答える