作为Nodejs的新手,我直接写了一个简单的应用程序而没有真正阅读好的安全实践。我刚刚发现,对所有路由使用bodyParser()
实际上是a bad thing because it allows for DOS attack using multipart files。
建议的修复方法是仅根据路径加载特定模块。即,对于multipart文件上传,请使用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() {});
答案 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" }
});