MERN应用程序(nodemailer)中的内容安全策略错误



我正在开发MERN应用程序,一个Blogify。我创建了一个注册并登录;忘记密码";使用nodemailer执行操作。

我可以在开发环境和生产环境中成功地发送邮件。当我在开发环境中点击通过邮件收到的链接时,它成功地工作了,但当我在生产环境中点击它时,会发生以下错误。

传入邮件示例:(..link/忘记密码/:userId/:token(

请按照链接重置您的密码->https://codermocha.herokuapp.com/forgot-password/6196521181b12d4804d639b5/69849684469c15339328e0744fc6de0a6db993ce83b88838720e927c1ca5a7bf

点击后出现错误页面

错误消息:拒绝应用内联样式,因为它违反了以下内容安全策略指令:"样式srchttps://gc.kis.v2.scr.kaspersky-labs.comwss://gc.kis.v2.scr.kaspersky-labs.com"。启用内联执行需要"unsafe inline"关键字、哈希('sha256-JUCCMgPUsmi3ZsiQj4jAd7Uy7nrvEJzzDwDynfMpvuM='(或nonce('none-…'(。

密码控制器

export const passwordResetRequest = expressAsyncHandler(async (req, res) => {
const email = req.body.email;
if (!email)
return res.status(400).json({ message: "Please enter an email!" });
const user = await User.findOne(req.body);
if (!user) return res.status(400).json({ message: "User does not exist!" });
const token = await Token.findOne({ userId: user._id });
if (!token) {
token = await new Token({
userId: user._id,
token: crypto.randomBytes(32).toString("hex"),
}).save();
}
const link = `${process.env.BASE_URL}${user._id}/${token.token}`;
await sendEmail(user.email, "Password Reset", link);
res
.status(200)
.json({ message: "Password reset link sent to your email account" });
});
export const passwordReset = expressAsyncHandler(async (req, res) => {
console.log(req.body);
const { newPassword, confirmPassword } = req.body;
const { userId, token } = req.params;
if (!newPassword || !confirmPassword)
return res.status(400).json({ message: "Please check your fileds!" });
const user = await User.findById({ _id: userId });
if (!user)
return res.status(404).json({ message: "Invalid link or expired" });
const tokenDb = await Token.findOne({ userId: user._id, token });
if (!tokenDb)
return res.status(404).json({ message: "Invalid link or expired" });
user.password = newPassword;
await user.save();
await tokenDb.delete();
res.status(200).json({ message: "Password reset is successfull." });
});

发送邮件助手功能

const sendEmail = async (email, subject, text) => {
try {
const transporter = nodemailer.createTransport({
host: process.env.HOST,
service: process.env.SERVICE,
port: 587,
secure: true,
auth: {
user: process.env.USER,
pass: process.env.PASSWORD,
},
});
await transporter.sendMail({
from: process.env.USER,
to: email,
subject,
text: `Please follow the link to reset your password -> ${text}`,
});
console.log("Email başarıyla gönderildi");
} catch (err) {
console.log(err);
}
};

您收到的错误告诉您应用于显示页面的样式不是来自已验证的来源。只有来源为(即来自(的样式https://gc.kis.v2.scr.kaspersky-labs.com或wss://gc.kis.v2.scr.kaspersky-labs.com将被允许使用。(参考-https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/style-src#examples)

请检查响应标头中的内容安全策略,以及是否可以修改它们。您也可以将错误中给出的SHA添加到您的CSP标头中,类似于以下内容-

style-src :  'https://gc.kis.v2.scr.kaspersky-labs.com' 'wss://gc.kis.v2.scr.kaspersky-labs.com' 'sha256-JUCCMgPUsmi3ZsiQj4jAd7Uy7nrvEJzzDwDynfMpvuM'

我以不同的方式找到了解决方案。

应用程序中的文件夹结构已嵌套。我使用Concurrently包同时运行前端和后端。更改文件夹结构后,我的问题得到了解决。

我将前端和后端分别放在不同的文件夹中,并分别进行部署。

**Before**
-config
-models
-controllers
-routers
-front-end
..react folders and files
-index.js
**After**
-back-end
..node.js folders and files
-front-end
..react folders and files

最新更新