Вы пытались загрузить файлы которые не являются безопасными joomla
По умолчанию Joomla очень безопасна. Но часто злоумышленники организуют свои атаки через сторонние расширения, разработчики которых пренебрегают правилами безопасности при написании кода. В этом материале мы рассмотрим техники, применяя которые, вы сделаете ваши расширения более безопасными и защитите их от распространённых атак злоумышленников.
Третья (последняя и удачная) загрузить SVG-файл в Медиа-менеджере
В третий раз пытаемся загрузить SVG-файл в Медиа-менеджере:
Что нам и требовалось:
Исправляем ошибку
Открыть для редактирования файл:
/administrator/components/com_jshopping/controllers/update.php
Это всё. Теперь пакеты Joomshopping должны устанавливаться без проблем из “соображений безопасности”.
И ещё раз, лучше устанавливать обновления регулярно!
Если Вы разработчик сайта – делайте все кастомные доработки шаблона Joomshopping и расширений Joomla в своём шаблоне, так, чтобы никакие обновления их не перезаписывали. В Joomshopping есть возможность подключить собственный шаблон движка [components/com_jshopping/templates/your_template]. Cделайте хотя бы простую копию папки [default] и не забудьте про файл стилей в общей папке [/css]. А в основном шаблоне Joomla предусмотрена папка [html], в которой можно разместить шаблоны/макеты любого модуля и плагина Joomla, в том числе и подмену файлов активного шаблона Joomshopping.
В Joomla и других CMS, вебмастера часто сталкиваются с такой проблемой. Разберёмся почему она возникает и как её решить.
Когда мы загружаем какой то файл на сайт или устанавливаем какое то расширение, то со стороны сервера есть ограничение на объём загружаемого файла. Это сделано в целях безопасности.
Ограничение на объём можно изменить в настройках сервера.
Рассмотрим разные варианты:
Меняем поле «Разрешённые типы файлов (MIME)» в настройках «Медиа-менеджера»
По тому, что было выдано в качестве ошибки, менять нужно поле «Разрешённые типы файлов (MIME)», а конкретно, нужно в него внести ещё один MIME-тип: image/svg+xml . Помним про разделитель запятую , и снова жмём кнопку «Сохранить и закрыть» для того, чтобы сохранить внесённые изменения и вернуться в Медиа-менеджер:
Проверяйте загружаемые файлы
Если ваше расширения работает с файлами, то нужно быть предельно осторожными стеми файлами, которые загружает пользователь.
Для того чтобы обезопасить имя загружаемого файла, можно воспользоваться методом makeSafe($file) класса JFile :
- точку в начале имени файла
- точки, стоящие рядом
- все символы кроме латиницы, точки, цифр, нижнего подчеркивания, пробела и тире
Для проверки расширения файла вы можете использовать метод getExt($file) :
Но недостаточно просто проверить расширение загружаемого файла. Необходимо также проверять MIME-тип, так как злоумышленник может передать на сервер исполняемый скрипт, например под видом изображения. Вот пример такой проверки:
Еще одним действенным средством является переименование загружаемого файла, например вот так:
Далее вы сохраняете его название в базе данных и вызываете, где это необходимо, с помощью PHP-кода.
К сожалению и это не всегда спасает. Тогда можно воспользоваться защитой на стороне сервера. Ниже приведен листинг файла .htaccess, который защитит директорию, в которую выполняются публичные загрузки. Директивы также будут распространяться на подпапки:
Как правило, эти директивы работают на всех хостингах. Но если директива SetHandler none не сработает, то можно поменять её на SetHandler default-handler . Обычно default-handler - это простая отдача файлов без обработки. Но если она установлена в режим парсера, то она бесполезна.
Можно также воспользоваться директивой RemoveHandler , но здесь мы не всегда можем быть уверены, что охватили все расширения:
Для веб-сервера nginx придется указывать все папки, которые вы хотите защитить, а также нежелательные расширения файлов:
Если у вас есть другие рабочие примеры защиты директорий, поделитесь ими в комментариях.
Меняем поле «Разрешённые типы файлов (MIME)» в настройках «Медиа-менеджера»
Теперь в настройках «Медиа-менеджера» нас интересует поле «Разрешённые типы файлов (MIME)», в которое нужно вставить один MIME-тип, чтобы он стал legal. Поэтому вносим в это поле ещё одно значение application/zip и помним про то, что значения нужно разделять запятыми , . После этого снова жмём кнопку «Сохранить и закрыть» для того, чтобы сохранить внесённые изменения и вернуться в Медиа-менеджер для третьей попытки загрузить файл с архивом ZIP:
Защита от XSS
Межсайтовый скриптинг (Cross Site Scripting - XSS) означает выполнение скриптового кода в браузере. Такие атаки могут быть использованы для кражи сессионной куки пользователя, что позволит злоумышленнику выдать себя за залогиненого пользователя. Будьте осторожны при выводе пользователю непроверенного ввода. Вот такой код может быть очень опасным для ваших посетителей:
И снова на помощь приходит фильтрация и класс JInput:
Этот код удалит из значения все HTML теги и атрибуты.
Если вам вдруг понадобиться хранить HTML, который вводил пользователь, и далее выводить его, то вы можете использовать PHP-функцию htmlspecialchars():
Но никогда не доверяйте пользователю! Если значение не подразумевает под собой ввод HTML, то это не значит, что пользователь не использует его при вводе. Не забывайте фильтровать все входящие данные.
Если вы используете пользовательский ввод для получения значения для javascript кода, то вы должны быть еще более осторожны, так как простая очистка от HTML не будет достаточной. Например, у нас есть вот такой код:
В этом случае был использован фильтр 'alnum', который удаляет всё, оставляя только символы a-z, 0-9. Здесь нужен такой строгий фильтр, иначе злоумышленник может сделать вот так:
Если использовать фильтр, который удаляет только HTML теги, то это приведет к следующему:
Меняем поле «Разрешённые расширения» в настройках «Медиа-менеджера»
Перейдя в настройки «Медиа-менеджера» добавим расширение svg в поле «Разрешённые расширения». И конечно нужно помнить, что разделителем разрешённых расширений является запятая , и не важно, в каком месте этого поля прописать наше новое расширение.
После того, как изменение внесено, нужно нажать на кнопку «Сохранить и закрыть». Это сохранит внесённые изменения и вернёт нас обратно в Медиа-менеджер. Так удобно сделано в Joomla! =)
Вторая неудачная попытка загрузить файл ZIP архива
Во второй раз пробуем загрузить файл в «Медиа-менеджере»:
И тут нас ждёт новая ошибка:
Ошибка
Illegal mime type detected: application/zip
Радуемся, что с одной ошибкой справились и возвращаемся в настройки Медиа-менеджера как и раньше: кликом по кнопке «Настройки»:
Защита от CSRF-атак
Межсайтовая подделка запроса (Сross Site Request Forgery - CSRF) позволяет злоумышленнику выполнить какие-либо действия на уязвимом сайте от лица жертвы.
Предположим, что супер-пользователь залогинен на сайте, и посещает взломанную страницу на другом сайте, который включает в себя поддельное изображение со следующим источником:
Обозреватель попытается загрузить это поддельное изображение, и, делая это, удалит данные в базе данных компонента (здесь мы предполагаем, что к задаче deleteall привязана функция по удалению данных).
Joomla включает в себя встроенную защиту от таких вещей в виде токена сессии. Для использования этой возможности в вашем расширении вы должны включать токен в любую форму, которое использует ваше расширение:
Далее вы делаете проверку этого токена (например, в контроллере):
Содержание
Защита от прямого доступа
Файлы вашего расширения, как правило, запускаются в Joomla, которая является своего рода оболочкой для вашего расширения. Так как разработчики обычно тестируют свои расширения только через Joomla, они нередко забывают о том, что есть возможность вызвать файлы напрямую. То есть вместо такого вызова:
злоумышленник может сделать так:
Мы видим, что PHP файл будет вызван напрямую, в обход Joomla. Если ваш файл содержит только классы или функции, но не исполняет никакой код, то ничего страшного:
Чтобы защитить ваше расширение от прямого доступа, просто разместите вот эту строку кода в начале PHP файла, который исполняет код:
Это строка должна быть в начале каждого PHP файла, который исполняет код! Если вы не уверены, исполняет ли ваш файл код, все равно используйте эту строку. Хуже не будет.
Третья (последняя и удачная) загрузить файл архива ZIP в Медиа-менеджере
Отточенными кликами по уже знакомым кнопкам в Медиа-менеджере пробуем загрузить ZIP-архив =)
Что в общем-то и требовалось!
Меняем поле «Разрешённые расширения» в настройках «Медиа-менеджера»
Действия, описанные выше приведут на страницу настроек «Медиа-менеджера». Нас должно интересовать поле «Разрешённые расширения». В него нужно ввести наше не разрешённое расширение файла zip .
Помним про то, что разделителем в этом поле разрешений является запятая , поэтому про неё тоже не забываем. В какое конкретно место вставить дополнительное расширение не имеет принципиального значения: можно в начало, в конец или в середину списка.
Чтобы сохранить внесённые изменения в настройках «Медиа-менеджера» и сразу вернуться туда, откуда пришли, (в «Медиа-менеджер» в папку загрузки), нужно нажать на кнопку «Сохранить и закрыть» в верхнем ряду кнопок управления:
Защита от PHP-инклюдинга
PHP-инклюдинг (PHP file inclusion) – это уязвимость, позволяющая выполнить произвольный PHP-код на уязвимом сервере.
Предположим, что вы используете вот такой код для подключения файла разметки:
Тогда взломщик может использовать URL в параметре layout для подключения удаленного файла, например вот так:
Как же от этого защититься?
Самым простым способом будет использование абсолютного пути при подключении файла, чтобы исключить неоднозначность для PHP при поиске файла:
Константы JPATH_SITE и JPATH_ADMINISTRATOR недоступны для манипуляции злоумышленником.
Однако лучшим способом будет фильтрация пользовательского ввода, используя класс JInput, а не чистый массив $_GET .
По умолчанию JInput применяет к пользовательскому вводу фильтр CMD, который разрешает только следующие символы: a-z, 0-9, нижнее подчеркивание, точку и тире. Такая фильтрация предотвращает также обход по директориям, когда взломщик пытается манипулировать путем для включения файла на этом же сервере (локальное подключение файла). Если вы хотите использовать другие фильтры, то более подробное описание класса JInput вы можете найти в нашей документации.
К слову, удаленное включение файлов работает только на тех системах, на которых включена PHP настройка allow_url_fopen . Но так как эта опция необходима некоторым программам, её выключение не всегда является хорошей идеей. Так что вы не должны полагаться на то, что allow_url_fopen будет выключена, и вместо этого писать более безопасный код.
Итак, чтобы обезопасить ваш код от удаленного подключения файлов, вы должны убедиться в том, что вы не используете непроверенный пользовательский ввод при включении файлов. Вы никогда не должны использовать чистые массивы $_GET и $_POST , вместо этого используйте класс JInput для фильтрации пользовательского ввода.
Будьте предельно осторожны с вызовами функций, которые подключают файлы, такие как: include , require , include_once , require_once , fopen . Если вам действительно необходимо подключать файлы с именами переменных, убедитесь в том, что вы валидировали все эти переменные, а также пытайтесь ограничить диапазон разрешенных значений.
Ошибка загрузки файла на хостинге
На виртуальных хостингах обычно нет возможности изменять конфигурационный файл php.ini, в котором хранятся эти ограничения.
Но зачастую в настройках хостинга есть возможность изменять объём загружаемого файла.
Директива называется
Поэтому первым делом зайдите в настройки хостинга и поищите такую опцию.
Если ничего не нашли, то ещё можно попытаться увеличить ограничение через файл .htaccess, который расположен в корневой папке сайта
Для этого в самом начале .htaccess вставляем две строчки:
php_value post_max_size 10M
php_value upload_max_filesize 10M
Обратите внимание что post_max_size должен быть больше или равен upload_max_filesize, 10М - это 10 мегабайт, если нужно больше, ставьте больше.
Если не получается или появляется ошибка, то удаляем эти строчки и пишем в техподдержку хостинга чтобы вам увеличили объём.
А так на нормальных хостингах объём загружаемых файлов довольно большой.
Например на Джино = 50Мб.
Поэтому на нормальных хостингах такая ошибка - редкость.
Вот скриншот настроек сервера на хостинге Джино.
Если вы используете выделенный сервер, то в его панельке управления должна быть такая опция.
Если не можете найти, то сразу пишите в техподдержку.
Не грузятся файлы архивов в формате ZIP
Чтобы было понятно, о чём речь начнём с самого начала. С того, что привело к тому, чтобы найти эту статью. Итак, имеем ситуацию, когда пробуем загрузить ZIP-архив в Медиа-менеджере в Joomla 3:
Ошибка
Данный тип файлов не поддерживается
Вторая неудачная попытка загрузить SVG-картинку
Попытаемся ещё раз загрузить наш SVG-файл:
И снова засада. Новая ошибка:
Ошибка
Illegal mime type detected: image/svg+xml
Делать нечего, снова жмём на кнопку «Настройки», чтобы вернуться в настройки Медиа-менеджера:
Ошибка загрузки файла на сервер на Денвере.
По умолчанию, на локальном сервере, под управлением Денвер, ограничение на объём загружаемых файлов равно 2 мегабайтам.
Если файл или расширение больше двух мегабайт, то загрузить/установить средствами CMS мы его не сможем.
Даже может быть что в настройках Joomla разрешён большой объём файла, но это не важно, потому что в любом случае всё зависит от ограничения на сервере.
Чтобы увеличить объём переходим в папку WebServers/usr/local/php5
Там находим файл php.ini и открываем его при помощи редактора, например NotePad++
Одновременно нажимаем CTRL + F и в появившемся окне вводим:
После чего нажимаем Enter
Это функция поиска по файлу, при помощи неё мы быстренько нашли нужную директиву, которая отвечает за ограничение на объём загружаемых файлов.
Ставьте нужное значение, например 16М, т.е. 16 мегабайт.
На локальном сервере OpenServer такой ошибки быть не должно, т.к. лимит в нём аж 100Мб!
Этого хватит для всех возможных манипуляций с загрузкой файлов.
Негрузятся файлы картинок в формате SVG
В предыдущей статье было рассказано про настройки Медиа-менеджера админки Joomla 3. В этой статье поменяем настройки таким образом, чтобы стала возможна загрузка файлов SVG. (По умолчанию её нет в стандартных настройках.)
Попробуем загрузить SVG-картинку:
При попытке загрузить SVG-файл, Joomla выдаёт:
Ошибка
Данный тип файлов не поддерживается
Значит нам нужно в настройки Медиа-менеджера. Кратчайший путь — это нажать на кнопку «Настройки» в верхнем ряду кнопок управления:
Защита от SQL-инъекций
SQL-инъекции (SQL injections) позволяют взломщику модифицировать некоторые небезопасные SQL-запросы, которые выполняет ваш код. Такие SQL-запросы могут вносить изменения в данные в вашей базе данных или выдавать важные данные взломщику. И снова виновата недостаточная фильтрация пользовательского ввода.
Взгляните на этот код:
Взломщик может передать строку '1 OR 1', и запрос будет иметь следующий вид:
Одним из самых распространённых заблуждений среди разработчиков является то, что SQL-инъекция может использоваться только для манипулирования результатами в оригинальном SQL-запросе, поэтому не такой уж и большой риск, если таблица не важна. Это не так! Включая в свой запрос команду UNION SELECT , злоумышленник сможет получить доступ к любой таблице базы данных. Так что это очень большой риск!
Не будем вдаваться в подробности, так как тема SQL-инъекций достаточно подробно освещена в интернете. Лучше поговорим о защите от этого метода взлома.
А защита тут одна - фильтрация. Фильтруйте весь пользовательский ввод перед тем, как использовать его в SQL-запросе. Применяйте метод quote(), ко всем строковым переменным, используемых в SQL-запросах:
Также используйте приведение типов для всех числовых переменных, используемых в SQL-запросах:
Советуем вам делать это даже тогда, когда вы думаете, что значения не будут получены из пользовательского ввода. Вы не можете знать, как изменится ваш код в будущем.
Возьмите за правило всегда получать любые данные из пользовательского ввода, используя класс JInput, а не чистые массивы $_GET и $_POST . Однако вы не всегда можете положиться на JInput для предотвращения SQL-инъекций. Некоторые инъекционные атаки могут быть выполнены, используя такие символы, которые при определенных обстоятельствах могут быть приняты без проблем. Так что самым надежным способом является применение метода quote() и привидения типов.
Избегайте открытых прав на файлы и папки
Привычка выставлять права в Linux-системах в режим 0777 может привести к плохим последствиям. Это делает файлы и папки доступными для записи с любой учетной записи, которая используется на этом же сервере. Это риск для веб-сайтов, которые располагаются на shared-сервере.
Если поискать в интернете обсуждения на эту тему, то можно увидеть, что некоторые с этим не согласны, потому что PHP-скрипты как правило не могут быть исполнены при правах ниже 0644 для файлов и 0755 для папок. Но этот аргумент совершенно игнорирует не-PHP файлы. Межсайтовый скриптинг обычно совершается через вредоносные HTML и JavaScript, а иногда через зараженные Flash видео и Java апплеты.
Вы никогда не должны создавать в вашем расширении папки с открытым доступом по умолчанию, не уведомив об этом заказчика расширения. Если он согласен на такое, то нет проблем, это его веб-сайт.
Если же вы хотите избежать проблем с правами на папки, используйте chmod для временного изменения прав, а потом возвращайте их обратно. Для этого можно воспользоваться методом setPermissions($path, $filemode = '0644', $foldermode = '0755') класса JPath . Например:
Заключение
Так как мы изменили и сохранили изменения в настройках, то теперь все svg-файлы будут загружаться в Joomla через Медиа-менеджер! =)
В этой статье подробно рассмотрим, как разрешить загрузку архива ZIP в Медиа-менеджере в Joomla 3, так как по умолчанию в настройках «Медиа-менеджер» загрузка архивов запрещена и приходится загружать архивы либо через сторонние приложения, например с помощью ISP-панели сервера, либо используя FTP-клиенты. А пользоваться несколькими приложениями для такой простой операции, как загрузка файла, как минимум неудобно.
Проверяйте привилегии пользователей
Когда вы позволяете пользователям делать определенные действия, такие как создание, редактирование или удаление, вы должны быть уверены в том, что пользователи имеют на это соответствующие права доступа. Важно также закрывать доступ к компоненту в панели управления от пользователей, которые не имеют прав на управление компонентом.
Также убедитесь в том, что вы не показываете пользователю информацию, к которой у него не должно быть доступа. Для получения уровней просмотра, к которым пользователь имеет доступ, вы можете использовать метод getAuthorisedViewLevels() класса JUser :
Ниже приведен пример простого SQL-запроса, который принимает во внимание права категории:
Обратите внимание, что детали контакта и категория проверяются на то, что они опубликованы и находятся в рамках уровня доступа пользователя. Не забывайте, что переменная $text должны быть экранирована.
Joomla ACL – это большая тема для обсуждения, поэтому мы не будем рассматривать её в рамках этого материала. На нашем сайте вы можете найти полный обзор Joomla ACL, а также документацию по использованию ACL в компоненте.
При попытке загрузить некоторые файлы Медиа-менеджером в Joomla 3 выдаётся ошибка и файл невозможно загрузить. Это может быть связано с тем, что не выставлено разрешение на загрузку файлов подобного типа и/или с тем, что размер файла превышает разрешённый. В этой статье подробно рассмотрим, как разрешить загрузку файлов SVG в Медиа-менеджере в Joomla 3.
Резюме
Теперь файлы с архивами ZIP можно будет загружать без дополнительных настроек до тех пор, пока внесённые изменения в полях «Разрешённые расширения» и «Разрешённые типы файлов (MIME)» в настройках «Медиа-менеджера» Joomla будут хранить об этом информацию, внесение которой было описано выше.
TPL_WARP_ON_DATE 14 вересня 2015 .
Обновление Joomla 3.4.4 принесло неприятный сюрприз: разработчики усовершенствовали логику проверки загружаемых файлов. С одной стороны это хорошо, с другой имеем проблемы в Joomshopping.
Предупреждение
Внимание: файл ****.zip не был загружен из соображений безопасности!
Ошибка
Archive does not exist
Archive error
Если Вы пытаетесь установить новое расширение Joomshopping через «Установка и обновление», устанавливаете любой аддон, плагин или его обновление и получили эту ошибку – значит, эта статья для Вас.
Презумпция виновности: Joomla 3 теперь считает php-скрипты подозрительными и некорректная загрузка такого пакета блокируется системой безопасности.
Разработчики Joomshopping исправили эту нестыковку в обновлении движка версия 4.11 и в пакете обновления JoomShopping-update-4.14.3-4.15.0.zip. Поэтому, лучший способ – обновить Joomshopping.
Учитывая, что многие админы не спешат обновлять Joomshopping в связи с многочисленными кастомными доработками, а работать с дополнениями Вам нужно сейчас, далее расскажем, как сделать заплату от этого бага.
Читайте также: