Для чего сделала проверка
(!filePath.startsWith(`${config.publicRoot}${path.sep}`))
? Вроде как автор говорит что якобы это не даст выйти за пределы root, но `${config.publicRoot}${path.sep}` всегда же будет равно одному и тому же пути, даже если попытаться выйти за пределы, например ../../../. Для чего тогда эта проверка?
let url = require(`url`);
let fs = require("fs");
let path = require(`path`);
let config = require(`config`);
let mime = require(`mime`);
let handler = (req, res) => {
let urlParse = url.parse(req.url);
let pathname = urlParse.pathname;
let filePath = path.join(config.publicRoot, pathname);
console.log(pathname); // /page/my.html
console.log(filePath); // C:\Users\iamevg_\Desktop\app\public\page\my.html
console.log(`${config.publicRoot}${path.sep}`); // C:\Users\iamevg_\Desktop\app\public\
if (!filePath.startsWith(`${config.publicRoot}${path.sep}`)) {
res.statusCode = 400;
res.end(`Bye-bye silly hacker!`);
return;
}
let file = fs.ReadStream(filePath);
let write = () => {
let data = file.read();
if (data && !res.write(data)) {
file.removeListener(`readable`, write);
file.once(`drain`, () => {
file.on(`readable`, write);
write();
});
}
};
file.on(`readable`, write);
file.on(`error`, (err) => {
if (err.code === `ENOENT`) {
res.statusCode = 404;
res.end(`404 File Not Found`);
} else {
res.statusCode = 500;
res.end(`500 Server Error`);
}
console.log(err);
});
file.on(`end`, () => {
res.end();
});
res.on(`close`, () => {
file.destroy();
});
};
module.exports = handler;