Modx не загружает файлы

Обновлено: 05.07.2024

Статья, в которой рассмотрим, как в MODX Revolution создать форму обратной связи (FormIt + AjaxForm) с возможностью прикрепления к ней файлов. Кроме этого, для защиты формы от вложения в неё нежелательных файлов, разработаем дополнительный валидатор, с помощью которого сниппет FormIt будет проверять каждый файл на то, соответствует ли он необходимому размеру и указанному расширению.

Если вы не знакомы с дополнением FormIt, то разбираться с ним желательно начать с изучения статьи, в которой рассматривается создание простой AJAX формы обратной связи. Сам по себе компонент FormIt не обеспечивает работу с ним по технологии AJAX. Для того чтобы это обеспечить можно воспользоваться ещё одним дополнением MODX – AjaxForm.

Разрабатывать контактную форму с вложениями начнём с выполнения подготовительных действий:

1. Создание копии чанка tpl.AjaxForm.example (например, с именем tpl.AjaxForm.Attach ).

2. Создание ресурса, в котором необходимо отобразить контактную форму с вложениями. В ресурсе или связанном с ним шаблоном необходимо поместить вызов сниппета AjaxForm.

3. Разработка чанка tpl.email.attach , который будет определять тело (шаблон) письма.

Прикрепление файлов к форме FormIt

Для отправки формы с вложениями необходимо указать для неё метод кодирования данных multipart/form-data . Это осуществляется в чанке tpl.AjaxForm.Attach .

Добавить к форме файлы, в зависимости от задачи, можно используя следующие варианты:

1. Один файл (в необходимое место HTML формы):

2. Несколько файлов (с помощью нескольких элементов input ):

3. Несколько файлов (с помощью одного элемента input ):

После выполнения 2 этих простых шагов форма обратной связи сможет отправлять письма на указанный адрес электронный почты (email) с вложениями.

MODX - Контактная форма с вложением
MODX - Письмо с контактной формы

Проверка расширений и размеров файлов на сервере

При загрузке файлов на сервер, FormIt не проверяет их тип и размер. Чтобы осуществить данную возможность необходимо написать пользовательский валидатор, который будет проверять загруженные файлы на сервере и выдавать ошибки, если хотя бы один из них не соответствует указанным требованиям. Это позволит защитить форму от нежелательных файлов.

Создадим 2 валидатора (сниппета). Первый (formit2checkfile) предназначен для использования с формой, которая может прикрепить максимум один файл (для 1 варианта). Второй валидатор (formit2checkfiles) будем использовать для проверки массива файлов, т.е. когда на форме используем 2 или 3 вариант.

Код валидатора formit2checkfile для проверки одного файла (не массива):

Код валидатора formit2checkfiles для проверки нескольких файлов (массива):

Настройка вышеприведённых сниппетов осуществляется с помощью изменения значений следующих переменных:

Подключения созданного валидатора к форме осуществляется с помощью параметра customValidators , а файл, который необходимо проверить в параметре validate . При этом если пользователь не указал файл, то валиадатор это не считает это за ошибку. Т.к. прикрепление файла или файлов к форме обратной связи в этом примере считается не обязательным.

Проверка формы с одним файлом ( input с name, равным upload):

MODX - Форма обратной связи (файл не прошёл проверку на сервере - недопустимый тип файла)
MODX - Форма обратной связи (файл не прошёл проверку на сервере - размер файла не укладывается в 512 Кбайт)

Проверка формы с возможностью загрузки нескольких файлов (элементы input с name , равным uploads ):

MODX FormIt - Валидация файлов вложенных в форму на сервере

MODX Revolution: ошибка "Добавление этого типа файлов не допускается"

Собственно, способов два:

  1. Закачать файлы на сайт по протоколу FTP (SFTP);
  2. Изменить настройки MODX Revolution.

Закачка файлов по протоколу FTP (SFTP)

Тут всё довольно просто. Сделать это можно через любой удобный FTP-клиент или даже без него. Вряд ли этот способ нужно описывать подробно. Скажу лишь, что лично я предпочитаю протокол SFTP. О том, как настроить подключение через SFTP в FileZilla, можете прочитать в статье по этой ссылке.

Настройка MODX Revolution

Данный способ является оптимальным, если Вы привыкли закачивать файлы на сайт через админку CMS и часто закачиваете файлы тех типов, которые MODX Revolution по умолчанию закачивать запрещает.

