2019/10/28 18:36:07

PHP

PHP: Hypertext Preprocessor (предварительный обработчик гипертекста). Интерпретируемый язык для создания активных веб-страниц, основанный на синтаксисе C, Java, Perl. Код программ на PHP (как и JavaScript, VBScript или ASP Краснодар) вставляется в HTML-код. При запросе пользователя веб-сервер просматривает документ, выполняет найденные в нем PHP-инструкции и результат их выполнения возвращает пользователю. Cтатическая часть документа, написанная на языке HTML, является всего лишь шаблоном, а изменяемая часть формируется при исполнении PHP-инструкций.

Содержание

2019: Уязвимость, предоставляющая возможность удаленного взлома

27 октября 2019 года стало известно, что в ветке PHP 7 выявлена опасная уязвимость (CVE-2019-11043), предоставляющая злоумышленникам возможность выполнять команды на сервере, используя специально сформированный URL.

По данным экспертов, баг уже активно используется в атаках. Процесс его эксплуатации довольно простой, к тому же проблема усугубляется тем, что ранее на портале GitHub был размещен PoC-код для определения уязвимых серверов. Как пояснили специалисты, обнаружив уязвимый сервер, «атакующий может отправить специально сформированные запросы, добавив '?a=' в URL».

Отмечается, что проблема распространяется исключительно на NGINX-серверы с включенным PHP-FPM (программный пакет для обработки скриптов на языке PHP). Уязвимыми являются конфигурации nginx, где проброс в PHP-FPM осуществляется c разделением частей URL при помощи "fastcgi_split_path_info" и определением переменной окружения PATH_INFO, но без предварительной проверки существования файла директивой "try_files $fastcgi_script_name" или конструкцией "if (!-f $document_root$fastcgi_script_name)". Пример уязвимой конфигурации:

Пример уязвимой конфигурации
«
С помощью специально сформированного URL атакующий может добиться смещения указателя path_info на первый байт структуры _fcgi_data_seg. Запись нуля в этот байт приведет к перемещению указателя `char* pos` на ранее идущую область памяти, вызываемый следом FCGI_PUTENV перезаписывает некоторые данные (включая другие переменные ast cgi), - указывается в описании уязвимости.
»

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

Разработчики выпустили патч для данной уязвимости 25 октября 2019 года. Всем пользователям настоятельно рекомендуется обновиться до версий PHP 7.3.11 и PHP 7.2.24[1].

2018: 62% всех сайтов рискуют быть взломанными из-за прекращаемых обновлений PHP

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

Как пишет издание ZDNet со ссылкой на данные W3Techs, к середине октября 2018 года на PHP работает в общей сложности 78,9% веб-ресурсов. 31 декабря завершается поддержка PHP 5.6.x, в результате чего вся ветка PHP 5.x начнет уходить в историю.

График прекращения поддержки различных версий PHP

К 14 октября 62% сайтов используют версии PHP 5.x, которые перестанут обновляться в начале 2019 года. Таким образом, сотни миллионов ресурсов могут попасть под угрозу взлома, если хакеры найдут уязвимости в устаревших версиях этого скриптового языка. Такие неисправности не будут устраняться, начиная с 1 января.

«
Это огромная проблема для экосистемы PHP, — говорит директор по разработкам Paragon Initiative Enterprise Скотт Арцишевски (Scott Arciszewski). — Хотя многие считают, что не могут вот так просто взять и отказаться от PHP 5 в 2019 году, такое решение [прекратить поддержку старых версий PHP] можно назвать беспечным.
»

По словам эксперта, любые крупные эксплуатируемые уязвимости в PHP 5.6 наверняка затронут и более новые версии. PHP 7.2 будет регулярно получать бесплатные патчи от команды PHP, а в случае PHP 5.6 можно будет получить обновление, только если пользователь платит за продолжающуюся поддержку производителю ОС, отметил Арцишевски.Российский рынок HR-tech: оценки, перспективы, крупнейшие поставщики. Обзор TAdviser 100 т

