#javascript #xss #sanitization
Вопрос:
У меня есть этот код:
const implementation = async (req, res, next) => {
const rut = req.user amp;amp; req.user.nickname.toUpperCase();
const data = req.body; // ERROR !!!
if (!rut || !data) res.send(400, {message: 'Error al recibir los datos'});
let MetaData = await UserMetadata.findOneAndUpdate({rut}, {emergencyContact: data}, {new: true});
if (!MetaData) res.send(400, {message: 'Ha ocurrido un error'});
return res.send(200, MetaData);
};
Codegate выдает мне ошибку безопасности в строке 3:
Асинхронное приложение вставляет ненадежные данные в сгенерированный вывод с помощью send в строке 3 «мой файл». Эти ненадежные данные внедряются прямо в выходные данные без надлежащей очистки или кодирования, что позволяет злоумышленнику вводить вредоносный код в выходные данные.
Злоумышленник сможет изменить возвращенную веб-страницу, просто предоставив измененные данные в теле ввода пользователя, которое считывается асинхронным методом в строке 3 «мой файл». Затем эти входные данные проходят через код прямо на выходную веб-страницу без очистки.
Это может привести к отраженной атаке межсайтового скриптинга (XSS).
Как можно избежать этой проблемы безопасности?
Я пытался с:
const data = JSON.parse(decodeURIComponent(encodeURIComponent(req.body)));
Ошибка исчезает вместе с encodeURIComponent
функциями, но в этом нет смысла. Есть какие-нибудь намеки?
РЕДАКТИРОВАТЬ: Теперь полная функция, исходная, в которой есть ошибка, и я должен «закодировать» или что-то еще, чтобы избежать ошибки.
Комментарии:
1. С чем ты это делаешь
data
?2. Я должен спросить… почему вы кодируете, а затем сразу же декодируете его? В чем смысл этой линии? Почему ты делаешь это вместо того, чтобы просто
const data = req.body
?3. Было бы полезно, если бы вы могли опубликовать полную функцию или, по крайней мере, показать, что с ней делается
data
.4.
const data = req.body
далее следуетawait UserMetadata.findOneAndUpdate({rut}, {emergencyContact: data}, {new: true});
, что вы напрямую принимаете пользовательские данные и используете их без какой-либо очистки или проверки. Пользовательские данные всегда следует рассматривать как ненадежные . Данные клиента всегда не заслуживают доверия . Затем вы возвращаете результат этой операции пользователю. Поэтому, если ненадежные данные , которые вы только что вставили в свою базу данных, были плохими, вы возвращаете те же данные клиенту. Будет ли это представлять собой XSS, будет зависеть от того, но это определенно опасно.5. Я не знаю, что и как проверяет Codegate. Я могу только предположить, что он думает, что вы безопасно обработали данные после выполнения кодирования/декодирования и строкового анализа/анализа. Имейте в виду, что эти инструменты довольно сложны для поиска потенциальных проблем, но их также легко обмануть, поскольку у них есть предел для их рассуждений. Получение ложных срабатываний и ложных негативов не является чем-то неслыханным. Это не постоянное явление, но оно случается достаточно часто, так что я не удивлен.
Ответ №1:
Серьезно, я не знаю почему, но это работает:
const implementation = async (req, res, next) => {
const rut = req.user amp;amp; req.user.nickname.toUpperCase();
const data = encodeURIComponent(JSON.stringify(req.body));
if (!rut || !data) res.send(400, {message: 'Error al recibir los datos'});
let MetaData = await UserMetadata.findOneAndUpdate(
{rut}, {emergencyContact: JSON.parse(decodeURIComponent(data))}, {new: true}
);
if (!MetaData) res.send(400, {message: 'Ha ocurrido un error'});
return res.send(200, MetaData);
};
Довольно глупо делать и возвращать 2 вещи: encodeURI и stringify, но Codegate теперь не предупредит меня об ошибке. Я хотел бы знать, почему произошла ошибка