Как безопасно встраивать параметры запроса в javascript ответ от node.js? - PullRequest
0 голосов
/ 14 апреля 2020

Существуют библиотеки, такие как OW ASP java кодер , которые позволяют относительно легко внедрить ненадежный контент в любой контекст. Я ищу что-то, что может сделать это в контексте блока JavaScript, и мне нужно, чтобы оно работало в Node.js.

В частности, я пытаюсь написать маршрут Express, который будет вернуть динамику c JavaScript. Вариант использования выглядит примерно так:

<script src="/my-custom-route?config1=A&config2=B"></script>

Вот очень неправильная, плохая и наивная реализация, которая, надеюсь, поможет нарисовать картину того, что я пытаюсь выполнить sh:

let scriptCache = null;
server.get(
    '/my-custom-route',
    async (req, res) => {
        const config1 = req.query && req.query.config1 ? req.query.config1 : '';
        const config2 = req.query && req.query.config2 ? req.query.config2 : '';

        if (scriptCache === null) {
            scriptCache = await fs.readFile('./data/some-customizable-script.txt', 'utf-8');
        }

        //THIS IS A TERRIBLE BAD IDEA DONT DO THIS
        const embedScript = scriptCache
            .replace(/\$\{config1\}/g, encodeURIComponent(config1))
            .replace(/\$\{config2\}/g, encodeURIComponent(config2));

        res.set('Content-Type', 'application/javascript');
        return res.status(200).send(embedScript);
    }
);

Для целей этой иллюстрации предположим, что содержание some-customizable-script.txt таково:

alert('${config1}');

Легко понять, как выполнить XSS с этой настройкой. Это то место, где я обычно берусь за encode.forJavascript(), но я не могу найти библиотеку, которая реализует этот выходной контекст. Я нашел два, которые кажутся достаточно сложными ( XSS и XSS-Filters ), но, насколько я могу судить, оба нацелены на вывод HTML.

Есть ли надежная библиотека для этого в node.js?

...