evgeniy8705
@evgeniy8705
Повелитель вселенной

Для чего проверять путь к файлу?

Для чего сделала проверка
(!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;
  • Вопрос задан
  • 393 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы