使用busboy从Express应用程序中的bodyParser()迁移?

时间:2015-04-12 20:39:32

标签: javascript node.js file-upload express busboy

作为Nodejs的新手,我直接写了一个简单的应用程序而没有真正阅读好的安全实践。我刚刚发现,对所有路由使用bodyParser()实际上是a bad thing because it allows for DOS attack using multipart files

建议的修复方法是仅根据路径加载特定模块。即,对于multipart文件上传,请使用multipart。对于没有文件上传的常规POST(即文本表单提交),请使用express.json(), express.urlencoded()

或另一种选择是将busboyconnect-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() {});

1 个答案:

答案 0 :(得分:3)

  

[如何]我可以指定哪个路由应该处理多部分数据,哪个不应该?

所有Express'routing methods都允许提供特定于路由的中间件。这包括Router methods

  

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用于读取和解析请求的正文,GET and HEAD requests aren't expected to have

对于此类请求,参数只能在URL中的query-string内传递,Express会自行解析。它们可以通过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" }
});