0

作为 Nodejs 的新手,我直接开始编写一个简单的应用程序,而没有真正阅读良好的安全实践。我刚刚发现使用bodyParser()所有路由实际上是一件坏事,因为它允许使用多部分文件进行 DOS 攻击

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

或者另一种选择是将busboyconnect-busboy一起使用。但我感到困惑的是如何指定哪个路由应该处理多部分数据,哪个不应该处理?否则,我不会有与 with 相同的问题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

所以,我更加困惑如何paramsGET. 我认为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 文档说它不处理 GET。

所以,我更加困惑如何paramsGET.

Busboy 和 BodyParser 设计用于读入和解析请求的主体,GET并且HEADrequests 不应该有.

对于此类请求,参数只能在 URL 内的查询字符串中传递,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" }
});
于 2015-04-12T21:03:41.777 回答