Любопытно, что среди самых популярных систем управления контентом (WordPress, Joomla и Drupal) только Drupal официально повысила минимальные требования для CMS до PHP 7. Это правило вступит в силу в марте 2019 года. К середине октября 2018-го Joomla требует работу сайта на версии не старше PHP 5.3, а минимальное требование WordPress — PHP 5.2.[2]

2016

Альфа-тестирование PHP 7.1

10 июня 2016 года команда разработчиков PHP сообщила о готовности к тестированию первой альфа-версии значительной ветки языка программирования PHP 7.1. Релиз ожидается в ноябре 2016 года [3].


Значимые изменения

  • Добавлен тип возвращаемого значения void, указывающий на то, что функция не вернула значение;
  • При указании смещения внутри строки теперь можно указывать отрицательные значения, позиция в строке для которых будет рассчитана относительно конца строки. Например, для строки 'abcdef' $str[-2] вернёт "e";
  • Добавлен вариант конструкции list(), в которой могут задаваться ключи. Например: "list(1 => $oneBit, 2 => $twoBit, 3 => $threeBit) = $powersOfTwo";
  • Добавлено выражение "[] =", которое выступает альтернативой конструкции "list() =". Например, вместо "list($a, $b, $c) = array(1, 2, 3)" теперь можно указать "[$a, $b, $c] = [1, 2, 3]";
  • Реализована система вывода ошибок и предупреждений в случае использования в математических выражениях строк, не преобразуемых в число. Например, "10 apples" + "5 pears" приведёт к выводу ошибки "Notice: A non well formed numeric string encountered in example.php on line 3", а 5 * "orange" к "Warning: A non-numeric string encountered in example.php on line 3";
  • Возможность обработки нескольких типов исключений в одном выражении catch;
  • Поддержка определения видимости для констант внутри класса. Константы теперь могут определяться с флагами public, private и protected;
  • Возможность использования знака вопроса для пометки типов, которые могут принимать значение null.

Корректирующий выпуск PHP 7.0.2

7 января 2016 года стали доступны корректирующие выпуски языка программирования PHP 7.0.2, 5.6.17 и 5.5.31[4].

В состав выпусков вошли около 30 изменений, устранены шесть уязвимостей:

  • переполнение буфера в функциях escapeshell,
  • неверная обработка типов в XMLRPC,
  • две проблемы с изменением упорядочения пакетов в расширении WDDX,
  • возможность чтения из областей за пределами буфера в gdImageRotateInterpolated,
  • переполнение буфера в FPM.

Заодно устранено несколько ошибок, приводящих к падению интерпретатора и решена проблема с некорректной очисткой устаревших сеансов в расширении Session.

2015

Релиз PHP 7.0.0

3 декабря 2015 года выпущен официальный релиз PHP PHP 7.0.0. В него пошли изменения, подготовленные в рамках проекта PHPNG[5].

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

