Беззащитный category php. Проверенные способы защиты PHP. Избегайте утечек информации

Получает внешний фид и разбирает его на данные (парсит его).

Функция нужна, чтобы получить RSS фид в виде SimplePie объекта и закэшировать результат.

Для получения и парсинга фида fetch_feed() использует популярный класс SimplePie . Фид кэшируется и кэш в последствии обновляется каждые 12 часов.

Данные кэшируются в базу данных во временные опции . Если установлен плагин постоянного объектного кэширования, то функция будет кэшировать не в БД, а в хранилище для объектного кэша.

Возвращает

SimplePie/WP_Error. SimplePie объект данных о фиде или объект WP_Error в случае ошибки.

Использование

$feed = fetch_feed($uri); $uri(строка) (обязательный) Ссылка (УРЛ) на фид который нужно получить. В результате по этой ссылке будет получен создан объект (массив) SimplePie.
По умолчанию: нет

Примеры

#1. Получим последние 5 записей из фида у внешнего сайта

Пример, который получает и выводит на экран ссылки на существующий RSS фид. В примере мы ограничиваем вывод только 5-ю последними записями в фиде.

Поcледние новости с блога blog.ru

get_item_quantity(5); // Создаем массив всех записей фида, начиная с первой записи (0 - начало) $rss_items = $rss->get_items(0, $maxitems); } ?>
    Нет записей."; } else { // Пробегаемся по массиву и выводим ссылку на каждую запись foreach ($rss_items as $item) { ?>
  • get_permalink()); ?>" title="get_date("j F Y | g:i a"); ?>" > get_title()); ?>

#2 Еще один приме: получим 5 записей фида стороннего сайта

Прочитаем фид http://mysite.ru/feed/ и получим из него первые 5 записей.

