gpt4 book ai didi

file-upload - 何时检查 node.js 上传脚本中的文件大小/mimetype?

转载 作者:可可西里 更新时间:2023-11-01 16:45:12 25 4
gpt4 key购买 nike

我使用 express/formidable 在 node.js 中创建了一个上传脚本。它基本上可以工作,但我想知道何时何地检查上传的文件 e。 G。对于最大文件大小或文件的 mimetype 是否实际允许。

我的程序是这样的:

app.post('/', function(req, res, next) {
req.form.on('progress', function(bytesReceived, bytesExpected) {
// ... do stuff
});

req.form.complete(function(err, fields, files) {
console.log('\nuploaded %s to %s', files.image.filename, files.image.path);
// ... do stuff
});
});

在我看来,检查 mime 类型/文件大小的唯一可行位置是 complete 事件,在该事件中我可以可靠地使用文件系统函数来获取 中上传文件的大小/tmp/ – 但这似乎不是一个好主意,因为:

  • 可能是恶意的/太大的文件已经上传到我的服务器上
  • 用户体验很差——你看到上传进度后却被告知上传失败了

实现这个的最佳实践是什么?我在 node.js 中找到了很多文件上传示例,但似乎没有一个可以执行我需要的安全检查。

最佳答案

在 Node IRC 和 Node 邮件列表的一些人的帮助下,这是我所做的:

我正在使用 formidable 来处理文件上传。使用 progress 事件,我可以像这样检查最大文件大小:

form.on('progress', function(bytesReceived, bytesExpected) {
if (bytesReceived > MAX_UPLOAD_SIZE) {
console.log('### ERROR: FILE TOO LARGE');
}
});

可靠地检查 mime 类型要困难得多。基本想法是使用 progress 事件,然后如果上传了足够的文件,请使用 file --mime-type 调用并检查该外部命令的输出。简化后看起来像这样:

// contains the path of the uploaded file, 
// is grabbed in the fileBegin event below
var tmpPath;

form.on('progress', function validateMimetype(bytesReceived, bytesExpected) {
var percent = (bytesReceived / bytesExpected * 100) | 0;

// pretty basic check if enough bytes of the file are written to disk,
// might be too naive if the file is small!
if (tmpPath && percent > 25) {
var child = exec('file --mime-type ' + tmpPath, function (err, stdout, stderr) {
var mimetype = stdout.substring(stdout.lastIndexOf(':') + 2, stdout.lastIndexOf('\n'));

console.log('### file CALL OUTPUT', err, stdout, stderr);

if (err || stderr) {
console.log('### ERROR: MIMETYPE COULD NOT BE DETECTED');
} else if (!ALLOWED_MIME_TYPES[mimetype]) {
console.log('### ERROR: INVALID MIMETYPE', mimetype);
} else {
console.log('### MIMETYPE VALIDATION COMPLETE');
}
});

form.removeListener('progress', validateMimetype);
}
});

form.on('fileBegin', function grabTmpPath(_, fileInfo) {
if (fileInfo.path) {
tmpPath = fileInfo.path;
form.removeListener('fileBegin', grabTmpPath);
}
});

关于file-upload - 何时检查 node.js 上传脚本中的文件大小/mimetype?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8623531/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com