Изменения в PHP 7:

  • Существенное увеличение производительности, благодаря применению новых методов организации работы с памятью и переходу на новые структуры хранения данных. В некоторых тестах PHP 7 до двух раз быстрее PHP 5.6;
  • Целостная поддержка 64-разрядных типов на 64-разрядных системах. В том числе возможность использования строк, размером до 2^31 байт, поддержка 64-разрядных значений integer при работе в Windows, поддержка больших файлов в 64-разрядных сборках.
  • Возможность обработки через исключения многих ошибок, ранее приводивших к принудительному завершению работы;
  • Новый оператор "??", позволяющий определить альтернативное значение, если не определён первичный объект присвоения. Например, для присвоения пустой строки, если не заполнен элемент ассоциативного массива теперь вместо isset($_GET['mykey']) ? $_GET['mykey'] : можно указать $_GET['mykey'] ?? "";
  • Возможность явного определения скалярных типов int, float, string и bool для аргументов и значений функций (например, "function foo(int $abc): int").
  • Режим жесткой проверки типов, включаемый директивой "declare(strict_types=1)", при котором несоответствие типа передаваемого функции или возвращаемого функцией значения будет приводить к ошибке.
  • Новый оператор комбинированного сравнения "<=>" с реализацией поведения, похожего на strcmp() и version_compare(), но через использование типового синтаксиса операторов сравнения. В частности, новый оператор позволяет не только проверить идентичность операндов, но и оценить какой из них больше другого (0 - равны, 1 - левый больше, -1 - правый больше);
  • Поддержка анонимных классов;
  • Поддержка группировки определений в операторе use (например, use Doctrine\Common\Collections\Expr\{ Comparison, Value, CompositeExpression };);
  • Новый метод Closure::call();
  • Дополнительный синтакс для встраивания unicode-строк \u{xxxxxx};
  • Поддержка задания массивов констант в операторе define();
  • Возможность использования зарезервированных ключевых слов в новых контекстах (например, можно определить функцию forEach и она не будет пересекаться с оператором foreach);
  • Синтаксис "yield from выражение" для делегирования фукциями-генераторами операций в перемещаемые объекты и массивы.
  • В дополнение openssl добавлена поддержка TLS-расширения ALPN (Application-Layer Protocol Negotiation) для согласования протоколов уровня приложений, используемых для обеспечения защищённого соединения. Используется в SPDY и HTTP/2;
  • Унификация синтаксиса определения переменных и переход к использованию AST (Abstract Syntax Tree). Изменение некоторой редкоиспользуемой семантики комбинирования переменных (например, $foo->$bar['baz'] теперь интерпретируется как ($foo->$bar)['baz'], а не $foo->{$bar['baz']}).
  • Прекращение поддержки конструкторов в стиле PHP 4, в которых имя конструктора совпадает с именем класса. Также прекращена поддержка статических вызовов нестатических методов;
  • Прекращение поддержки старых и не поддерживаемых вызовов SAPI и расширений: sapi/aolserver, sapi/apache sapi/apache_hooks, sapi/apache2filter, sapi/caudium, sapi/continuity, sapi/isapi, sapi/milter, sapi/nsapi, sapi/phttpd, sapi/pi3web, sapi/roxen , sapi/thttpd, sapi/tux, sapi/webjames, ext/mssql и ext/sybase_ct;

Преданонс PHP 7

23 апреля 2015 года Расмус Лердорф, создатель скриптового языка PHP, сообщил на конференции O'Reilly Fluent о грядущем выходе новой версии, заявляя что быстродействие среды возросло более чем вдвое: по его словам, именно такое ускорение наблюдалось в реальных веб-приложениях[6].

Выход первого релиз-кандидата PHP 7 запланирован на июнь 2015 года, финальная версия — в октябре 2015 года.

Символ PHP 7, 2015

PHP 7 основан на ветке phpng, созданной для устранения недоработок, связанных со структурами и типами данных, управлением памятью. Как подчеркнул Лердорф, PHP 7 экономнее расходует серверные ресурсы, поэтому на версию 7 надо переходить «всем, кто пользуется большим количеством серверов».

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

В этой версии не будут поддерживаться некоторые функции PHP 4, отметил Лердорф, так что код двенадцатилетней давности может не отработать в новой версии интерпретатора.

Первая альфа-версия PHP 7 стала доступна для тестирования

11 июня 2015 года команда разработчиков сообщила о доступности для тестирования ветки языка программирования PHP 7.0.0 Alpha 1. Релиз запланирован на 12 ноября 2015 года[7].