Include_once(ABSPATH . WPINC . "/feed.php"); $rss = fetch_feed("http://mysite.ru/feed/"); $rss_items = $rss->get_items(0, $rss->get_item_quantity(5)); if (! $rss_items) { echo "no items"; } else { foreach ($rss_items as $item) { echo "

get_permalink() . "">" . $item->get_title() . "

"; } }

Управление временем жизни кэша фидов

Результат получения фида кэшируется на 12 часов. Чтобы изменить время кэша для функции fetch_feed() , нужно использовать хук wp_feed_cache_transient_lifetime .

Add_filter("wp_feed_cache_transient_lifetime", "speed_up_feed", 10, 2); function speed_up_feed($interval, $url) { if("http://mysite.ru/feed/" == $url) return 3600; // 1 час return $interval; }

Отключение кэширования на время разработки

По ходу манипуляций с фидом, необходимо отключить кэширования, а то оно будет сильно мешать. Сделать это можно через хук wp_feed_options

## отключаем кэширование фидов. Только если включен режим разработки WP_DEBUG if(defined("WP_DEBUG") && WP_DEBUG){ add_action("wp_feed_options", function(&$feed){ $feed->enable_cache(false); }); }

ВАЖНО! Обязательно отключите этот код на рабочем сайте. Потому что он может увеличить скорость загрузки страниц сайта в разы!

Кэширование фидов не работает с включенной константой WP_DEBUG

Имейте ввиду, что если включена константа WP_DEBUG , то фид не кэшируется. Срабатывает такой код ядра:

Function do_not_cache_feeds(&$feed) { $feed->enable_cache(false); } if (defined("WP_DEBUG") && WP_DEBUG) add_action("wp_feed_options", "do_not_cache_feeds");

Кэширование в браузере

Также обратите внимание, что кэширование может происходить в браузере, чтобы его обойти обновляйте страницу через ctrl + F5. Или можно добавить такой хук:

## отключим кэширование в барузере для запросов фидов add_filter("wp_headers", function($headers){ if(!empty($GLOBALS["wp"]->query_vars["feed"])){ unset($headers["ETag"], $headers["Last-Modified"]); } return $headers; });

Очистка кэша всех фидов в WordPress

Для запуска кода, нужно добавить в URL параметр?clear_feeds_cache .

## Очистка кэша всех фидов в WordPress if(isset($_GET["clear_feeds_cache"])){ global $wpdb; $cleared = $wpdb->query("DELETE FROM $wpdb->options WHERE option_name LIKE "\_transient%\_feed\_%""); die(var_dump(!!$cleared)); }

Заметка: если на сайте включено объектное кэширование, то этот код не сработает...

Заметки

Список изменений

С версии 2.8.0 Введена.

Код fetch feed : wp-includes/feed.php WP 5.3.2

set_sanitize_class("WP_SimplePie_Sanitize_KSES"); // We must manually overwrite $feed->sanitize because SimplePie"s // constructor sets it before we have a chance to set the sanitization class $feed->sanitize = new WP_SimplePie_Sanitize_KSES(); $feed->set_cache_class("WP_Feed_Cache"); $feed->set_file_class("WP_SimplePie_File"); $feed->set_feed_url($url); /** This filter is documented in wp-includes/class-wp-feed-cache-transient.php */ $feed->set_cache_duration(apply_filters("wp_feed_cache_transient_lifetime", 12 * HOUR_IN_SECONDS, $url)); /** * Fires just before processing the SimplePie feed object. * * @since 3.0.0 * * @param object $feed SimplePie feed object (passed by reference). * @param mixed $url URL of feed to retrieve. If an array of URLs, the feeds are merged. */ do_action_ref_array("wp_feed_options", array(&$feed, $url)); $feed->init(); $feed->set_output_encoding(get_option("blog_charset")); if ($feed->error()) { return new WP_Error("simplepie-error", $feed->error()); } return $feed; }

Все мы, так или иначе, хотели бы быть уверенны в том, что наш сайт или блог никто не сможет взломать. Но увы, реальность такова, что любая система уязвима, как бы сильна она не была бы защищена. Все упирается лишь в ресурсы и в упорство взломщика… Хм… Что то меня не туда потянуло… Будем считать это предисловием =)

Не так давно я писал о том как . Но допустим вы взяли уже готовую CMS и не знаете, как там реализованна загрузка, да и вобще вся защита. Конечно, особо пытливые и грамотные разработчики изучат код этой цмс прежде чем поставят на свой сайт. Но что делать тем у кого нет столько времени?

Хорошо, или допустим вы из тех кто считает что безопасность и правильная настройка сервера лишней не бывает? Если так то добро пожаловать под кат.

Нет, в статье вы не найдете какой-то супер пупер плагин, фильтрующий все данные, который нужно приинклудить ко всем файлам. Моя идея заключается в использовании директивы auto_prepend_file и постройки списка разрешенных файлов… Но в общем читайте сами…

Данная идея у меня давно сидела в голове, но наконец у меня дошли руки, хоть ничего сложного тут и нету, и я смог эту систему реализовать и написать статью =)

Принцип работы

Как я уже говорил выше, система основанна на работе директивы auto_prepend_file в php.ini . Отвечает она за установку скрипта, который будет выполнятся ПЕРЕД выполнением основного.

К примеру вы открыли index.php, а перед его выполнением запускается файл, указанный в auto_prepend_file . Суть в том, что в этом скрипте мы сможем контролировать дальнейшую работу остальных скриптов. Грубо говоря, продолжить работу и запустить запрошенный скрипт, или завершиться сразу (die() ).

К примеру ситуация — злоумышленник залил на ваш сайт шелл через какую нибудь уязвимость и пытается его открыть в браузере. А вместо его шелла, ему, без всяких на то причин, отдается, вот такая вот ошибка:

Меня бы подобное ввело бы в ступор…

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

(Не знаю нужна ли эта диаграмма, вроде бы и так все должно быть понятно…)

Конечно составлять такой список вручную — дело не благородное, поэтому я пришел к выводу, что имеет смысл реализовать так называемый «режим обучения». Режим в котором все обращения ко всем скриптам будут заносится в список разрешенных файлов автоматически.

Что это дает? Вы можете запустить эту систему в режиме обучения и продолжить пользоваться своим сайтом. По мере того как вы будете им пользоваться, ваша база будет пополнятся теми страницами, которыми вы пользуетесь (простите за каламбур). И допустим через месяц — другой у вас в списке будут содержаться все файлы которые имеют отношение к вашему сайту (к которым вы непосредственно обращались).

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

Что умеем

Так как это концепт, то и умеем мы не много.

  • Блокирование неразрешенных скриптов (собственно основная функция). Но опять же это настраиваемо, можно не блокировать соединение, а только лишь уведомлять админа по email
  • Уведомление о нелегитимных запросах администратору по email (краткий отчет или полный отчет, последний включает заголовки пакета и данные POST запроса если таковые имеются)
  • Можно указать IP администратора, который будет иметь доступ к любым скриптам, т.е. данная система его затрагивать не будет (эти IP не будут участвовать в режиме обучения). К примеру теперь не надо закрывать .htaccess -ом софтины типа PhpMyAdmin, SupexDumper и прочие системные утилиты.
  • Ксати Ip адреса поддерживают простенькие маски=)
  • Полностью прокомментированный код, и подробно описанна каждая директива конфигурации
  • Хз что еще…