Откройте системные настройки CMS, щелчком по пиктограмме шестеренки вызвав меню.

MODX Revolution: ошибка "Добавление этого типа файлов не допускается"

В них откройте раздел Файловая система и найдите параметр Разрешённые к загрузке файлы (можно выполнить поиск по ключу upload_files).

MODX Revolution: ошибка "Добавление этого типа файлов не допускается"

Обратите внимание на похожие параметры upload_flash, upload_images и upload_media. Первый отвечает за то, файлы какого типа можно загружать в каталог assets/flash/, второй за то, что можно закачать в assets/images/, ну а третий касается каталога assets/media/. Есть в данном разделе и другие интересные параметры, определяющие, например, максимально допустимый размер загружаемых файлов или то, допускает ли CMS использование диспетчера файлов как такового.

Этот документ охватывает довольно техническую тему, и любителям не рекомендуется пытаться это сделать. Новичкам в командной строке лучше всего доверить это профессиональному системному администратору или их хостинг-компании. Редактирование файлов конфигурации через командную строку может быть опасным, и вы можете разрушить свой сервер!

ModSecurity (aka mod_security или mod_sec)¶

ModSecurity - это брандмауэр веб-приложений с открытым исходным кодом, который работает как серверный модуль Apache. Он реализует исчерпывающий набор правил, реализующих усиление защиты общего назначения, и тем самым помогает исправлять распространенные проблемы безопасности веб-приложений. Он устанавливает внешний уровень безопасности, который повышает безопасность, обнаруживает и предотвращает атаки до того, как они достигнут веб-приложений. Он обычно доступен в системах cPanel как модуль EasyApache. Это хорошо зарекомендовавший себя модуль безопасности, который действительно может помочь защитить ваш сайт от распространенных векторов атак.

Мы подробно обсуждаем ModSecurity здесь, потому что менеджер MODX Revolution выдает много запросов, которые могут противоречить правилам mod_security .

Тихий убийца¶

Менеджер MODX может просто спокойно выйти из строя, если одно из его действий заблокировано mod_security . Знай свой сервер! Проверьте журналы ошибок Apache! На карту поставлено ваше здравомыслие!

Как я узнаю, что у меня установлен ModSecurity?¶

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

Если у вас есть собственный сервер (например, созданный на основе шаблона VPS), вы можете войти на сервер и проверить это самостоятельно.

Проверка на сервере WHM¶

