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 начнет уходить в историю.
К 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 можно будет получить обновление, только если пользователь платит за продолжающуюся поддержку производителю ОС, отметил Арцишевски.28 мая министр цифрового развития Максут Шадаев выступит на TAdviser SummIT
Любопытно, что среди самых популярных систем управления контентом (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 бинарные сборки создаваться не будут.
Языки программирования
Смотрите также
- Логическое программирование
- Доказательное программирование
- Методология программирования
- Технология программирования
- Программист
Примечания
- ↑ Уязвимость в PHP7 подвергает сайты риску удаленного взлома
- ↑ Around 62% of all Internet sites will run an unsupported PHP version in 10 weeks
- ↑ Началось альфа-тестирование PHP 7.1
- ↑ Корректирующие выпуски PHP 7.0.2, 5.6.17 и 5.5.31 с устранением уязвимостей
- ↑ Релиз языка программирования PHP 7.0
- ↑ PHP 7 работает в два с лишним раза быстрее предыдущей версии
- ↑ Начало альфа-тестирования PHP 7. Новые выпуски PHP 5 с устранением уязвимостей
- ↑ Обновление PHP 5.4.44, 5.5.28 и 5.6.12 с устранением 12 уязвимостей