Настройка

Теперь о том как встроить эту защиту в ваш сайт…

Для этого вам необходим доступ к файлу php.ini

  1. Для начала скачиваем сам скрипт: PrependSecuritySystem
  2. Распаковываем содержимое архива (data.txt и main.php) в какую либо папку на сервере, желательно в папку не доступную из веба (не обязательно, т.к. работать будет в любой, это имеет смысл чтобы убрать скрипт подальше от глаз взломщика)
  3. Открываем файл main.php и редактируем настройки. Необходимо обязательно поменять ip адрес и email админа. Остальные настройки же — по вашему желанию.
  4. Устанавливаем права доступа к распакованным файлам. Под никсами желательно изменить владельца для обоих файлов, отличного от пользователя из под которого работает веб сервер. Для файла main.php необходимо запретить запись для всех. Для файла data.txt необходимо установить права на чтение и на запись для всех (это временно, на период обучения)
  5. Открываем php.ini и вписываем следующее:
    auto_prepend_file=[путь до распакованного файла main.php]
  6. С данного момента начинается обучение системы. Выжидаем определенное колличество времени, достаточное, по вашему мнению, для полного обучения данной системы.
  7. По окончанию обучения открываем файл main.php и редактируем костанту PSS_STATUS_BLOCK , устанавливаем ее значение в true , сохраняем
  8. Изменяем права доступа на файл data.txt. Запрещаем редактирование данного файла для всех.
  9. Теперь система перешла в режим блокирования неразрешенных скриптов

Многовато шагов, конечно, но с этим, как мне кажется, справится даже ребенок.

Если вам необходимо переобучить систему (с нуля или дополнить), то вам необходимо:

  1. Разрешить запись в файл data.txt
  2. Очистить содержимое data.txt (ТОЛЬКО если вам необходимо переобучить систему с нуля)
  3. Отредактировать костанту PSS_STATUS_BLOCK в файле main.php , установив ее значение в false
  4. Проводим переобучение…
  5. По окончанию переобучения редактируем константу PSS_STATUS_BLOCK устанавливая ее значение обратно в true
  6. Запрещаем запись файла data.txt

Ну а теперь о грустном

Лукавить я не буду, и теперь расскажу о недостатках.

  • Пожалуй главный недостаток по сравнению с которым меркнут все остальные, это то, что эту систему можно обойти. Вы спросите: как же так? Все очень просто, директиву auto_prepend_file можно указать и в .htaccess . И если подойти трезво то если злоумышленник вдруг смог залить шелл, то наверняка он сможет залить и свой .htaccess в котором он может отключить оригинальную директиву.
    Это работает только под apache , но к примеру под nginx этот трюк не выйдет (у nginx нет файлов.htaccess). НО! Под Nginx можно вообще залить .
  • Злоумышленник может отредактировать «разрешенный» скрипт если есть допустимые права на это, и с этим наша система ничего, к сожалению, сделать не сможет. Разве что необходимо устанавливать правильные права на все исполнемые файлы
  • Помимо PHP есть еще всякие perl, cgi и прочее… с ними данная система не работает.
  • Дополнительная нагрузка. Но вртяли эта нагрузка будет ощутима.