Многие VPS включают административные панели WHM/cPanel. Относительно легко проверить, запускаете ли вы mod_security на сервере WHM.

  1. Войдите в свой экземпляр WHM (обычно по адресу https://yoursite.com:2087/).
  2. Найдите раздел "Плагины" на левой панели навигации.
  3. Если ModSecurity установлен, вы увидите Mod Security в списке ваших плагинов.


Проверка через командную строку¶

Если у вас есть SSH-доступ к вашему серверу, вы можете проверить, какие модули Apache загружает при запуске. Чтобы распечатать, какие модули загружены в Apache, вы можете использовать утилиту apachectl в системах *NIX, например

Или, если ваша команда apachectl отсутствует в вашем текущем $PATH , вам может потребоваться указать полный путь к утилите. Чтобы найти путь, вы можете найти его с помощью команды find:

Затем, когда вы найдете полный путь к утилите, вы можете выполнить команду подробно, например:

Результат будет примерно таким:

Модуль mod_security указан как security2_module

Другой разведчик¶

Если у вас нет утилиты apachectl или вы не можете ее найти, вы можете вручную проверить файлы конфигурации Apache. Его можно настроить по-разному на разных серверах, но в целом Apache настроен на загрузку своего основного файла конфигурации, а затем при необходимости будет сканировать дополнительные каталоги на предмет дополнительных файлов конфигурации.

Лог-файлы¶

После того, как вы убедились, что ModSecurity действительно запущен, вы захотите проверить свои журналы, чтобы увидеть, действительно ли ваши действия в диспетчере MODX вызывают срабатывание сигнализации системы безопасности. Лучше всего это сделать через командную строку: используйте SSH для входа на свой сервер и убедитесь, что у вас есть соответствующий доступ (например, привилегии root) для просмотра этих файлов журнала.

Основной журнал, за которым вы хотите следить, - это журнал ошибок Apache. Точное расположение настраивается в вашем файле конфигурации Apache, но часто оно находится внутри /usr/local/apache/logs/error_log. Хороший способ просмотреть этот файл - использовать утилиту tail. Вы можете отслеживать файл в режиме реального времени, используя флаг -f, например

Держите это окно открытым при навигации по диспетчеру MODX и будьте начеку, если в этом файле появятся какие-либо ошибки. (Нажмите ctrl-C, чтобы закрыть утилиту).

Вы также можете посмотреть содержимое журнала mod_security . Опять же, местоположение можно настроить, но часто оно сохраняется в /usr/local/apache/logs/modsec_audit.log

Пример ошибки¶

Если вы действительно видите, что ошибки регистрируются в журнале ошибок Apache, когда вы пытаетесь выполнить определенное действие в диспетчере MODX, велика вероятность, что ModSecurity просто помешал вам сделать что-то в диспетчере.

Вот пример ошибки из журнала ошибок Apache:

Из этой ошибки нам нужно 3 части информации, чтобы внести конкретное действие в белый список. Обратите внимание на следующие 3 пункта:

Это говорит о том, какое правило сработало, в каком домене оно сработало и из какого места внутри этого домена сработало правило.

Внесение правила для домена в белый список¶

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

Восстановите конфигурацию Apache¶

Если вы используете сервер cPanel, вы можете перестроить файл, выполнив следующую команду:

Цель здесь - убедиться, что ваш существующий файл конфигурации Apache зарезервирован и работает перед тем, как мы попытаемся изменить его.

Отредактируйте файл виртуальных хостов¶

Основываясь на этой директиве VirtualHosts, мы можем обратить внимание на 2 указанных каталога:

Вы также можете установить общие серверные правила в файле:

Добавить правило белого списка¶

Общий пример¶

Общее правило белого списка выглядит так:

Конкретный пример¶

Обратите внимание, что он ссылается на коннектор MODX по его пути и ссылается на правило ModSecurity по его идентификатору.

Остерегайтесь перемещения вашего сайта¶

Если вы переместите свой сайт в новый каталог или каталог ** коннекторов ** в нестандартное место, вам придется отредактировать свои правила! Они применяются к определенному URL-адресу, поэтому, если ваши URL-адреса изменятся, правила придется обновить.

Более широкий пример¶

Может быть неприятно просматривать функциональность MODX по одному экрану администратора за раз, но, похоже, есть некоторые трудности с занесением в белый список целых каталогов. Подумайте о переименовании вашего каталога «коннекторов» (см. Укрепление MODX Revolution).

Перезагрузите Apache¶

После внесения изменений в файлы конфигурации вам необходимо перезапустить Apache, чтобы конфигурации можно было перечитать.

cPanel: перестроить файл Conf¶

Если вы не используете сервер cPanel, пропустите этот шаг и просто перезапустите Apache.

Перезагрузите Apache¶

После внесения изменений перезапустите процесс Apache:

Если в ваших файлах есть ошибки, вы будете предупреждены о них. Это может нервировать, потому что, если Apache не вернется в сеть, ваш сайт будет недоступен!

Статические ресурсы¶

ModSecurity может повлиять на ваши статические ресурсы MODX (или любой PHP-скрипт, который читает файл для загрузки пользователем). Что может случиться, так это то, что если ваш файл слишком большой, загрузка будет преждевременно прервана, и вы получите поврежденный файл. Часто размер загруженного файла составляет всего около 64 КБ, даже если исходный файл может быть значительно больше. Если вы столкнулись с этим, это может быть хорошим намеком на то, что ModSecurity вмешивается. Для этого может не быть записи в журнале (. ), поэтому может быть очень сложно отследить это поведение обратно в ModSecurity!

В WHM вы можете редактировать параметры конфигурации ModSecurity, щелкнув ссылку плагина «Mod Security» (изображенную ранее на этой странице) и нажав кнопку «Изменить конфигурацию».

Детали конфигурации, которые могут повлиять на ваши загрузки, следующие:

  • SecRequestBodyAccess
  • SecRequestBodyLimit
  • SecRequestBodyInMemoryLimit

Простое решение - полностью обойти ModSecurity для таких загрузок:

Другой причиной этого загадочного симптома может быть конфликт между веб-серверами: например, если у вас установлены Apache и NGINX на одном сервере, _ убедитесь, что они оба не используют сжатие gzip_ - результат может быть очень похож на вмешательство ModSecurity! Если NGINX сжимает большой статический ресурс, а затем Apache также пытается его сжать, это не удается, и файл заканчивается обрезанием до 64 КБ.

All things dev-related for MODX Revolution, including what’s next.

The whys and hows of the xPDO Object-Relational Bridge (ORM)

Community support for MODX Evolution

All things dev-related for MODX Evolution, including Evo Add-ons

Thoughts, discussions and ideas about MODX Cloud. Feel free to discuss or ask any questions related to MODX Cloud. For specific account support in MODX Cloud please click the Help button at the right of the Dashboard.

General project talk, questions and discussions.

Non-bug-related questions and discussions not specific to Revo or Evo. (How do/should I . ?)

Design, theming and template topics for Revo or Evo, Manager or front end.

Instructions, Demos, Insight and How-Tos.

Introduce yourself and discuss living from building the web … occasional tangents and non-sense expected.

Organize a meetup with other MODXers in your area and other ways of making analog MODX connections.

A Special Interest Group dedicated to Add-on developers.

Php offloading considerations for add-ons developers

A Special Interest Group for those crafting what comes next in MODX.

What I want to see in MODX3? MODX & The small things.

A Special Interest Group for documentation aficionados.

Discussions related to accessibility and MODX.

A Special Interest Group for discussing user experience and user interface in MODX.

Handling multiple languages and cross-cultural issues.

Parlez vous français?

На одной странице сниппет отрабатывает, на другой - нет

Using Snippets, Plugins and other Add-ons downloaded or installed with the Package Manager

MODX Gallery fail to open ..//core/components/gallery/controllers/.class.php file

Snippet-speak, extending the Core via Plugins, and integrating with other applications.

Support topics for Snippets, Plugins and Other Resources in the Download Repository. (Specific categories below)

Dynamic menus builders, link generators and content navigation.

Make or re-use content found in your site. Includes user blogging (Ditto), commenting (Jot), text summarization or formatting and other similar tools. Also includes "front end" content creation and editing (including QuickEdit).

[Collections] How to get pagetitle from the id on the collections view ? 0 Users, Authentication & Personalization

Anything dealing with users, including login, retrieving user info and personalization systems.

Getting lots of fake registrations using the Login.Register extra

Community-builders including Forums, Polls, Calendars, Address Books and more.

Ребятки, статья довольно старая, вот новый улучшенный способ. Позже переводу тоже.

При обновлении сего сайта, передо мной встала задача организовать загрузку файлов к статьям. Дабы не ворошить каждый раз файловую систему и не копаться в файлах и папках проекта, я использовал MIGX, для загрузки файлов.

  • Загружать файлы по одному или путем "перекидывания" в браузер (мульти-загрузка);
  • Создавать для каждого ресурса уникальную папку загрузок, по id;
  • Прикрепленные файлы, можно отдельно выводить списком, при помощи снипета для вывода данных MIGX;
  • Создавать превьюшки для изображений.

После установки MIGX, идем в Инструменты → Источники файлов

Создаем новый источник файлов с именем: FileUpload. Тип источника файлов - файловая система.

Создаем новый источник файлов

После создания отредактируем более развернуто, меняем или если их нет, создаем следующие настройки:

assets/files/ - это папка для загрузки, ее следует тоже создать и открыть для записи.

создаем следующие настройки

Создадим новый TV, с параметрами:

  • Имя: fileUpload
  • Название: Файлы
  • Параметры ввода → Тип ввода: Migx
    • Конфигурации: fileUpload

    Само собой выберем шаблон для которого этот TV выводить. После чего идем в настройки MIGX, у меня это Компоненты → MIGX. Выбираем вкладку MIGX и создаем новую конфигурацию: fileUpload, настройки не трогаем и сохраняем.

    По созданной конфигурации кликаем правой кнопкой мыши и выбираем Импорт/Экспорт. Куда копируем следующие настройки:

    После всех действий в дополнительных полях появится вот такой загрузчик:

    Удобный загрузчик файлов для modx revolution средствами MIGX

    При редактировании/добавлении файлов, не будет ничего лишнего, только файлы загруженные к данному ресурсу:

    Удобный загрузчик файлов для modx revolution средствами MIGX

    Для русификации кнопок добавить в файл /core/components/migx/lexicon/ru/default.inc.php

    В итоге имеем кнопки:

    • Добавить → добавляет файл в сетку с описанием и названием;
    • Загрузить файлы → открывает окно загрузки и показывает уже загруженные файлы;
    • Импорт из файловой системы → Импортирует все загруженные файлы в сетку.

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

    Читайте также: