Lansarea Psalm 3.12, un analizor static pentru limbajul PHP. Versiunea alfa a PHP 8.0

Компания Vimeo а publicat новый выпуск статического анализатора Psalmul 3.12, позволяющего выявлять как очевидные, так и трудноуловимые ошибки в коде на языке PHP, а также автоматически исправлять некоторые виды ошибок. Система подходит для выявления проблем как в устаревшем коде, так и в коде, использующем современные возможности, появившиеся в новых ветках PHP. Код проекта написан на языке PHP и distribuit de sub licența MIT.

Psalm определяет большую часть проблем, связанных с некорректным использованием типов, а также разнообразные типичные ошибки. Например, поддерживается вывод предупреждений о смешивании в выражении переменных с разными типами, некорректных логических проверках (таких как «if ($a && $a) {}», «if ($a && !$a) {}» и «if ($a) {} elseif ($a) {}»), неполной инициализации свойств объекта. Анализатор выполняется в многопоточном режиме. Возможно выполнение инкрементальных проверок, при которых анализируются только файлы, изменившиеся с момента прошлой проверки.

Дополнительно предоставляются средства безопасного программирования, позволяющие pentru a utiliza аннотации в формате Docblock («/** @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, которая поддерживает плагины и Acesta permite устранять типовые проблемы в коде, добавлять аннотации о типах, а также выполнять такие манипуляции, как перемещение классов из одного пространства имён в другое, перемещение методов между классами, переименовывание классов и методов.

В новом выпуске Psalm implementate опция «—taint-analysis», позволяющая проследить связь между полученными от пользователя входными параметрами (например, $_GET[‘name’]) и их использованием в местах, требующих экранирования символов (например, echo «<h1>$name</h1>»), в том числе через отслеживание цепочек промежуточных присвоений и вызовов функций. В качестве источников потенциально опасных данных рассматривается использование ассоциативных массивов $_GET, $_POST и $_COOKIE, но возможно и determinarea собственных источников. Из действий, требующих отслеживания экранирования, рассматриваются операции вывода, приводящие к формированию контента в формате HTML, добавлению HTTP-заголовков или выполнению SQL-запросов.

Проверка применяется при использовании таких функций, как echo, exec, include и header. При анализе необходимости экранирования учитываются типы данных, такие как текст, строки с SQL, HTML и Shell-кодом, строки с параметрами аутентификации. Предложенный режим позволяет выявлять уязвимости в коде, приводящие к межсайтовому скриптингу (XSS) или подстановке SQL-кода.

În plus, se poate observa începe альфа-тестирования новой ветки PHP 8.0. Релиз намечен на 26 ноября. В новой ветке ожидаются такие inovațiiCa:

  • includere Compilatorul JIT, a cărui utilizare va îmbunătăți productivitatea.
  • Sprijini tipuri de sindicate, definind colecții de două sau mai multe tipuri (de exemplu, „funcție publică foo(Foo|Bar $input): int|float;”).
  • Sprijini atribute (adnotări) care vă permit să legați metadate (cum ar fi informații de tip) la clase fără a utiliza sintaxa Docblock.
  • Sintaxă scurtată definiții de clasă, permițându-vă să combinați definiția unui constructor și proprietăți.
  • Nou tip de returnare - static.
  • Tip nou - mixt, care poate fi folosit pentru a determina dacă o funcție acceptă parametri de diferite tipuri.
  • expresie arunca pentru a gestiona excepțiile.
  • WeakMap pentru a crea obiecte care pot fi sacrificate în timpul colectării gunoiului (de exemplu, pentru a stoca cache-uri inutile).
  • Oportunitate folosind expresia „::class” pentru obiecte (analog cu apelarea get_class()).
  • Oportunitate definiții din blocul catch de excepții care nu sunt legate de variabile.
  • Oportunitate lăsând o virgulă după ultimul element din lista parametrilor funcției.
  • Interfață nouă Se poate înșira pentru a identifica orice tip de șir sau date care pot fi convertite într-un șir (pentru care este disponibilă metoda __toString()).
  • Optiune noua str_contains(), un analog simplificat al strpos pentru determinarea apariției unui subșir, precum și funcțiile str_starts_with() și str_ends_with() pentru verificarea potrivirilor la începutul și la sfârșitul unui șir.
  • Funcție adăugată fdiv(), care efectuează o operație de împărțire fără a arunca o eroare la împărțirea la zero.
  • Schimbat logica de îmbinare a șirurilor. De exemplu, expresia „echo „sum:” . $a + $b' a fost interpretat anterior ca 'echo ("sum: " . $a) + $b', iar în PHP 8 va fi tratat ca 'echo "sum: " . ($a + $b)'.
  • Strâns verificarea operațiilor aritmetice și pe biți, de exemplu, expresiile „[] % [42]” și „$object + 4” vor avea ca rezultat o eroare.
  • Implementat un algoritm de sortare stabil în care ordinea valorilor identice este păstrată pe diferite rulări.

Sursa: opennet.ru

Adauga un comentariu