Именно поэтому, казалось бы такая оригинальная система, не может называться идеальной. Но она вполне подойдет в качестве простой превентивной меры, которая остановит не самых упоротых упертых взломщиков. По крайней мере данная система сможет отнять время у взломщика на проведение атаки. К примеру, система уведомит администратора о попытке взлома, дав тем самым администратору возможность устранить уязвимость до тех пор пока злоумышленник разберется с причиной его неудач.

Заключение

Все же, так или иначе, это концепт, может быть вы сможете придумать на ее основе что то лучшее. А может быть вас устроит моя система.

На мой взгляд разумной защиты много не бывает. Использовать что-либо подобное или нет, у вас на сайтах решать вам.

Фуф. Ну и написал я, почти целый день ушел. Простите если описал несколько сумбурно. В общем задавайте ваши вопросы в комментариях, я постараюсь ответить.

PS: хоть я и кодил максимально адекватно, скрипт может иметь баги. Тестировалось на win/apache/php 5.2 — все было ок.

PHP является одним из самых популярных языков для веб-разработки на данный момент. В результате, хакеры постоянно ищут способы использования PHP сценариев для получения несанкционированного доступа или нанесения ущерба системе. Безопасность PHP кода необходима в любом веб-приложение, которое вы разрабатываете.

Для обеспечения безопасности PHP-приложения существует две основные категории методов защиты кода. Первая категория включает настройку самого интерпретатора PHP через файл php.ini, что оказывает влияние на безопасность приложения в целом. Вторая категория подразумевает использование проверенных методов программирования и написание безопасного кода для предотвращения использования уязвимостей.

Защита PHP с помощью php.ini

В PHP существует целый ряд настроек, которые влияют на безопасность ваших приложений. Этими настройками можно управлять с помощью файла php.ini . Контролируя саму работу PHP, вы снижаете потенциальный ущерб, который могут нанести ошибки.

Запретить Register Globals

До версии 4.2.0, PHP использовал глобальные переменные для предоставления доступа к входным переменным из запросов GET и POST. Эта функция была ликвидирована, поскольку она обеспечивает лазейку в безопасности. Злоумышленники могут использовать его для управления переменными в рамках различных сценариев. Но для обеспечения обратной совместимости PHP позволяет настраивать register_globals в php.ini . Когда эта опция включена, PHP работает в старом режиме и регистрирует глобольные переменные для входных значений. Чтобы обеспечить безопасность PHP, всегда следует выключать эту настройку. Избегайте использования сценариев, которым требуется register_globals, поскольку это обычно является признаком потенциально опасных или редко обновляемых сценариев.

Управление доступом к файлам

PHP-сценарии могут использовать функцию fopen для чтения и записи файлов на файловой системе сервера. Это, конечно, очень нужная возможность. Тем не менее, она также может представлять угрозу безопасности. Ошибка в сценарии PHP может позволить злоумышленнику читать или переписывать системные файлы. К счастью, в PHP есть ряд параметров, которые позволяют контролировать, к каким файлам PHP может получить доступ.

Хотите начать зарабатывать, продвигая свой аккаунт в социальных сетях и используя интернет маркетинг, но не знаете с чего начать? Сайт прайссмм поможет Вам разобраться в таком процессе. Здесь молодой, но достаточно опытный специалист расскажет Вам о том, чего многие до сих пор не знают. Это поможет Вам достаточно быстро поднять рейтинг любой страницы, аккаунта или канала.

Один из вариантов, который можно использовать в php.ini это open_basedir . Данный параметр принимает в качестве значения подкаталог, такой как /home/user/html/ . Ввод/вывод интерпретатора ограничивается указанным подкаталогом, что предотвращает чтение и запись файлов за пределами данного подкаталога с помощью PHP.

Вы можете также использовать параметр safe_mode в php.ini для управления доступом к файлам. В безопасном режиме PHP способен открывать только те файлы, которые принадлежат тому же пользователю, что и веб-сервер. Настройка также предотвращает запуск исполнимых файлов с помощью PHP. Если нужно разрешить PHP доступа к файлам, которые принадлежат разным владельцам, можно использовать safe_mode_gid . Параметр ограничивает доступ в PHP только теми файлами, которые принадлежат группе, под которой работает веб-сервер.

Сокрытие PHP

