JavaScript, это может включить отраженную атаку межсайтового скриптинга (XSS)

#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 теперь не предупредит меня об ошибке. Я хотел бы знать, почему произошла ошибка