fix: Uploading a file by providing an origin URL allows for Server-Side Request Forgery (SSRF); fixes vulnerability [GHSA-x4qj-2f4q-r4rx](https://github.com/parse-community/parse-server/security/advisories/GHSA-x4qj-2f4q-r4rx) (#9904)
This commit is contained in:
@@ -5,34 +5,8 @@ import Parse from 'parse/node';
|
||||
import Config from '../Config';
|
||||
import logger from '../logger';
|
||||
const triggers = require('../triggers');
|
||||
const http = require('http');
|
||||
const Utils = require('../Utils');
|
||||
|
||||
const downloadFileFromURI = uri => {
|
||||
return new Promise((res, rej) => {
|
||||
http
|
||||
.get(uri, response => {
|
||||
response.setDefaultEncoding('base64');
|
||||
let body = `data:${response.headers['content-type']};base64,`;
|
||||
response.on('data', data => (body += data));
|
||||
response.on('end', () => res(body));
|
||||
})
|
||||
.on('error', e => {
|
||||
rej(`Error downloading file from ${uri}: ${e.message}`);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
const addFileDataIfNeeded = async file => {
|
||||
if (file._source.format === 'uri') {
|
||||
const base64 = await downloadFileFromURI(file._source.uri);
|
||||
file._previousSave = file;
|
||||
file._data = base64;
|
||||
file._requestTask = null;
|
||||
}
|
||||
return file;
|
||||
};
|
||||
|
||||
export class FilesRouter {
|
||||
expressRouter({ maxUploadSize = '20Mb' } = {}) {
|
||||
var router = express.Router();
|
||||
@@ -210,8 +184,6 @@ export class FilesRouter {
|
||||
}
|
||||
// if the file returned by the trigger has already been saved skip saving anything
|
||||
if (!saveResult) {
|
||||
// if the ParseFile returned is type uri, download the file before saving it
|
||||
await addFileDataIfNeeded(fileObject.file);
|
||||
// update fileSize
|
||||
const bufferData = Buffer.from(fileObject.file._data, 'base64');
|
||||
fileObject.fileSize = Buffer.byteLength(bufferData);
|
||||
|
||||
Reference in New Issue
Block a user