Компания Vimeo новый выпуск статического анализатора , позволяющего выявлять как очевидные, так и трудноуловимые ошибки в коде на языке PHP, а также автоматически исправлять некоторые виды ошибок. Система подходит для выявления проблем как в устаревшем коде, так и в коде, использующем современные возможности, появившиеся в новых ветках PHP. Код проекта написан на языке PHP и në përputhje me licencën MIT.
Psalm определяет большую часть проблем, связанных с некорректным использованием типов, а также разнообразные . Например, поддерживается вывод предупреждений о смешивании в выражении переменных с разными типами, некорректных логических проверках (таких как «if ($a && $a) {}», «if ($a && !$a) {}» и «if ($a) {} elseif ($a) {}»), неполной инициализации свойств объекта. Анализатор выполняется в многопоточном режиме. Возможно выполнение инкрементальных проверок, при которых анализируются только файлы, изменившиеся с момента прошлой проверки.
Дополнительно предоставляются средства безопасного программирования, позволяющие аннотации в формате («/** @var Type */») для предоставления информации о типах переменных, возвращаемых значениях, параметрах функций, свойствах объектов. Также поддерживается определение шаблонов использования типов и применение выражений assert. Например:
/** @var string|null */
$a = foo();
/** @var string $a */
echo strpos($a, ‘hello’);
/** @psalm-assert-if-true B $a */
function isValidB(A $a) : bool {
return $a instanceof B && $a->isValid();
}
Для автоматизации устранения найденных проблем предоставляется утилита Psalter, которая поддерживает плагины и устранять типовые проблемы в коде, добавлять аннотации о типах, а также выполнять такие манипуляции, как перемещение классов из одного пространства имён в другое, перемещение методов между классами, переименовывание классов и методов.
В новом выпуске Psalm опция «—taint-analysis», позволяющая проследить связь между полученными от пользователя входными параметрами (например, $_GET[‘name’]) и их использованием в местах, требующих экранирования символов (например, echo «<h1>$name</h1>»), в том числе через отслеживание цепочек промежуточных присвоений и вызовов функций. В качестве источников потенциально опасных данных рассматривается использование ассоциативных массивов $_GET, $_POST и $_COOKIE, но возможно и собственных источников. Из действий, требующих отслеживания экранирования, рассматриваются операции вывода, приводящие к формированию контента в формате HTML, добавлению HTTP-заголовков или выполнению SQL-запросов.
Проверка применяется при использовании таких функций, как echo, exec, include и header. При анализе необходимости экранирования учитываются типы данных, такие как текст, строки с SQL, HTML и Shell-кодом, строки с параметрами аутентификации. Предложенный режим позволяет выявлять уязвимости в коде, приводящие к межсайтовому скриптингу (XSS) или подстановке SQL-кода.
Për më tepër, mund të theksohet альфа-тестирования новой ветки PHP 8.0. Релиз намечен на 26 ноября. В новой ветке ожидаются такие , как:
- , применение которого позволит повысить производительность.
- Mbështetje , определяющих коллекции из двух и более типов (например «public function foo(Foo|Bar $input): int|float;»).
- Mbështetje (аннотаций), позволяющих привязать метаданные (например, сведения о типах) к классам без использования синтаксиса Docblock.
- определения классов, позволяющий объединить определение конструктора и свойств.
- Новый тип возвращаемых значений — .
- Новый тип — , который может применяться для определения приёма функцией параметров с разными типами.
- Выражение для обработки исключений.
- для создания объектов, которыми можно пожертвовать при сборке мусора (например, для хранения необязательных кэшей).
- использования выражения «::class» для объектов (аналог вызова get_class()).
- определения в блоке catch исключений, не привязанных к переменным.
- оставления символа запятой после последнего элемента в списке параметров функции.
- Ndërfaqja e re для идентификации любых строковых типов или данных, которых можно преобразовать в строку (для которых доступен метод__toString()).
- Funksioni i ri , упрощённый аналог strpos для определения вхождения подстроки, а также функции str_starts_with() и str_ends_with() для проверки совпадений в начале и конце строки.
- Shtesa e funksionit , выполняющая операцию деления без вывода ошибки в случае деления на ноль.
- логика соединения строк. Например, выражение ‘echo «sum: » . $a + $b’ ранее интерпретировалось как ‘echo («sum: » . $a) + $b’, а в PHP 8 будет обработано как ‘echo «sum: » . ($a + $b)’.
- проверка арифметических и битовых операций, например, выражения «[] % [42]» и «$object + 4» будут приводить к ошибке.
- стабильный алгоритм сортировки, в котором при разных запусках сохраняется порядок следования одинаковых значений.
Burimi: opennet.ru