Хотя обеспечения безопасности путем внесения неясности недостаточно для защиты приложения, это усложнит попытки взлома, поскольку хакеры не будут знать, какие технологии вы используете. PHP выдает себя по ряду признаков, среди которых заголовки и подпись Apache. Это можно отключить с помощью expose_php = off в php.ini .

Ещё один признак, который выдает PHP, это отображение ошибок. Ошибки часто включают в себя информацию о путях и других параметрах, которую хакер найдет неоценимой. Сообщения об ошибках являются бесценными в процессе разработки для тестирования и отладки, но они должны быть выключены при введении приложения в эксплуатацию. Вы можете их отключить, установив: display_errors = Off в php.ini . Полезной функцией является запись сообщений об ошибках в лог-файл, которую можно включить, установив: log_errors = On в php.ini .

Наконец, можно настроить Apache для перезаписи URL, чтобы скрыть расширение PHP.

Использование проверенных методов программирования

После обеспечения безопасности PHP настройкой php.ini, необходимо обратить внимание на сам код. Другим методом защиты PHP является хорошая техника программирования. Есть целый ряд проверенных методов программирования, но не меньше методик, которые нужно избегать.

Контроль POST и передачи форм

Подмена форм (form spoofing) является распространенным видом атаки на веб-сайты.. Обычно это делается путем создания POST-запроса и отправки его по URL адресу, указанному в атрибуте action на форме. Чаще всего, подмена бывает безвредной, но раздражающей, например, когда спамеры отправляют спам сценариям, которые обрабатывают форму обратной связи. Тем не менее, подмена формы может быть опасной. Некоторые разработчики считают, что использование раскрывающегося списка на форме может ограничить пользовательский ввод. После этого они не проверяют данные, введенные пользователем, потому что считают, что форма выполнила проверку для них. Это может быть опасно, если кто-то отправит сценарию данные, не используя форму. Переданные данные не будут ограничиваться списком выбора.

Одним из способов защиты от подмены формы является использование одноразовых маркеров. Генерируйте случайные маркеры и храните вместе с сессией. Затем с помощью скрытых полей ввода отправляйте одноразовые маркеры как часть формы. При обработке формы сравните маркер в сессии и маркер на форме. Если они совпадают, обработайте форму, если нет – выведите сообщение об ошибке. После обработке следует удалить маркер из сессии.

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

Защита баз данных

При работе с базами данных вы не должны использовать динамические SQL операторы, которые основаны на пользовательском вводе. Это создает реальную возможность для злоумышленников направить неправильные данные в базу данных. Иногда вы должны использовать вводимые пользователем данные в запросе SQL. Проверяйте введенные пользователем данные, прежде чем использовать их в запросе. Если база данных MySQL, вы можете использовать функцию mysql_real_escape_string() . Эта функция удалит недопустимые символы, эффективно обрабатывая пользовательский ввод. Если ваш код использует PHP функциональность magic_quotes_gpc , сейчас самое время пересмотреть назначение кода. Использование magic_quotes_gpc будет прекращено в PHP версии 6.

In that particular Category in chronological order, from newest Posts at the top to oldest at the bottom. There are many display choices, including whether to display the complete post or post excerpts, and what additional information to display (title, author, publish date, last modified time, etc.). Each theme makes different choices, and you might want to change them.

This article explains how to change what happens when the blog viewer is visiting one of your site"s Category pages. This involves the use of Themes and Template files, so if you are new to template files, you might want to read and first.

What Template File is Used?

The first step in modifying what happens when someone visits a Category page is to figure out which of your theme"s files is going to be used to display the posts. This is known as the .

In the case of categories, the hierarchy is fairly simple. For instance, suppose the slug of the Category in question is news and the Category ID is 6 . The Template Hierarchy specifies that WordPress will use the first Template file it finds in your current Theme"s directory from the following list:

  1. category-slug.php
  2. category-ID.php
  3. category.php
  4. archive.php
  5. index.php

That is, if you do not have a category-slug.php (lets say category-news.php), WordPress will check for a category-ID.php (like category-6.php), and so on.

