我有这个代码:
const implementation = async (req, res, next) => {
const rut = req.user && 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 行中给了我一个安全错误:
应用程序的异步在“我的文件”的第 3 行处通过发送将不受信任的数据嵌入到生成的输出中。这些不受信任的数据未经适当的清理或编码就直接嵌入到输出中,从而使攻击者能够将恶意代码注入到输出中。
攻击者只需在用户输入正文中提供修改后的数据即可更改返回的网页,该数据由“我的文件”第 3 行的异步方法读取。然后,该输入直接通过代码流向输出网页,无需进行清理。
这可能会引发反射跨站脚本 (XSS) 攻击。
如何避免该安全问题?
我尝试过:
const data = JSON.parse(decodeURIComponent(encodeURIComponent(req.body)));
错误随着
encodeURIComponent
函数消失,但这没有意义。有什么提示吗?
现在功能齐全,原来的那个有错误,我必须“编码”或其他东西来避免错误。
说真的,我不知道为什么,但这有效:
const implementation = async (req, res, next) => {
const rut = req.user && 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);
};
执行并恢复两件事(encodeURI 和 stringify)有点愚蠢,但 Codegate 现在不会提醒我错误。我很想知道为什么会出现错误