Я размещаю контактную форму на своем личном веб-сайте портфолио, и каждые пару недель адрес электронной почты, связанный с контактной формой (которая больше нигде не используется), подвергается компрометации. Каким-то образом, о котором я не знаю, кто-то может получить доступ к паролю (который больше нигде не используется) и пытается войти с его помощью в мою учетную запись.
Когда учетная запись взломана, я обнаруживаю, что у меня есть три электронных письма с, казалось бы, случайных адресов с, казалось бы, случайными темами и содержанием, состоящими из одного слова.
Все пароли имеют длину более 10 символов, используя заглавные буквы, строчные буквы, цифры и символы.
Сайт статичен, размещен на Netlify. Электронная почта обрабатывается микрослужбой Node.js, размещенной на Heroku. Вот моя контактная форма.
<form id="contact-form" autocomplete="off">
<label for="name">Name</label>
<input type="text" id="name" name="name" value="" required />
<label for="email">Email</label>
<input type="email" id="email" name="email" value="" required />
<label for="subject">Subject</label>
<input type="text" id="subject" name="subject" value="" required />
<label for="text">Message</label>
<textarea id="text" name="text" value="" required></textarea>
<button type="submit">Submit</button>
</form>
Вот код, который обрабатывает контактную форму:
$("#contact-form").submit((e) => {
e.preventDefault();
$.ajax({
url: "https://my-microservice.herokuapp.com/email",
type: "POST",
dataType: "json",
data: $("#contact-form").serialize(),
success: function (response) {
$("#contact-form").html(
"<div class='form-success'><h2>Your message has been sent! Thanks for getting in touch.</h2></div>"
);
},
error: function (xhr, status, error) {
$("#contact-form").html(
"<div class='form-failure'><h2>Uh-oh! Something went horribly wrong. You can email me directly at <a href='mailto: [email protected]'>[email protected]</a></h2></div>"
);
},
});
});
Вот микросервис, который обрабатывает электронную почту:
require("dotenv").config();
const express = require("express");
const nodemailer = require("nodemailer");
const app = express();
const bodyParser = require("body-parser");
const cors = require("cors");
var corsOptions = {
origin: "https://www.my-portfolio-site.com",
optionsSuccessStatus: 200
};
app.use(
bodyParser.urlencoded({
extended: true
})
);
var transporter = nodemailer.createTransport({
service: "gmail",
auth: {
user: process.env.EMAIL,
pass: process.env.PASSWORD
}
});
app.post("/email", cors(corsOptions), (req, res) => {
var mailOptions = {
from: "my-portfolio-site.com",
to: process.env.EMAIL,
subject: "PORTFOLIO MESSAGE",
text: `from: ${req.body.email}\nsubject: ${req.body.subject}\nmessage:\n\n${req.body.text}`
};
transporter.sendMail(mailOptions, function(error, info) {
if (error) {
console.log(error);
res.send(error);
} else {
console.log("Email sent: " + info.response);
res.send(info);
}
});
});
let port = process.env.PORT;
if (port == null || port == "") {
port = 8000;
}
const listener = app.listen(port, function() {
console.log("Your app is listening on port " + listener.address().port);
});
Любое понимание того, как мой пароль может быть скомпрометирован и как я могу остановить это, будет очень признательно. Спасибо за ваше время.