So, if you want to make the Category whose ID number is 6 look different from what it is currently (and different from other Category pages), you would want to create a category-6.php file. If you want to make all Category pages look different from other archive pages (such as date and author archives), then you would want to create or modify the category.php file. If you want to make changes to the look of all archive pages, you can create or modify the archive.php file. And if you modify the index.php file, you will affect your entire blog.

If you need to create a new file, it is a good idea to copy it from the next file in the hierarchy that exists. For instance, if you want a special display for Category 6, begin by copying the category.php file, or if you don"t have one, use archive.php , and so on.

Examples

Now that you"ve figured out which template file in your theme"s directory you need to modify, in order to make changes to the look of Category pages, let"s look at some examples. In these examples, when it says "edit your template file", it means to edit the file you chose in the section above.

Adding Text to Category Pages

Static Text Above Posts

Suppose you want some static text displayed before the list of Posts on your Category page(s). By "static", we mean text that remains the same, no matter which posts will be displayed below, and no matter which category is being displayed. Here is how to do it: above section of your Template file, insert the following code:

This is some text that will display at the top of the Category page.

Different Text on Some Category Pages

A slightly more complex possibility is that you want different text to display depending on which category page the visitor is viewing. Then you would add the "default" text to the main category.php file, and create special category-#.php files (with their own version of the text, as described in the Introduction) for each category that needs special text at the top.

This does however create a lot of files in your theme directory, and can be avoided using the following code OUTSIDE the loop:

This is the text to describe category A

This is the text to describe category B

This is some generic text to describe all other category pages, I could be left blank

This does the following. Checks to see if we are looking at Category A, if we are then show the first bit of text, but if we"re not then check if we are looking at Category B. If we are then show that bit of text, and finally, if it is neither Category A or B, then show this default text.

Text Displaying Only on First Page of Archive

Another thing that can happen is that if your Category contains more posts than will fit on one page (according to the Options for Blog Reading you have set in the Administration panels of your blog), the category archive will split into multiple pages. And maybe you only want to display your static text if the viewer is on the first page of results, or you want to display different text for the other pages.

To make this happen, you can use a PHP if statement, which looks at the value of the $paged WordPress variable ($paged is equal to the page number: 1 for the first page of results, 2 for the second page, etc.). It may sound complicated, but it"s actually not too bad. Just put the following above :

Text for first page of Category archive.

Text for subsequent pages of Category. Can be left out.

Category Name

Another possibility is to put the category name at the top of the page. If this is not already part of your template, you can add it by doing something like this, above :

Category:

Modifying How Posts are Displayed

Excerpts vs. Full Posts

Perhaps you are looking to cut down on the size of your Category pages. You could do this by displaying excerpts rather than the entire content of each Post. To do this, you will just need to find where it says inside in your Template, and replace it with . These will most likely be inside PHP tags:

Conversely, if your Theme is currently displaying excerpts and you want full posts, replace the_excerpt with the_content .

Display Images Linking to Full Posts

Another thing that is interesting to do in a category archive page is to replace the post content with an image that links to your post. To do this, you will first need to put images into the Excerpt sections of your posts. Here"s how to do that, for one post:

  1. Upload an image on the post editing screen.
  2. Switch to the "Code" editor, rather than the "Visual" editor.
  3. Use the Uploads / Browse tab to insert the image into your post. Make sure to insert the full-sized image, with no link.
  4. Copy the inserted HTML img tag, and paste it into the "Optional Excerpt" section of the post editing screen.
  5. Finish writing the post content (you can remove the image), and publish the post.

Now you will need to modify your template. We"ll use a trick: the Template Tag does not put a paragraph tag around the excerpt. So we can use it to insert the img HTML and put it inside a link. Here"s what you need to put into your Template, in place of using the_content:

">

Caveat: using the excerpt this way may affect your RSS feed, because it places an img tag in the excerpt, instead of text. So if you are going to do this, you probably want to set your options so that the full posts are put in RSS feeds, rather than excerpts.

What categories do you show to the visitors?

To select which category you would like to see on any page, for instance an archive page, use this.

ID, "posts_per_page" => 5); $myposts = get_posts($args); foreach($myposts as $post) : setup_postdata($post); ?> //Style Posts here

