Уязвимость контактной формы, раскрывает пароль электронной почты

Я размещаю контактную форму на своем личном веб-сайте портфолио, и каждые пару недель адрес электронной почты, связанный с контактной формой (которая больше нигде не используется), подвергается компрометации. Каким-то образом, о котором я не знаю, кто-то может получить доступ к паролю (который больше нигде не используется) и пытается войти с его помощью в мою учетную запись.

Когда учетная запись взломана, я обнаруживаю, что у меня есть три электронных письма с, казалось бы, случайных адресов с, казалось бы, случайными темами и содержанием, состоящими из одного слова.

Все пароли имеют длину более 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);
});

Любое понимание того, как мой пароль может быть скомпрометирован и как я могу остановить это, будет очень признательно. Спасибо за ваше время.


person LuosRestil    schedule 07.07.2020    source источник
comment
Существует множество векторов, которые могут привести к компрометации, и ни один из них не имеет ничего общего с этим кодом.   -  person Dave Newton    schedule 07.07.2020
comment
Итак, вы сделали контактную форму общедоступной, контактная форма отправляет электронное письмо на ваш адрес электронной почты, и вы получаете странные электронные письма?   -  person Iamzozo    schedule 07.07.2020
comment
Не просто получать странные электронные письма. После того, как я получаю странные электронные письма, я получаю уведомление о том, что была предпринята попытка входа в связанную учетную запись электронной почты с использованием правильного пароля этой учетной записи. Каким-то образом пароль раскрывается.   -  person LuosRestil    schedule 07.07.2020
comment
Что делать, если ваш компьютер взломан и постоянно стекает информация, ваши фотографии из отпуска или копание биткойнов? Будет ли это лучше объяснять ситуацию?   -  person Marek Puchalski    schedule 07.07.2020
comment
Возможно нет. Тот факт, что каждый раз, когда мой пароль скомпрометирован, мне приходят три странных электронных письма, отправленных из моей контактной формы, указывает на то, что доступ к паролю осуществляется с помощью некоторой информации, полученной при отправке формы. Если бы мой компьютер был скомпрометирован, я не могу себе представить, чтобы подозрительная активность была ограничена таким образом.   -  person LuosRestil    schedule 07.07.2020


Ответы (1)


в микросервисе есть фрагмент кода, который позволяет атаковать CSRF, это часть:

app.use(
  bodyParser.urlencoded({
    extended: true
  })
);

для получения более подробной информации вы можете посмотреть здесь или выполнить поиск в Google, что что расширено: истина означает.

person 3flies4    schedule 22.12.2020