Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/itchief/feedbackForm.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoritchief <alex.malcev1980@gmail.com>2022-03-15 13:41:32 +0300
committeritchief <alex.malcev1980@gmail.com>2022-03-15 13:41:32 +0300
commit69dc831d7719c77f4a96591a0f40f676dd39abb4 (patch)
tree041be639ba02a7075f570e4bd9dd9a68f4c48e33
parentbad8109d818068fe76d6c6832c50325e9d2ceda7 (diff)
Update
-rw-r--r--feedback/process/process.php309
-rw-r--r--feedback/template/email.tpl (renamed from feedback/process/email.tpl)24
-rw-r--r--feedback/template/email_client.tpl (renamed from feedback/process/email_client.tpl)13
-rw-r--r--feedback/uploads/.htaccess13
4 files changed, 30 insertions, 329 deletions
diff --git a/feedback/process/process.php b/feedback/process/process.php
deleted file mode 100644
index 10221e2..0000000
--- a/feedback/process/process.php
+++ /dev/null
@@ -1,309 +0,0 @@
-<?php
-
-/*
- * Форма обратной связи (https://itchief.ru/lessons/php/feedback-form-for-website)
- * Copyright 2016-2020 Alexander Maltsev
- * Licensed under MIT (https://github.com/itchief/feedback-form/blob/master/LICENSE)
- */
-
-header('Content-Type: application/json');
-
-// обработка только ajax запросов (при других запросах завершаем выполнение скрипта)
-if (empty($_SERVER['HTTP_X_REQUESTED_WITH']) || $_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest') {
- exit();
-}
-
-// обработка данных, посланных только методом POST (при остальных методах завершаем выполнение скрипта)
-if ($_SERVER['REQUEST_METHOD'] != 'POST') {
- exit();
-}
-
-/* 1 ЭТАП - НАСТРОЙКА ПЕРЕМЕННЫХ */
-
-const
-IS_CHECK_CAPTCHA = true, // проверять капчу
-IS_SEND_MAIL = true, // отправлять письмо получателю
-IS_SEND_MAIL_SENDER = false, // отправлять информационное письмо отправителю
-IS_WRITE_LOG = true, // записывать данные в лог
-UPLOAD_NAME = 'uploads', // имя директории для загрузки файлов
-IS_SEND_FILES_IN_BODY = true, // добавить ссылки на файлы в тело письма
-IS_SENS_FILES_AS_ATTACHMENTS = true, // необходимо ли прикреплять файлы к письму
-MAX_FILE_SIZE = 524288, // максимальный размер файла (в байтах)
-ALLOWED_EXTENSIONS = array('jpg', 'jpeg', 'bmp', 'gif', 'png'), // разрешённые расширения файлов
-MAIL_FROM = 'no-reply@mydomain.ru', // от какого email будет отправляться письмо
-MAIL_FROM_NAME = 'Имя_сайта', // от какого имени будет отправляться письмо
-MAIL_SUBJECT = 'Сообщение с формы обратной связи', // тема письма
-MAIL_ADDRESS = 'manager@mydomain.ru', // кому необходимо отправить письмо
-MAIL_SUBJECT_CLIENT = 'Ваше сообщение доставлено', // настройки mail для информирования пользователя о доставке сообщения
-IS_SENDING_MAIL_VIA_SMTP = true, // выполнять отправку писем через SMTP
-MAIL_SMTP_HOST = 'ssl://smtp.yandex.ru', // SMTP-хост
-MAIL_SMTP_PORT = '465', // SMTP-порт
-MAIL_SMTP_USERNAME = 'alexander@yandex.ru', // SMTP-пользователь
-MAIL_SMTP_PASSWORD = '12345678'; // SMTP-пароль
-$uploadPath = dirname(dirname(__FILE__)) . '/' . UPLOAD_NAME . '/'; // директория для хранения загруженных файлов
-$startPath = 'http' . (isset($_SERVER['HTTPS']) ? 's' : '') . '://' . $_SERVER['HTTP_HOST'] . '/';
-
-function log_write($message)
-{
- if (IS_WRITE_LOG === false) {
- return;
- }
- $output = date('d.m.Y H:i:s') . PHP_EOL . $message . PHP_EOL . '-------------------------' . PHP_EOL;
- file_put_contents(dirname(dirname(__FILE__)) . '/logs/logs.txt', $output, FILE_APPEND | LOCK_EX);
-}
-
-/* 2 ЭТАП - ПОДКЛЮЧЕНИЕ PHPMAILER */
-
-use PHPMailer\PHPMailer\PHPMailer;
-use PHPMailer\PHPMailer\Exception;
-
-require_once('../phpmailer/src/Exception.php');
-require_once('../phpmailer/src/PHPMailer.php');
-require_once('../phpmailer/src/SMTP.php');
-
-/* 3 ЭТАП - ОТКРЫТИЕ СЕССИИ И ИНИЦИАЛИЗАЦИЯ ПЕРЕМЕННОЙ ДЛЯ ХРАНЕНИЯ РЕЗУЛЬТАТОВ ОБРАБОТКИ ФОРМЫ */
-
-session_start();
-$data['result'] = 'success';
-
-/* 4 ЭТАП - ВАЛИДАЦИЯ ДАННЫХ (ЗНАЧЕНИЙ ПОЛЕЙ ФОРМЫ) */
-
-// проверка поля name (оно должно быть обязательно заполнено и иметь длину в диапазоне от 2 до 30 символов)
-if (isset($_POST['name'])) {
- $name = filter_var($_POST['name'], FILTER_SANITIZE_STRING); // защита от XSS
- $nameLength = mb_strlen($name, 'UTF-8');
- if ($nameLength < 2) {
- $data['name'] = 'Текст должен быть не короче 2 симв. Длина текста сейчас: ' . $nameLength . ' симв.';
- $data['result'] = 'error';
- log_write('Не пройдена валидация поля: name! Его длина равна ' . $nameLength . ' симв.');
- } else if ($nameLength > 30) {
- $data['name'] = 'Длина текста не должна превышать 30 симв. (сейчас ' . $nameLength . ' симв.).';
- $data['result'] = 'error';
- log_write('Не пройдена валидация поля: name! Его длина равна ' . $nameLength . ' симв.');
- }
-} else {
- $data['name'] = 'Заполните это поле.';
- $data['result'] = 'error';
- log_write('Не пройдена валидация поля: name! Оно не заполнено!');
-}
-
-// проверка поля email (оно должно присутствовать и иметь корректное значение)
-if (isset($_POST['email'])) {
- if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) { // защита от XSS
- $data['email'] = 'Адрес электронной почты не корректный';
- $data['result'] = 'error';
- log_write('Не пройдена валидация поля: email! Оно имеет не корретное значение!');
- } else {
- $email = $_POST['email'];
- }
-} else {
- $data['email'] = 'Заполните это поле.';
- $data['result'] = 'error';
- log_write('Не пройдена валидация поля: email! Оно не заполнено!');
-}
-
-// проверка поля message (это поле должно присутствовать и иметь длину в диапазоне от 20 до 500 символов)
-if (isset($_POST['message'])) {
- $message = filter_var($_POST['message'], FILTER_SANITIZE_STRING); // защита от XSS
- $messageLength = mb_strlen($message, 'UTF-8');
- if ($messageLength < 20) {
- $data['message'] = 'Текст должен быть не короче 20 симв. Длина текста сейчас: ' . $messageLength . ' симв.';
- $data['result'] = 'error';
- log_write('Не пройдена валидация поля: message! Его длина равна ' . $messageLength . ' симв.');
- } else if ($messageLength > 500) {
- $data['message'] = 'Длина текста не должна превышать 500 симв. (сейчас ' . $messageLength . ' симв.)';
- $data['result'] = 'error';
- log_write('Не пройдена валидация поля: message! Его длина равна ' . $messageLength . ' симв.');
- }
-} else {
- $data['message'] = 'Заполните это поле.';
- $data['result'] = 'error';
- log_write('Не пройдена валидация поля: name! Оно не заполнено!');
-}
-
-/* 5 ЭТАП - ПРОВЕРКА КАПЧИ */
-if (IS_CHECK_CAPTCHA == true) {
- if (isset($_POST['captcha']) && isset($_SESSION['captcha'])) {
- $captcha = filter_var($_POST['captcha'], FILTER_SANITIZE_STRING); // защита от XSS
- if ($_SESSION['captcha'] != $captcha) { // проверка капчи
- $data['captcha'] = 'Код не соответствует изображению.';
- $data['result'] = 'error';
- log_write('Не пройдена валидация поля: captcha! Указанный код ' . $captcha . ' не соответствует сгенерированному на сервере ' . $_SESSION['captcha']);
- }
- } else {
- $data['captcha'] = 'Ошибка при проверке кода.';
- $data['result'] = 'error';
- log_write('Произошла ошибка при проверке капчи!');
- }
-}
-
-/* 6 ЭТАП - ВАЛИДАЦИЯ ФАЙЛОВ */
-if (isset($_FILES['attach'])) {
- // перебор массива $_FILES['attachment']
- foreach ($_FILES['attach']['error'] as $key => $error) {
- // если файл был успешно загружен на сервер (ошибок не возникло), то...
- if ($error == UPLOAD_ERR_OK) {
- // получаем имя файла
- $fileName = $_FILES['attach']['name'][$key];
- // получаем расширение файла в нижнем регистре
- $fileExtension = mb_strtolower(pathinfo($fileName, PATHINFO_EXTENSION));
- // получаем размер файла
- $fileSize = $_FILES['attach']['size'][$key];
- // результат проверки расширения файла
- $resultCheckExtension = true;
- // проверяем расширение загруженного файла
- if (!in_array($fileExtension, ALLOWED_EXTENSIONS)) {
- $resultCheckExtension = false;
- $data['attach'][$key] = 'Файл имеет не разрешённый тип.';
- $data['result'] = 'error';
- log_write('Произошла ошибка! Файл ' . $fileName . ' имеет не разрешённый тип.');
- }
- // проверяем размер файла
- if ($resultCheckExtension && ($fileSize > MAX_FILE_SIZE)) {
- $data['attach'][$key] = 'Размер файла превышает допустимый.';
- $data['result'] = 'error';
- log_write('Произошла ошибка! Файл ' . $fileName . ' имеет не разрешённый размер.');
- }
- } else {
- $data['attach'][$key] = 'Ошибка при загрузке файла.';
- $data['result'] = 'error';
- log_write('Произошла ошибка при загрузке файла на сервер!');
- }
- }
- // если ошибок валидации не возникло, то переместим файл в директорию $uploadPath
- if ($data['result'] == 'success') {
- // переменная для хранения имён файлов
- $attachments = array();
- // перемещение файлов в директорию $uploadPath
- foreach ($_FILES['attach']['name'] as $key => $attachment) {
- // получаем имя файла
- $fileName = basename($_FILES['attach']['name'][$key]);
- // получаем расширение файла в нижнем регистре
- $fileExtension = mb_strtolower(pathinfo($fileName, PATHINFO_EXTENSION));
- // временное имя файла на сервере
- $fileTmp = $_FILES['attach']['tmp_name'][$key];
- // создаём уникальное имя
- $fileNewName = uniqid('upload_', true) . '.' . $fileExtension;
- // перемещаем файл в директорию
- if (!move_uploaded_file($fileTmp, $uploadPath . $fileNewName)) {
- // ошибка при перемещении файла
- $data['attach'][$key] = 'Ошибка при загрузке файла.';
- $data['result'] = 'error';
- log_write('Произошла ошибка при перемещении файла в директорию, определяемою переменной $uploadPath!');
- } else {
- $attachments[] = $uploadPath . $fileNewName;
- }
- }
- }
-}
-
-/* 7 ЭТАП - ОТПРАВКА ПИСЬМА ПОЛУЧАТЕЛЮ */
-if ($data['result'] == 'success' && IS_SEND_MAIL == true) {
- try {
- // получаем содержимое email шаблона
- $bodyMail = file_get_contents('email.tpl');
- // выполняем замену плейсхолдеров реальными значениями
- $bodyMail = str_replace('%email.title%', MAIL_SUBJECT, $bodyMail);
- $bodyMail = str_replace('%email.nameuser%', isset($name) ? $name : '-', $bodyMail);
- $bodyMail = str_replace('%email.message%', isset($message) ? $message : '-', $bodyMail);
- $bodyMail = str_replace('%email.emailuser%', isset($email) ? $email : '-', $bodyMail);
- $bodyMail = str_replace('%email.date%', date('d.m.Y H:i'), $bodyMail);
- // добавление файлов в виде ссылок
- if (IS_SEND_FILES_IN_BODY) {
- if (isset($attachments)) {
- $listFiles = '<ul>';
- foreach ($attachments as $attachment) {
- $fileHref = substr($attachment, strpos($attachment, basename(dirname(__DIR__)) . '/' . UPLOAD_NAME . '/'));
- $fileName = basename($fileHref);
- $listFiles .= '<li><a href="' . $startPath . $fileHref . '">' . $fileName . '</a></li>';
- }
- $listFiles .= '</ul>';
- $bodyMail = str_replace('%email.attachments%', $listFiles, $bodyMail);
- } else {
- $bodyMail = str_replace('%email.attachments%', '-', $bodyMail);
- }
- }
- // устанавливаем параметры
- $mail = new PHPMailer;
- $mail->CharSet = 'UTF-8';
-
- /* Отправка письма по SMTP */
- if (IS_SENDING_MAIL_VIA_SMTP === true) {
- $mail->isSMTP();
- $mail->SMTPAuth = true;
- $mail->Host = MAIL_SMTP_HOST;
- $mail->Port = MAIL_SMTP_PORT;
- $mail->Username = MAIL_SMTP_USERNAME;
- $mail->Password = MAIL_SMTP_PASSWORD;
- }
-
- $mail->Encoding = 'base64';
- $mail->IsHTML(true);
- $mail->setFrom(MAIL_FROM, MAIL_FROM_NAME);
- $mail->Subject = MAIL_SUBJECT;
- $mail->Body = $bodyMail;
-
- $emails = explode(',', MAIL_ADDRESS);
- foreach ($emails as $address) {
- $mail->addAddress(trim($address));
- }
-
- // прикрепление файлов к письму
- if (IS_SENS_FILES_AS_ATTACHMENTS) {
- if (isset($attachments)) {
- foreach ($attachments as $attachment) {
- $mail->addAttachment($attachment);
- }
- }
- }
- // отправляем письмо
- if (!$mail->send()) {
- $data['result'] = 'error';
- log_write('Ошибка при отправке письма: ' . $mail->ErrorInfo);
- }
- } catch (Exception $e) {
- log_write('Ошибка: ' . $e->getMessage());
- }
-}
-/* 8 ЭТАП - ОТПРАВКА ИНФОРМАЦИОННОГО ПИСЬМА ОТПРАВИТЕЛЮ */
-if ($data['result'] == 'success' && IS_SEND_MAIL_SENDER == true) {
- try {
- // очистка всех адресов и прикреплёных файлов
- $mail->clearAllRecipients();
- $mail->clearAttachments();
- // получаем содержимое email шаблона
- $bodyMail = file_get_contents('email_client.tpl');
- // выполняем замену плейсхолдеров реальными значениями
- $bodyMail = str_replace('%email.title%', MAIL_SUBJECT, $bodyMail);
- $bodyMail = str_replace('%email.nameuser%', isset($name) ? $name : '-', $bodyMail);
- $bodyMail = str_replace('%email.date%', date('d.m.Y H:i'), $bodyMail);
- // устанавливаем параметры
- $mail->Subject = MAIL_SUBJECT_CLIENT;
- $mail->Body = $bodyMail;
- $mail->addAddress($email);
- // отправляем письмо
- if (!$mail->send()) {
- $data['result'] = 'error';
- log_write('Ошибка при отправке письма: ' . $mail->ErrorInfo);
- }
- } catch (Exception $e) {
- log_write('Ошибка: ' . $e->getMessage());
- }
-}
-
-/* 9 ЭТАП - ЗАПИСЫВАЕМ ДАННЫЕ В ЛОГ */
-if ($data['result'] == 'success' && IS_WRITE_LOG) {
- $output = 'Имя пользователя: ' . (isset($name) ? $name : '-') . PHP_EOL;
- $output .= 'Адрес email: ' . (isset($email) ? $email : '-') . PHP_EOL;
- $output .= 'Сообщение: ' . (isset($message) ? $message : '-') . PHP_EOL;
- if (isset($attachments)) {
- $output .= 'Файлы:' . PHP_EOL;
- foreach ($attachments as $attachment) {
- $output .= $attachment . PHP_EOL;
- }
- }
- log_write('Письмо успешно отправлено!' . PHP_EOL . $output);
-}
-
-/* ФИНАЛЬНЫЙ ЭТАП - ВОЗВРАЩАЕМ РЕЗУЛЬТАТЫ РАБОТЫ В ФОРМАТЕ JSON */
-echo json_encode($data);
diff --git a/feedback/process/email.tpl b/feedback/template/email.tpl
index bc73cd4..52f8d94 100644
--- a/feedback/process/email.tpl
+++ b/feedback/template/email.tpl
@@ -6,7 +6,7 @@
<tbody>
<tr>
<td bgcolor="#fff" style="padding: 15px;">
- <font color="#777" style="font-size:18px">%email.title%</font>
+ <font color="#777" style="font-size:18px">%subject%</font>
</td>
</tr>
<tr>
@@ -14,17 +14,15 @@
</tr>
<tr>
<td bgcolor="#fff" style="padding: 15px;">
-
- Пользователь
- <b>%email.nameuser%</b> оставил следующее сообщение:
- <br> %email.message%
- <hr> Email пользователя:
- <b>%email.emailuser%</b>
- <br> Дата отправки:
- <b>%email.date%</b>
+ Пользователь <b>%name%</b> оставил следующее сообщение:
<hr>
- Файлы:
- %email.attachments%
+ %message%
+ <hr>
+ Email пользователя: <b>%email%</b>
+ <br>
+ Дата отправки: <b>%date%</b>
+ <br>
+ %attachs%
</td>
</tr>
<tr>
@@ -32,7 +30,7 @@
</tr>
<tr>
<td bgcolor="#fff " style="padding: 20px 15px; color: #777; font-size: 14px;">
- <p>&copy; 2020 Мой сайт.</p>
+ <p>&copy; 2022 Мой сайт.</p>
</td>
</tr>
</tbody>
@@ -40,4 +38,4 @@
</td>
</tr>
</tbody>
-</table> \ No newline at end of file
+</table>
diff --git a/feedback/process/email_client.tpl b/feedback/template/email_client.tpl
index 9c38bb8..21922a2 100644
--- a/feedback/process/email_client.tpl
+++ b/feedback/template/email_client.tpl
@@ -6,7 +6,7 @@
<tbody>
<tr>
<td bgcolor="#fff" style="padding: 15px;">
- <font color="#777" style="font-size:18px">%email.title%</font>
+ <font color="#777" style="font-size:18px">%subject%</font>
</td>
</tr>
<tr>
@@ -15,11 +15,10 @@
<tr>
<td bgcolor="#fff" style="padding: 15px;">
- <p>Здравствуйте
- <b>%email.nameuser%</b>, ваше сообщение доставлено.</p>
+ <p>Здравствуйте <b>%name%</b>, ваше сообщение доставлено.</p>
<p>На данное письмо отвечать не надо.</p>
- <hr> Дата отправки:
- <b>%email.date%</b>
+ <hr>
+ Дата отправки: <b>%date%</b>
</td>
</tr>
@@ -28,7 +27,7 @@
</tr>
<tr>
<td bgcolor="#fff" style="padding: 20px 15px; color: #777; font-size: 14px;">
- <p>&copy; 2020 Мой сайт.</p>
+ <p>&copy; 2022 Мой сайт.</p>
</td>
</tr>
</tbody>
@@ -36,4 +35,4 @@
</td>
</tr>
</tbody>
-</table> \ No newline at end of file
+</table>
diff --git a/feedback/uploads/.htaccess b/feedback/uploads/.htaccess
new file mode 100644
index 0000000..cf9c02f
--- /dev/null
+++ b/feedback/uploads/.htaccess
@@ -0,0 +1,13 @@
+# line below if for Apache 2.4
+<ifModule mod_authz_core.c>
+ Require all denied
+</ifModule>
+
+# line below if for Apache 2.2
+<ifModule !mod_authz_core.c>
+ deny from all
+ Satisfy All
+</ifModule>
+
+# section for Apache 2.2 and 2.4
+IndexIgnore * \ No newline at end of file