Безопасный include()

10 Июл 2009
Опубликовано VladSavitsky
Задача: 

Нужно сделать включение файлов (include) максмально безопасным.

Решение:
Функции PHP, которые включают файлы:

  • include
  • include_once
  • require
  • require_once

Суть атак сводится к том, чтобы выполнить код с другого сайта.
Чтобы защититься от подобных атак:

  • Проверять передаваемые данные.
    Делать проверку регулярным выражением или другими средствами данных, которые получает скрипт.
  • Настройки PHP
    Убедитесь, что в файле php.ini указано:
    allow_url_include = Off //запрет включения  файлов по URL (не локальных)
    allow_url_fopen = Off //запрет fopen открывать URL, а только локальные файлы
    register_globals = Off //отключить инициализацию глобальных переменных
    safe_mode = On //включить safe_mode
  • Использовать абсолютный путь.
    Подключатье файл только абсолютным путем. Если файл не существует, то PHP ищет этот файл в папках из include_path.
  • Указывать в коде файлы, которые можно включать
    Если включаемые файлы известны, то стоит использовать switch для проверки.
        global $page;
        switch ($page)  
        {
            case '':
               include ("pages/main.php");
               break;
            case 'page1':
               include ("pages/folder/page1.php");
               break;
        }

    При этом в качетве параметра можно передавать лучше передавать не имя файла, а какой-либо код. Например, md5-сумму пути к файлу.
  • Проверять существование файла.
    Можно проверить функцией file_exists() существование локального файла. Если файлов много, то это может сильно нагружать сервер - используйте осторожно!
  • Ограничивать загружку пользователями произвольных файлов на сервер
    Ограничивать расширения файлов, которые пользователи могут загружать до самых необходимых.

  • Исключить из включения папки, в которые пользователи закачивают свои файлы.
    Не включать файлы из папок, где хранятся файлы, которые загружают пользователи.
  • Не включать файлы из системных папок.
    Чистить пути типа "../../../../usr/local/apache/logs/access.log" функцией stripslashes()

Полезные ссылки:

Использованные материалы: 
Авторы решений:
Темы:
Версия Drupal:

Комментарии

Мне кажется что заголовок материала неверный.
Инклуд и так безопасен. Верно было бы сформулировать так

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

или еще попроще как нибудь.

demimurych | Июл 18th, 2009 в 11:20 после полудня
 
 
 

RSS-лента новостей

Dries Buytaert по-русски
]]>Русский поиск Drupal]]>

Перенос сайта из Joomla в Drupal
Перенос сайта из WordPress в Drupal

]]> Drupal - это бесплатная система управления контентом с открытым исходным кодом ]]>