This uses the template tag in order to call an array of posts that adhere to the criteria that you set. In this instance, make sure you change "ID" to the category ID number you wish to show. The posts_per_page parameter simply states how many posts you would like to display from this category. We have set the number here to 5.

PHP - это один из самых популярных серверных языков программирования с открытым исходным кодом. Он используется не только для создания сайтов, но и в качестве языка программирования общего назначения, а также для написания серверной части различных веб-приложений.

Выполнять скрипты на PHP могут веб-серверы Apache, Nginx и Lighttpd. Также PHP может выполняться интерпретатором прямо из командной строки. Но поскольку PHP установлен на сервере, он может создать ряд проблем с безопасностью, поэтому его нужно применять осторожно.

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

Все приведенные ниже советы рассчитаны на то, что PHP работает под управлением Nginx или Apache, сам интерпретатор PHP недоступен из внешней сети. А теперь, перейдем к рассмотрению того как выполняется защита php кода, сайта и сервера в целом.

1. Знайте врага в лицо

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

  • XSS - это уязвимость в веб-приложениях, с помощью которой злоумышленники могут выполнять произвольный JavaScript код в браузере пользователей, и таким образом, украсть его данные. Возникает из-за отсутствия проверки на данных в скриптах на правильность;
  • SQL инъекция - это уязвимость в коде работы с базой данных. Если пользовательский ввод неверно фильтруется скриптом, и используется для формирования запроса к базе данных, то злоумышленники могут выполнить любые запросы к базе данных. Для предотвращения такой проблемы рекомендуется фильтровать данные функцией mysql_real_escape_string() перед отправкой запроса;
  • - позволяет посетителю загружать файлы на ваш сервер. Загрузив определенный тип файлов, пользователи могут получить доступ к системе или даже украсть информацию из базы данных, поэтому нужно следить чтобы можно было загружать только картинки;
  • Удаленное выполнение - злоумышленник может удаленно выполнять php файлы, которые есть на сервере, поэтому вместе с возможностью загрузки PHP файлов это представляет серьезную опасность;
  • Eval() - позволяет выполнить код PHP, переданный в строке, часто используется злоумышленниками, чтобы скрыть свой код на вашем сервере;
  • CSRF атака - позволяет заставить пользователя выполнить нежелательные действия в веб-приложениях. Если пользователь является администратором, это может поставить под угрозу все приложение.

2. Используйте только необходимые модули

Чтобы посмотреть все скомпилированные модули PHP выполните команду:

Рекомендуется использовать только самые необходимые модули, чтобы увеличить безопасность. Например, вы можете отключить модуль sqlite. Для этого можно удалить его конфигурационный файл в /etc/php5/conf.d/. Но для полного удаления нужно пересобрать PHP без этого модуля.

3. Избегайте утечек информации

В конфигурационном файле php.ini есть строчка:

expose_php = Off

Если установлено значение On, то PHP будет отправлять версию PHP в ответ на все запросы в заголовке X-Powered-By. Также рекомендуется скрыть версию Apache и другую информацию. Защита php от взлома, это не только аккуратное программирование, но и сокрытие информации о системе.

4. Отключите динамические расширения

PHP поддерживает динамическую загрузку расширений. По умолчанию загружаются все расширения, конфигурационные файлы которых есть в /etc/php/conf.d/. Также загружаются модули, которые указаны директивой extension в основном конфиге php.ini. Мы можете удалить ненужное.

5. Вывод ошибок

Сообщения об ошибках содержат много информации, не позволяйте их смотреть всем пользователям сайта. Приведите директиву display_errors к такому виду:

display_errors = Off

Убедитесь, что вы сохраняете все ошибки в лог файл:

log_errors = On
error_log = /var/log/httpd/php_scripts_error.log

6. Запретите загрузку файлов

file_uploads = Off

Но если такая функция необходима, то лучше ограничить размер файла:

file_uploads = On
upload_max_filesize = 1M

Пользователи смогут загружать файлы размером не более 1 мегабайт, так безопасность в php будет больше.

6. Отключите удаленное выполнение кода

