В какую папку будут загружены файлы из формы «Загрузить файл»?
В какую папку будут загружены файлы из формы «Загрузить файл»?
Для того, чтобы, увидеть ответ, необходимо приобрести одну из следующих подписок:
Купить подписку можно на главной странице сайта
О проекте
Мы публикуем ответы на тесты, необходимые для получения сертификатов по 1С — Битрикс. Данные сертификаты требуются для получения компетенции и партнерства.
Разделы
Ответы
- Контент — менеджер
- Администратор.Базовый
- Администратор.Модули
- Bitrix Framework
- Пользователь Сервиса Битрикс24
В какую папку будут загружены файлы из формы загрузить файл
В какую папку будут загружены файлы из формы «Загрузить файл»?
- Курс на выбор
- 1С-Битрикс
- Полный пакет
Опуликовано: 20 февраля 2019
Просмотров: 4816
Поиск по ответам:
- Контент-менеджер
- Администратор. Базовый
- Администратор сервиса Битрикс24 (коробочная версия)
- Пользователь коробочной версии Битрикс24
- Пользователь сервиса Битрикс24
- Администратор. Модули
- Администратор. Бизнес
- Интеграция с 1С
- Разработчик Bitrix Framework
- Технология Композитный сайт
- Продвижение сайта и Маркетинг
- Установка и настройка
- Многосайтовость
- Курс для хостеров
- Базовый курс партнера Битрикс24
- Курс менеджеров по продажам Битрикс24
- Менеджер по продажам Битрикс24. Продолжение.
- Онлайн-продажи в Битрикс24
- Сквозная аналитика в Битрикс24.CRM
- CRM-маркетинг в Битрикс24
- Битрикс24.Офис
- Битрикс24.CRM
- Задачи и проекты
- Автоматизация Бизнес-Процессов
- 1С-Битрикс24: Интернет-магазин + CRM
- Аналитик
- Приложение с заявками от клиентов
- Продажа подписки Битрикс24.Маркет Плюс
- Автоматизация цифровых рабочих мест
bitrix-otvet.ru © 2023. Все права защищены
В какую папку будут загружены файлы из формы загрузить файл
В какую папку будут загружены файлы из формы «Загрузить файл»?
- Курс на выбор
- Битрикс24
- Полный пакет
Опуликовано: 26 января 2019
Просмотров: 2359
Поиск по ответам:
- Контент-менеджер
- Администратор. Базовый
- Администратор сервиса Битрикс24 (коробочная версия)
- Пользователь коробочной версии Битрикс24
- Пользователь сервиса Битрикс24
- Администратор. Модули
- Администратор. Бизнес
- Интеграция с 1С
- Разработчик Bitrix Framework
- Технология Композитный сайт
- Продвижение сайта и Маркетинг
- Установка и настройка
- Многосайтовость
- Курс для хостеров
- Базовый курс партнера Битрикс24
- Курс менеджеров по продажам Битрикс24
- Менеджер по продажам Битрикс24. Продолжение.
- Онлайн-продажи в Битрикс24
- Сквозная аналитика в Битрикс24.CRM
- CRM-маркетинг в Битрикс24
- Битрикс24.Офис
- Битрикс24.CRM
- Задачи и проекты
- Автоматизация Бизнес-Процессов
- 1С-Битрикс24: Интернет-магазин + CRM
- Аналитик
- Приложение с заявками от клиентов
- Продажа подписки Битрикс24.Маркет Плюс
- Автоматизация цифровых рабочих мест
bitrix-otvet.ru © 2023. Все права защищены
Форма на PHP с безопасной загрузкой файлов на сервер
![]()
Недавно я делал форму обратной связи с возможностью загрузки файлов. При этом стояла задача сделать форму идеально безопасной, с «белым списком» файлов, а также на выходе формировать письмо клиентскому отделу с данными клиента и всеми его файлами. Поскольку файлы (согласно ТЗ) могут иметь большой размер (до 50 МБ каждый), никакой почтовый клиент не выдержит такого объёма информации, особенно учитывая то, что размеры почтовых ящиков у менеджеров всегда переполнены и при этом им никак нельзя пропустить заявку от клиента.
Я принял решение формировать url для ftp-соединения в браузере, с включённым паролем. Для этой цели я создал на VPS отдельного пользователя и ограничил ему доступ только одной папкой, в которой будут документы. Таким образом, сторонние пользователи никак не смогут просмотреть данные файлы, а менеджеры клиентского отдела имеют только на просмотр, причём исключительно в рамках одной папки.
Все основные настройки я вынес в начало скрипта.
Итак, как создать безопасную форму на php для загрузки файлов на сервер
Первым делом настроим php.ini по адресу /etc/php.ini
Если мы не сделаем это, то размер принимаемых файлов может быть сильно ограничен. Например, на нашем VPS стояло ограничение в 2 Мб.
post_max_size ставим 50М
upload_max_filesize ставим меньше, 49М
параметр memory_limit должен быть больше, чем post_max_size
Для поля ввода с телефоном можем подключить Jquery maskedinput
Создаём папку в родительском каталоге, например ‘clients_documents’ (её название потом пропишем в скрипте ниже)
/* *** ОСНОВНЫЕ НАСТРОЙКИ *** */ // Сюда вписываем все разрешённые для загрузки расширения файлов: $goodFiles = ['.doc','.docx','.pdf','.xls','.xlsx','.ppt','.pptx','.zip','.rar','.7z','.jpg','.jpeg','.jpe','.bmp','.png','.txt','.rtf','.gif','.tif','.tiff','.xps','.odt','.ods','.odp','.csv']; // Здесь указываем на какую почту администратора должно приходить письмо о новой клиентской заявке: $to = "*******@*******.ru"; // Здесь указываем с какой почты должно приходить письмо: $from ; // Сюда вписываем название папки в корне сайта, которую мы предварительно создали для загрузки и хранения документов клиента: $uploaddir = 'clients_documents'; // Указываем FTP настройки. Они нужны для формирования ссылки, по которой можно будет скачивать документы клиента из браузера. // В целях безопасности рекомендую создать отдельный ftp-аккаунт, с доступом только к папке с документами. // Т.е. пользователи смогут посмотреть только папку с пришедшими документами + папку на уровень выше (там где будут присланные документы за другие даты) // Т.к. скрипт мы будем использовать только внутри Вашей организации и документы будут приходить на указанный Вами е-мейл (например руководителю отдела по работе с клиентами) // то данная стратегия полностью безопасна. $ftpHost = '81.177.165.34'; // Указываем реальный FTP хост $ftpLogin = 'login'; // Указываем реальный FTP логин $ftpPass = 'password'; // Указываем реальный FTP пароль // У пользователя стандартный FTP доступ (ко всем папкам на сервере) или Вы настроили клиенту доступ только к директории с документами (исходя из рекомендации выше)? // Если вариант 1 - ставим значение true. Если доступ ограничен только текущей папкой - оставляем false $ftpAccess = false; // Задаём переменные, полученные из $_POST. Для безопасности обрезаем все теги, которые можем ввести пользователь if($_SERVER['REQUEST_METHOD'] === 'POST') < $today = date('d-m-Y_H-i-s'); $problem = strip_tags(trim($_POST["problem"])); $object = strip_tags(trim($_POST["object"])); $documents = strip_tags(trim($_POST["documents"])); $dop_info = strip_tags(trim($_POST["dop_info"])); $questions = strip_tags(trim($_POST["questions"])); $name = strip_tags(trim($_POST["name"])); $tel = strip_tags($_POST["tel"]); $email = strip_tags($_POST["email"]); $ooo = strip_tags(trim($_POST["ooo"])); $files = $_FILES; $subject = "У Вас новый запрос на обратный звонок c сайта ****.ru"; // здесь указываем нужную нам тему письма $message = "Заявка с расширенной формы обратной связи
"."\n"; // здесь указываем заголовок письма // Все поля ниже заполнены из конкретного примера имеющейся ниже формы. Если у Вас будут другие поля, то меняем ниже название переменных // Значения переменных в $_POST['. '] должны соответствовать значениям атрибута name в полях ввода (! это важно !) if(!empty($_POST["problem"])) $message . ."\n"; if(!empty($_POST["object"])) $message . ."\n"; if(!empty($_POST["documents"])) $message . ."\n"; if(!empty($_POST["dop_info"])) $message . ."\n"; if(!empty($_POST["questions"])) $message . ."\n"; if(!empty($_POST["ooo"])) $message . ."\n"; $message . ."\n"."Телефон:
$tel>
"."\n"."E-mail:
$email>
"."\n"; $extensionArr = []; $filesName = []; // Ниже указывается путь к папке, которую мы задавали выше в переменной $uploaddir // В данном примере, папка расположения данного скрипта и папка 'clients_documents' находятся на одном уровне, в корне сайта, т.е. эти папки находятся на одном уровне. // Если Вы хотите использовать файл с формой как отдельный файл (без папки) и он будет находиться на одном уровне с папкой 'clients_documents', // то тогда строка ниже будет такой: $uploaddir = '/'.$uploaddir.'/'.$today; $uploaddir = '../'.$uploaddir.'/'.$today; // В следующих строчках мы проверяем, загружены ли по факту пользователем файлы. foreach($files as $file)$file['name'])) array_push($filesName, $file['name']);>> count($filesName)>0 ? $resultUpload = true : $resultUpload = false; // Функция для транслитерации кириллических символов, пробелов и прочего в названии загружаемых файлов function transl($st,$code='utf-8') < $st = mb_strtolower($st, $code); $st = str_replace(array( '?','!',',',':',';','*','(',')','','%','#','№','@','$','^','-','+','/','\\','=','|','"','\'','&','а','б','в','г','д','е','ё','з','и','й','к','л','м','н','о','п','р','с','т','у','ф','х','ъ','ы','э',' ','ж','ц','ч','ш','щ','ь','ю','я' ), array( '','','','','','','','','','','','','','','','','','','','','','','','','','a','b','v','g','d','e','e','z','i','y','k','l','m','n','o','p','r','s','t','u','f','h','j','i','e','_','zh','ts','ch','sh','shch','','yu','ya' ), $st); return $st; > // Если на каком-то этапе понадобится отладка - раскомментрируйте строку ниже // echo " "; print_r($files); echo ""; if($resultUpload) < // Если файлы были загружены if(!is_dir($uploaddir)) mkdir($uploaddir, 0755, true); // проверяем, была ли создана директория для загрузки файлов foreach($files as $file) < // перебираем массив с файлами if(!empty($file['name'])) < // Проверяем каждый файл на соответствие "хорошим" расширениям, которые мы задавали в настройках выше if(in_array(strrchr(mb_strtolower($file['name']),'.'), $goodFiles)) < // Перемещаем файлы из временной папки сервера, одновременно производим транслитерацию if(move_uploaded_file($file['tmp_name'], $uploaddir.'/'.transl($file['name']))) < $files[] = realpath($uploaddir.$file['name']); // для безопасности сразу всем файлам делаем права только на чтение chmod($uploaddir.'/'.transl($file['name']), 0444); > > else < // Если была попытка загрузки файла с "плохим" расширением $loadError = true; $extension = strrchr($file['name'],'.'); array_push($extensionArr, $file['name']); // формируем массив с "плохими" расширениями echo "b "; // выводим сообщение пользователю echo "$file['name']> - этот файл не загружен, т.к. запрещено загружать файлы с расширением $extension>
"; > > > if($loadError) < echo "
Все остальные файлы успешно загружены!"; $badExtensions = implode("\n", $extensionArr); $htmlStart = ''; $htmlEnd = '
'; // формируем файл в папке с загруженными файлами, что была попытка загрузки файлов с "плохими" расширениями и указываем какие конкретно это файлы FILE_put_contents($uploaddir.'/info.txt', $htmlStart."Клиент пытался загрузить запрещённые файлы:\n$badExtensions>".$htmlEnd, FILE_APPEND); > // ниже формируем строку с ссылкой для браузера, чтобы можно было посмотреть и скачать файлы клиента if(!$ftpAccess) < $message .= "Путь на файлы, отправленные клиентом:
"."ftp://$ftpLogin>:$ftpPass>@$ftpHost>".'/'.$today."/
"."\n"; > else < $message .= "Путь на файлы, отправленные клиентом:
"."ftp://$ftpLogin>:$ftpPass>@$ftpHost>".strstr($uploaddir,'/')."/
"."\n"; > > $subject = "=?utf-8?B?".base64_encode($subject)."? From: $from\r\nReply-to: $from\r\nContent-type: text/html; charset=utf-8\r\n"; // Ниже формируем логи, в которые пишем всю информацию, введённую клиентом, а также информацию о попытке загрузки "плохих" файлов $logText = strip_tags($message); $logFile = strstr($uploaddir, '/'.$today, true)."/mail.log"; FILE_put_contents($logFile, "\n$today>\n$logText>\n", FILE_APPEND); if($loadError) FILE_put_contents($logFile, "$today> была попытка загрузки запрещённых файлов:\n$badExtensions>\n", FILE_APPEND); chmod($logFile, 0600); if(mail($to, $subject, $message, $headers)) < // отправляем письмо администратору с данными из формы, заполненной клиентом $subj = "Ваша заявка принята в работу в ****************"; // вместо звёздочек ставим название организации $subj = "=?utf-8?B?".base64_encode($subj)."? $name>, Ваша заявка принята в работу в ******************.\n
Ожидайте звонок на номер телефона $tel> в течении 8 рабочих часов.\n\nС уважением,\n
НАЗВАНИЕ КОМПАНИИ\n
+7 (***) ***-**-**\n
+7 (***) ***-**-**\n
https://www.*******.ru"; mail($email, $subj, $mess, $headers); // дополнительно отправляем письмо клиенту о том, что его заявка принята в работу echo "$name>, Ваша заявка принята в работу в **************.
Ожидайте звонок на номер телефона $tel> в течении 8 рабочих часов. Письмо с нашими контактными данными направлено на Ваш e-mail $email>"; echo "