Значимые изменения:

  • Существенное увеличение производительности, посредством применения новых методов организации работы с памятью и перехода на новые структуры хранения данных. В некоторых тестах PHP 7 до двух раз быстрее PHP 5.6;

  • Целостная поддержка 64-разрядных типов на 64-разрядных системах. В том числе, возможность использования строк размером до 2^31 байт, поддержка 64-разрядных значений integer при работе в Windows, поддержка больших файлов в 64-разрядных сборках.

  • Возможность обработки через исключения многих ошибок, ранее приводивших к принудительному завершению работы;

  • Новый оператор "??", допускающий определение альтернативного значения, в случае если не определён первичный объект присвоения. Например, для присвоения пустой строки, если не заполнен элемент ассоциативного массива теперь вместо isset($_GET['mykey']) ? $_GET['mykey'] : можно указать $_GET['mykey'] ?? "";

  • Реализована возможность явного определения скалярных типов int, float, string и bool для аргументов и значений функций (например, "function foo(int $abc): int").

  • Режим жесткой проверки типов, включаемый директивой "declare(strict_types=1)", при котором несоответствие типа передаваемого функции или возвращаемого функцией значения будет приводить к ошибке.

  • Новый оператор комбинированного сравнения "<=>" с реализацией поведения, похожего на strcmp() и version_compare(), но через использование типового синтаксиса операторов сравнения. В частности, новый оператор позволяет не только проверить идентичность операндов, но и оценить какой из них больше другого (0 - равны, 1 - левый больше, -1 - правый больше);

  • Поддержка анонимных классов;

  • Поддержка группировки определений в операторе use (например, use Doctrine\Common\Collections\Expr\{ Comparison, Value, CompositeExpression };);

  • Новый метод Closure::call();

  • Дополнительный синтакс для встраивания unicode-строк \u{xxxxxx};

  • Поддержка задания массивов констант в операторе define();

  • Возможность использования зарезервированных ключевых слов в новых контекстах (например, можно определить функцию forEach и она не будет пересекаться с оператором foreach);

  • Новый синтаксис "yield from выражение" для делегирования фукциями-генераторами операций в перемещаемые объекты и массивы.

  • В дополнение openssl добавлена поддержка TLS-расширения я ALPN (Application-Layer Protocol Negotiation) для согласования протоколов уровня приложений, используемых для обеспечения защищённого соединения. Используется в SPDY и HTTP/2;

  • Унификация синтаксиса определения переменных и переход к использованию AST (Abstract Syntax Tree). Изменение некоторой редко используемой семантики комбинирования переменных (например, $foo->$bar['baz'] теперь интерпретируется как ($foo->$bar)['baz'], а не $foo->{$bar['baz']}). Достаточно большая порция изменений, нарушающих совместимость;

  • Прекращение поддержки старых и не поддерживаемых вызовов SAPI и расширений: sapi/aolserver, sapi/apache sapi/apache_hooks, sapi/apache2filter, sapi/caudium, sapi/continuity, sapi/isapi, sapi/milter, sapi/nsapi, sapi/phttpd, sapi/pi3web, sapi/roxen , sapi/thttpd, sapi/tux, sapi/webjames, ext/mssql и ext/sybase_ct;

Проведена коррекция версий PHP 5.6.10, 5.5.26 и 5.4.42

11 июня 2015 года стало известно о выпуске корректирующих выпусков языка программирования PHP 5.6.10, 5.5.26 и 5.4.42, где устранены восемь уязвимостей и исправлены около десяти ошибок.

  • В функцию mail() добавлена защита от подстановки дополнительных заголовков.

  • В расширении FTP устранено целочисленное переполнение, которое может привести к выполнению кода.

  • В функции escapeshellarg устранена уязвимость позволяющая осуществить подстановку команд операционной системы при экранировании спецсимволов в аргументах к функции system().

  • Две уязвимости устранены в расширении PCRE (CVE-2015-2325, CVE-2015-2326) и три в Sqlite3 (CVE-2015-3414, CVE-2015-3415, CVE-2015-3416).

Апдейт PHP 5.4.44, 5.5.28 и 5.6.12. Устранены 12 уязвимостей

7 августа 2015 года стали доступны корректирующие выпуски PHP 5.6.12, 5.5.28 и 5.4.44, где устранены двенадцать уязвимостей, исправлена группа ошибок[8].

Большая часть уязвимостей может привести к отказу в обслуживании и проявляется в дополнениях (SPL, GD, SOAP, ODBC и OpenSSL). Уязвимость выявлена и в коде работы с директориями. Не обошлось без уязвимостей в функции серийности данных (unserialize) - 69793 и 70121.

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

2014: Самыми уязвимыми для хакеров оказались сайты на PHP

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