Если параметр allow_url_fopen включен, php может использовать такие файловые функции, как file_get_contents . С помощью нее скрипт может загружать файлы из удаленных серверов. Программисты часто забывают выполнить надлежащую фильтрацию данных, и тем самым открывают уязвимость. Для отключения измените директиву:

allow_url_include = Off

7. Включите безопасный режим SQL

В безопасном режиме SQL, интерпретатор игнорирует все аргументы, передаваемые в функции mysql_connect и mysql_pcconnect. Но в таком режиме будут работать не все скрипты, например, не будет работать WordPress, так что используйте аккуратно. Для включения добавьте директиву:

magic_quotes_gpc=Off

9. Контролируйте размер POST

Метод POST используется, когда браузер хочет передать веб-серверу определенное количество данных как часть запроса, например, при загрузке файла. Злоумышленники могут использовать большие запросы, чтобы истратить ресурсы сервера. Поэтому размер лучше ограничить:

post_max_size=1K

10. Контролируйте ресурсы

Вы можете указать максимальное время выполнения для каждого скрипта, максимальное количество памяти и максимальное время чтения данных, это увеличит безопасность сайта php в плане DOS атак:

max_execution_time = 30
max_input_time = 30
memory_limit = 40M

11. Отключите опасные функции

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

disable_functions =exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source

12. Настройте Fastcgi для лучшей безопасности

PHP может работать через FastCGI, это уменьшает использование памяти вашего веб-сервера. Нужно включить директиву force_redirect чтобы предотвратить прямое выполнение php скриптов из строки запроса, например, cgi-bin/php/hackerdir/backdoor.php. Для этого добавьте:

cgi.force_redirect=On

13. UID и GID интерпретатора PHP

Если вы используете внешний FastCGI сервер, то нужно чтобы он был запущен не от пользователя root. Запускайте php от имени непривелигированного пользователя. Как вы знаете, у PHP есть функции, которые позволяют выполнять команды оболочки. Очень небезопасно, если они будут выполняться от суперпользователя.

14. Ограничение доступа к файловой системе

Директива open_basedir позволяет установить каталог, в котором php может получить доступ к файлам с помощью таких функций, как fopen, file_get_contents и т д. Если файл находится вне этой директории PHP откажется его открывать. Вы даже не сможете использовать символические ссылки.

open_basedir = "/var/www/html/"

15. Путь для хранения сессий

Нужна не только защита php сайта, чтобы скрипты не смогли причинить вред системе, но и чтобы пользователи не могли получить доступ к файлам php. Сессии в php позволяют сохранить определенную информацию между обращениями пользователя. Путь, где будет храниться эта информация указан в файле /etc/php/php.ini. Убедитесь, что этот путь находится вне /var/www/ и недоступен для чтения или записи для других пользователей системы.

upload_tmp_dir = "/var/lib/php/session"

16. Держите программное обеспечение в актуальном состоянии

Все программы могут содержать различные уязвимости, поэтому важно выполнять регулярное обновление системы, чтобы вовремя применить все патчи безопасности. Нужно обновлять не только PHP, а весь программный стек, в том числе Apache.

17. Используйте SELinux

SELinux - это система безопасности, используемая по умолчанию в RedHat. Ее можно использовать для предотвращения несанкционированного доступа к файлам и ресурсам. Например, вы можете установить политики безопасности для веб-сервера Apache или отдельного сервера PHP. Это тоже отличная защита PHP и не только.

18. Установите mod_security

Это модуль Apache для обнаружения и предотвращения в веб-приложения. Он может защитить php и ваше приложение от XSS и SQL-Inj атак. Например, чтобы не позволять открывать файлы в /etc/ после установки модуля добавьте в конфигурационный файл Apache:

А для предотвращения SQL инъекций:

SecFilter "delete[[:space:]]+from"
SecFilter "select.+from"

19. Просматривайте журналы

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

tail -f /var/log/httpd/error_log
$ tail -f /var/log/httpd/php_scripts_error.log

Выводы

В этой статье мы рассмотрели несколько способов увеличить безопасность сайта PHP. Они помогут вам держать свой сервер в максимальной безопасности. Возможно, это не все доступные варианты, если вы знаете другие способы, напишите в комментариях.

На завершение лекция про безопасность написания скриптов в PHP:

Похожие публикации