Насколько безопасна моя контактная форма с помощью JS fetch и PHPMailer?


Насколько безопасна моя контактная форма с помощью JS fetch и PHPMailer?

27.11.2020 08:10:31 Просмотров 11 Источник

В настоящее время я создаю небольшой веб-сайт без реального бэкенда, используя vue-cli. Поскольку я настоящий картофель, когда дело доходит до php (и бэкенда в целом), мне было интересно, насколько безопасна моя контактная форма на этом сайте и что делать, если она недостаточно безопасна.

Подводя итог, я делаю вызов fetch() из моего приложения vue в a mail.php файл на моем сервере. Это mail.php файл использует PHPMailer для отправки электронной почты с одного из адресов электронной почты моего домена на другой из моих адресов. И до сих пор это прекрасно работает.

Вот мой JS, связанный с отправкой почты :

  sendMail () {
    this.sendRequest()
      .then(r => {
        if (r.mailSent === 'ok') {
          // mail sent callback
        }
      })
  },
  async sendRequest () {
    const response = await fetch('./mail.php', {
      method: 'post',
      headers: {
        'content-type': 'application/json'
      },
      body: JSON.stringify({
        subject: 'Message de ' + this.firstNameInput + ' ' + this.lastNameInput + ' via mysite.com',
        body: '<html>' +
          '<body>' +
          '<p>De : ' + this.firstNameInput + ' ' + this.lastNameInput + '</p>' +
          '<p>Email : ' + this.mailInput + '</p>' +
          '<p>Message :<br>' + this.messageInput.replace(/\n/g, '<br>') + '</p>' +
          '</body>' +
          '</html>',
        altBody: 'De : ' + this.firstNameInput + ' ' + this.lastNameInput + ' /// Email : ' + this.mailInput + ' /// Message :' + this.messageInput
      })
    })
    return response.json()
  }

А вот содержание моего mail.php файл :

<?php

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require './PHPMailer/src/Exception.php';
require './PHPMailer/src/PHPMailer.php';
require './PHPMailer/src/SMTP.php';

header('Content-Type: application/json');

include './mailSettings.php'; // contains $site, $mailFrom, $mailTo, $senderName and $recipientName

if(@isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER'] == $site) {
  $contentType = isset($_SERVER["CONTENT_TYPE"]) ?trim($_SERVER["CONTENT_TYPE"]) : '';

  if ($contentType === "application/json") {
    $content = stripslashes(trim(file_get_contents("php://input")));
    $decoded = json_decode($content, true);

    if(!is_array($decoded)) {
      echo '{"status":"error"}';
    } else {
      $mail = new PHPMailer(TRUE);
      try {
        $mail->setFrom($mailFrom, $senderName);
        $mail->addAddress($mailTo, $recipientName);
        $mail->Subject = $decoded['subject'];
        $mail->isHTML(TRUE);
        $mail->Body = $decoded['body'];
        $mail->AltBody = $decoded['altBody'];
        $mail->send();
      }
      catch (Exception $e) {
        echo $e->errorMessage();
      }
      catch (\Exception $e) {
        echo $e->getMessage();
      }
      echo '{ "mailSent": "ok"}';
    }
  } else {
    echo '{"status":"error"}';
  }
} else {
  echo '{"status":"no call accepted from this adress"}';
}
?>

Я догадался, что мне все еще нужно кое-что сделать, чтобы сделать это безопасным, но не могли бы вы, ребята, помочь мне выяснить, что и почему ?

У вопроса есть решение - Посмотреть?

Ответы - Насколько безопасна моя контактная форма с помощью JS fetch и PHPMailer? / How secure is my contact form using JS fetch and PHPMailer?

Является ответом!
Synchro

27.11.2020 08:40:57

Вы сделали самое главное правильно-не использовали отправленные пользователем адреса – что помогает предотвратить превращение вас в шлюз спама!

Во-первых, для простого сбора данных, подобного этому, я бы вообще избегал HTML. Обычный обычный текст сделает эту работу.

Если вы действительно хотите использовать HTML, я рекомендую собрать его на стороне сервера - таким образом, вы можете сделать гораздо более строгую фильтрацию простых полей ввода, например, используя strip_tags или используя разрешенный список символов для фильтрации полей (см. ссылку @DigitalDrifter), прежде чем вставлять их в макет. Это гораздо проще и безопаснее, чем пытаться чисто фильтровать предварительно собранный, поставляемый пользователем HTML. Это также очень просто сделать, так как код JS и PHP будет более или менее идентичен.

Помочь в развитии проекта:
Закрыть X