Всего в ходе тестов по анализу защищенности, проводившихся компанией в 2013 году, было изучено около 500 веб-сайтов, для 61 из них проводился более углубленный анализ. Значительная часть исследованных порталов принадлежала банкам — из-за участившихся атак в этой сфере. Также увеличился спрос на анализ безопасности сайтов СМИ, что связано с громкими случаями их взломов и распространения дезинформации. Кроме того, исследовались сайты государственных учреждений, промышленных предприятий и телекоммуникационных компаний.

Выяснилось, что 62% сайтов в 2013 году содержали уязвимости высокой степени риска. Данный показатель существенно выше прошлогоднего (45%). Больше всего приложений с уязвимостями высокой степени риска было выявлено на сайтах СМИ (80%). Что касается сайтов дистанционного банковского обслуживания, то ни одна из исследованных систем ДБО не соответствовала полностью требованиями стандарта безопасности PCI DSS.

Самая распространенная уязвимость 2013 года — межсайтовое выполнение сценариев (Cross Site Scripting) — встречается на 78% исследованных сайтов. Данный недостаток позволяет атакующему влиять на содержимое веб-страницы, отображаемой в браузере пользователя, в том числе с целью распространения вредоносного кода или получения учетных данных жертвы. Например, в случае уязвимой системы интернет-банкинга злоумышленник может сформировать ссылку, относящуюся к реальному сайту банка, при переходе по которой пользователь увидит фальшивую форму авторизации. Введенные пользователем данные будут направлены на сервер злоумышленника.

На втором месте по популярности (69%) — недостаточная защита от подбора идентификаторов или паролей пользователей (Brute Force), например вследствие отсутствия или некорректной реализации механизма CAPTCHA. В топ-10 также вошли две уязвимости высокой степени риска — «Внедрение операторов SQL» (43%) и «Внедрение внешних сущностей XML» (20%).

Самыми небезопасными оказались сайты, написанные на языке PHP: 76% из них содержат критические уязвимости. Менее уязвимы веб-ресурсы на Java (70%) и ASP Краснодар.NET (55%). Опасная уязвимость «Внедрение операторов SQL» встречается на 62% сайтов, написанных на PHP; для других языков данный показатель значительно ниже.

Специалисты Positive Technologies также провели сравнительный анализ тестирования приложений методами черного, серого и белого ящиков. Метод черного ящика подразумевает исследование системы без получения данных о ней со стороны владельца; метод серого ящика предполагает нарушителя, который обладает некоторыми привилегиями в системе; и наконец, метод белого ящика означает анализ с использованием всех внутренних данных о системе, включая исходные коды программ.

Среди веб-ресурсов, исследованных методами черного и серого ящиков, на 60% сайтов нашлись критические уязвимости. Для метода белого ящика этот показатель выше — 75%.

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

2012: PHP 5.4.0

Команда разработчиков PHP анонсировала в марте 2012 года новый релиз популярного языка программирования PHP 5.4.0.

Отмечается, что в этот релиз вошли новые синтаксические конструкции, в числе которых инструментарий для повторного использования кода, называемый трейтом (trait) с поддержкой единого наследования; краткая запись массивов ($a = [1, 2, 3, 4]; или $a = ['one' = 1, 'two' = 2, 'three' = 3, 'four' = 4]) и др.

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

Для удобства разработки и тестирования в режиме командной строки — CLI (Command LineInterface) — в PHP 5.4.0 появился встроенный вебсервер.

Кроме того, в новую версию внесены обратно-несовместимые изменения, предусматривающие следующие изъятия из языка (как устаревшие): использование глобальных переменных (Register_Globals); директиву magic quotes (т.н. `волшебные кавычки`); safe mode (безопасный режим); конструкции break/continue $var; опции allow-call-time-pass-reference.

Сообщается, что версия 5.4.0 будет последней, в которой будут официально поддерживаться ОС Windows XP и Windows 2003. По заявлению разработчиков, для этих ОС в следующих версиях PHP бинарные сборки создаваться не будут.

Языки программирования

Смотрите также

Примечания