- PVSM.RU - https://www.pvsm.ru -
Свежая подборка со ссылками на новости и материалы. В выпуске: релиз PHP 8.0.1, MySQL движок на PHP от Vimeo и другие релизы, обновленный Enum и свежие предложения для PHP 8.1, «уязвимость» в Laminas, инструменты, статьи, видео, PHP Дайджест Live в 20:00 МСК.
Приятного чтения!
http://php.net@aliyun.com/aaa.do
. В 8.0 и 7.4 еще дополнительно пачка исправленных багов. value()
теперь просто свойство. Обзор предложения был в выпуске № 194 [9] и на стриме [10].В обсуждении указали на то, что библиотека молодая и не доступна во многих инсталяциях. Поэтому пока лучше предоставлять ее в виде PECL расширения, а забандлить позже.
variadic_function(...['apple', 'banana', 'lemon']);
А в PHP 7.4 то же самое в массивах:
$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];
Но оба случая не поддерживали массивы со строковыми ключами. И поскольку с добавлением именованных аргументов в PHP 8.0 уже решен первый случай, то теперь нет причин сохранять ограничение для второго.
В PHP 8.1 предлагается разрешить распаковку массивов со строковыми ключами:
$array1 = ['a' => 'apple', 'p' => 'pear'];
$array2 = ['b' => 'banana', 'o' => 'orange'];
$array = [...$array1, ...$array2];
// Приблизительно то же самое что:
$array = array_merge($array1, $array2);
htmlspecialchars()
почти всегда используется с флагами ENT_QUOTES
и ENT_SUBSTITUTE
:
• ENT_QUOTES — WordPress [16]
• ENT_QUOTES — Blade (Laravel) [17]
• ENT_QUOTES | ENT_SUBSTITUTE — Twig (Symfony or Slim) [18]
• ENT_QUOTES | ENT_SUBSTITUTE — CodeIgniter [19]
• ENT_QUOTES | ENT_SUBSTITUTE — CakePHP [20]
• ENT_QUOTES | ENT_SUBSTITUTE — Yii [21]
Предлагается сделать эти флаги включенными по умолчанию.
$GLOBALS
начиная с PHP 8.1
$GLOBALS['x'] = 1;
echo $GLOBALS['x']
isset($GLOBALS['x']);
unset($GLOBALS['x']);
А вот попытка изменить саму переменную $GLOBALS
вызовет ошибку:
$GLOBALS = [];
$GLOBALS =& $x;
$x =& $GLOBALS;
unset($GLOBALS);
Также ошибка будет, если передать $GLOBALS
по ссылке в функцию:
asort($GLOBALS);
// > Compile-time error
Все это упрощает внутренности PHP и улучшает производительность операций с массивами в PHP.
true
, если передать в нее массив с последовательными целочисленными ключами 0, 1, 2 ... count($value)-1
. Функция переименована из is_list()
в array_is_list()
. О причинах было подробнее на стриме [26].
В Symfony уже успели сделать полифил для PHP 8.1 [27] с этой функцией.
ray($anything)
в своем коде, и при запуске PHP-скрипта оно красиво отображается в отдельном десктопном приложении.
Если вы осилили Xdebug, то вряд ли это имеет смысл. А если отлаживаете в стиле var_dump(...)/die()
, то может быть интересно.
Смотрите подробный видеообзор на английском [32] или на русском в ближайшем PHP Дайджест Live [33].
class MyClassWithToString {
public $name;
public function __construct($name) {
$this->name = $name;
}
public function __toString() {
return (string) $this->name;
}
}
$input = unserialize('O:19:"MyClassWithToString":1:{s:4:"name";s:15:"/tmp/etc/passwd";}');
if ($input instanceof MyClassWithToString) {
unlink($input);
}
Во фреймворк запушили исправление [57] с проверкой на is_string()
перед тем как делать unlink()
. Но если посмотреть внимательнее, то уязвимость касается десериализации данных от пользователя. А на php.net красным написано, что не стоит использовать unserializie()
в подобных случаях.
Более того, с 2017 года [58] ошибки десериализации больше не считаются ошибками безопасности, просто потому что unserialize()
никогда не будет безопасным (не только в PHP).
Вот еще свежий пост об эксплуатации подобных багов [61] на примере Yii.
Во второй части [66] Лари рассматривает все идеи из первого поста на примере PSR-7.
Сегодня будет третий стрим по мотивам PHP Дайджеста. Разбор новостей и ссылок из выпуска с подробностями и деталями, обзор присланного, интересное но не вошедшее в выпуск, результаты розыгрыша и новый конкурс со слониками.
Начало в 20:00 Москва, Минск / 19:00 Киев.
Если вы заметили ошибку или неточность — сообщите, пожалуйста, в личку хабра [77] или телеграм [78].
Больше новостей и комментариев в Telegram-канале PHP Digest [79].
Прислать ссылку [80]
Поиск ссылок по всем дайджестам [81]
← Предыдущий выпуск: PHP Дайджест № 195 [82]
Автор: Роман Пронский
Источник [83]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/php-2/360571
Ссылки в тексте:
[1] PHP 8.0.1: https://www.php.net/ChangeLog-8.php#8.0.1
[2] 7.4.14: https://www.php.net/ChangeLog-7.php#7.4.14
[3] 7.3.26: https://www.php.net/ChangeLog-7.php#7.3.26
[4] CVE-2020-7071: https://security.archlinux.org/CVE-2020-7071
[5] Итоги года в PHP мире: https://habr.com/ru/company/skyeng/blog/535894/
[6] перенесена в Git:: https://externals.io/message/112662
[7] github.com/php/doc-base: https://github.com/php/doc-base
[8] [RFC] Enumerations, Round 2: https://wiki.php.net/rfc/enumerations
[9] № 194: https://habr.com/ru/post/532950/
[10] на стриме: https://youtu.be/i9iC58z0yHE?t=2208
[11] [RFC] Bundling ext/simdjson into core: https://externals.io/message/112638
[12] simdjson: https://github.com/simdjson/simdjson
[13] в разы быстрее: https://github.com/php/php-src/pull/6551
[14] [RFC] Array unpacking with string keys: https://wiki.php.net/rfc/array_unpacking_string_keys
[15] [PR] Use 'ENT_QUOTES|ENT_SUBSTITUTE' for HTML encoding and decoding functions: https://github.com/php/php-src/pull/6583
[16] WordPress: https://developer.wordpress.org/reference/functions/esc_html/
[17] Blade (Laravel): https://github.com/illuminate/support/blob/master/helpers.php#L118
[18] Twig (Symfony or Slim): https://github.com/twigphp/Twig/blob/3.x/src/Extension/EscaperExtension.php#L243
[19] CodeIgniter: https://github.com/codeigniter4/CodeIgniter4/blob/develop/system/ThirdParty/Escaper/Escaper.php#L120
[20] CakePHP: https://github.com/cakephp/cakephp/blob/master/src/Core/functions.php#L67
[21] Yii: https://github.com/yiisoft/yii2/blob/master/framework/helpers/BaseHtml.php#L111
[22] [RFC] Restrict $GLOBALS usage: https://wiki.php.net/rfc/restrict_globals_usage
[23] [RFC] Concepts to improve mysqli extension: https://wiki.php.net/rfc/improve_mysqli
[24] mysqli: https://www.php.net/manual/en/intro.mysqli.php
[25] [RFC] Add array_is_list(array $array): bool: https://wiki.php.net/rfc/is_list
[26] на стриме: https://youtu.be/mvjj_YX_BqQ?t=1946
[27] полифил для PHP 8.1: https://github.com/symfony/polyfill-php81
[28] xxHash: https://php.watch/versions/8.1/xxHash
[29] MurmurHash3: https://php.watch/versions/8.1/MurmurHash3
[30] Dump Debugging Evolved — Ray: https://freek.dev/1868-introducing-ray-a-debugging-tool-for-pragmatic-developers
[31] Ray: https://myray.app/
[32] видеообзор на английском: https://www.youtube.com/watch?v=8F2SrxB4O2E
[33] PHP Дайджест Live: #digest-live
[34] AdamGaskins/barcoder: https://github.com/AdamGaskins/barcoder
[35] vimeo/php-mysql-engine: https://github.com/vimeo/php-mysql-engine
[36] есть ограничения: https://github.com/vimeo/php-mysql-engine#caveat-emptor
[37] jvoisin/snuffleupagus: https://github.com/jvoisin/snuffleupagus
[38] mbunge/php-attributes: https://github.com/mbunge/php-attributes
[39] атрибутов PHP 8: https://www.php.net/manual/ru/language.attributes.php
[40] mlocati/docker-php-extension-installer: https://github.com/mlocati/docker-php-extension-installer
[41] php-opencv/php-opencv: https://github.com/php-opencv/php-opencv
[42] Примеры: https://github.com/php-opencv/php-opencv-examples
[43] 5 новых фишек, которые можно делать на Symfony 5.2 + PHP 8.0: https://tomasvotruba.com/blog/2020/12/21/5-new-combos-opened-by-symfony-52-and-php-80/
[44] How to create service bundles for a Symfony application: https://macrini.medium.com/how-to-create-service-bundles-for-a-symfony-application-f266ecf01fca
[45] Неделя Symfony #732 (4-10 января 2021): https://symfony.com/blog/a-week-of-symfony-732-4-10-january-2021
[46] Итоги 2020 для Symfony: https://symfony.com/blog/symfony-2020-year-in-review
[47] Создаём REST API с помощью: https://phpprofi.ru/blogs/post/121
[48] tailflow/laravel-orion: https://github.com/tailflow/laravel-orion
[49] Laravel–Дайджест (28 декабря 2020 – 10 января 2021): https://habr.com/ru/post/536628/
[50] lorisleiva/laravel-actions 2.0: https://github.com/lorisleiva/laravel-actions
[51] Подкаст Тейлора Laravel Snippet #26: https://blog.laravel.com/laravel-snippet-26
[52] Новости Yii 2020, выпуск 8: https://habr.com/ru/post/535580/
[53] E-commerce сайт на Yii 2 : https://www.youtube.com/watch?v=eQdDBhQpU9o&list=PLLQuc_7jk__UvpbpU3no5zveJQAwID48B
[54] thecodeholic/yii2-ecommerce-website: https://github.com/thecodeholic/yii2-ecommerce-website
[55] Итоги 2020 для Laminas Project: https://www.zend.com/blog/laminas-2020
[56] В Zend Framework / Laminas зарепортили уязвимость: https://www.bleepingcomputer.com/news/security/zend-framework-disputes-rce-vulnerability-issues-patch/
[57] исправление: https://github.com/laminas/laminas-http/pull/48
[58] с 2017 года: https://externals.io/message/100147
[59] https://t.co/8GZb1xqE1u: https://t.co/8GZb1xqE1u
[60] August 10, 2017: https://twitter.com/nikita_ppv/status/895571304325062656
[61] пост об эксплуатации подобных багов: https://blog.redteam-pentesting.de/2021/deserialization-gadget-chain/
[62] Swoole PHP 4.6.0: https://www.swoole.co.uk/article/v4-6-0-released
[63] amphp/mysql-dbal: https://github.com/amphp/mysql-dbal
[64] Масштабирование PHP FPM в Kubernetes в зависимости от нагрузки: https://blog.wyrihaximus.net/2021/01/scaling-php-fpm-based-on-utilization-demand-on-kubernetes/
[65] Свойства объекта и иммутабельность: https://peakd.com/hive-168588/@crell/object-properties-and-immutability
[66] второй части: https://peakd.com/hive-168588/@crell/object-properties-part-2-examples
[67] Фундаментальный пост о работе с двоичными и битовыми данными в PHP: https://thephp.website/en/issue/bitwise-php/
[68] У Вас проблемы с legacy — значит, Вам повезло! Распил монолита на PHP: https://habr.com/ru/post/536238/
[69] PHP Дайджест Live #2: https://www.youtube.com/watch?v=mvjj_YX_BqQ
[70] Прагматичное введение в Event Sourcing: https://www.youtube.com/watch?v=xHbP3bshU3U
[71] EventSaucePHP/EventSauce: https://github.com/EventSaucePHP/EventSauce
[72] Видео-код-ревью от Mathhew Napoli: https://www.youtube.com/watch?v=GqUvoK7PfOA
[73] m50/simple: https://github.com/m50/simple
[74] 60+ чатов и ютуб-каналов для PHP-разработчика: https://habr.com/ru/company/skyeng/blog/534758/
[75] Модель PHP-слоника для 3D принтера: https://cults3d.com/en/3d-model/various/elephpant-3d
[76] github.com/thank-you-php: https://github.com/thank-you-php/thank-you-php
[77] личку хабра: https://habrahabr.ru/conversations/pronskiy/
[78] телеграм: https://t.me/pronskiy
[79] PHP Digest: https://t.me/phpdigest
[80] Прислать ссылку: https://bit.ly/php-digest-add-link
[81] Поиск ссылок по всем дайджестам: https://pronskiy.com/php-digest/
[82] Предыдущий выпуск: PHP Дайджест № 195: https://habr.com/ru/post/535308/
[83] Источник: https://habr.com/ru/post/536726/?utm_source=habrahabr&utm_medium=rss&utm_campaign=536726
Нажмите здесь для печати.