Wydanie Psalm 3.12, statycznego analizatora dla języka PHP. Wersja alfa PHP 8.0

Firma Vimeo opublikowała nowe wydanie statycznego analizatora Psalm 3.12, umożliwiającego wykrywanie zarówno oczywistych, jak i trudnych do wykrycia błędów w kodzie PHP, a także automatyczne poprawianie niektórych rodzajów błędów. System nadaje się do identyfikacji problemów zarówno w przestarzałym kodzie, jak i w kodzie wykorzystującym nowoczesne funkcjonalności w nowych wersjach PHP. Kod projektu został napisany w języku PHP i rozpowszechniany na licencji MIT.

Psalm określa większość problemów związanych z niepoprawnym użyciem typów, a także różnorodne typowe błędy. Na przykład, wspierane jest generowanie ostrzeżeń o mieszaniu w wyrażeniu zmiennych o różnych typach, niepoprawnych sprawdzeniach logicznych (takich jak „if ($a && $a) {}”, „if ($a && !$a) {}” i „if ($a) {} elseif ($a) {}”), niepełnej inicjalizacji właściwości obiektu. Analizator działa w trybie wielowątkowym. Możliwe jest przeprowadzanie inkrementalnych sprawdzeń, w których analizowane są tylko pliki, które zmieniły się od ostatniego sprawdzenia.

Dodatkowo udostępniane są narzędzia bezpiecznego programowania, które umożliwiają już trzeba coś wykorzystać (pracuję z klastrowym Proxmox VE 5.x i ZFS over iSCSI). adnotacje w formacie Docblock („/** @var Typ */”) do dostarczania informacji o typach zmiennych, wartościach zwracanych, parametrach funkcji, właściwościach obiektów. Wspierane jest także definiowanie wzorców użycia typów oraz stosowanie wyrażeń assert. Na przykład:

/** @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();
}

Aby zautomatyzować usuwanie znalezionych problemów, udostępniane jest narzędzie Psalter, które wspiera wtyczki i przekazywanie usuwanie typowych problemów w kodzie, dodawanie adnotacji typów oraz wykonywanie takich manipulacji, jak przenoszenie klas z jednej przestrzeni nazw do innej, przenoszenie metod między klasami, zmiana nazw klas i metod.

W nowym wydaniu Psalm zrealizowano Opcja «—taint-analysis», która pozwala na śledzenie związku między otrzymanymi od użytkownika parametrami wejściowymi (na przykład, $_GET[‘name’]) a ich wykorzystaniem w miejscach wymagających eskapacji znaków (na przykład, echo «<h1>$name</h1>»), w tym również poprzez śledzenie łańcuchów pośrednich przypisań i wywołań funkcji. Jako źródła potencjalnie niebezpiecznych danych należy rozważyć użycie tablic asocjacyjnych $_GET, $_POST i $_COOKIE, ale możliwe jest również definicja własnych źródeł. W przypadku działań wymagających śledzenia eskapatowania, rozpatrywane są operacje wyjściowe, prowadzące do generowania treści w formacie HTML, dodawania nagłówków HTTP lub wykonywania zapytań SQL.

Weryfikacja jest stosowana przy użyciu takich funkcji jak echo, exec, include i header. Przy analizie potrzeby stosowania ucieczki uwzględniane są typy danych, takie jak tekst, ciągi z SQL, HTML i kodem Shell, ciągi z parametrami uwierzytelniania. Zaproponowany tryb pozwala na identyfikację luk w kodzie prowadzących do ataków typu Cross-Site Scripting (XSS) lub wstrzykiwania kodu SQL.

Dodatkowo można zaznaczyć początek alfa-testowanie nowej gałęzi PHP 8.0. Premiera planowana jest na 26 listopada. W nowej gałęzi oczekiwane są następujące nowości, takie jak:

  • Włączenie kompilatora JIT, którego zastosowanie poprawi wydajność.
  • Wsparcie typów unii, definiujących kolekcje z dwóch lub więcej typów (na przykład „public function foo(Foo|Bar $input): int|float;”).
  • Wsparcie atrybuty (adnotacje), umożliwiające powiązanie metadanych (np. informacji o typach) z klasami bez użycia składni Docblock.
  • Skrócony składnik definicji klas, pozwalający na połączenie definicji konstruktora i właściwości.
  • Nowy typ wartości zwracanej — static.
  • Nowy typ — mixed, który może być używany do określenia przyjmowania przez funkcję parametrów o różnych typach.
  • Wyrażenie throw do obsługi wyjątków.
  • WeakMap do tworzenia obiektów, które można przekazać do zbierania śmieci (np. do przechowywania opcjonalnych pamięci podręcznych).
  • Możliwość używania wyrażenia „::class” dla obiektów (odpowiednik wywołania get_class()).
  • Możliwość definicji w bloku catch wyjątków, które nie są przypisane do zmiennych.
  • Możliwość pozostawienia przecinka po ostatnim elemencie na liście parametrów funkcji.
  • Nowy interfejs Stringable do identyfikacji wszelkich typów lub danych stringowych, które można przekształcić w ciąg (dla których dostępna jest metoda __toString()).
  • Nowa funkcja str_contains(), uproszczony odpowiednik strpos do określenia wystąpienia podciągu, a także funkcje str_starts_with() i str_ends_with() do sprawdzania zgodności na początku i końcu ciągu.
  • Dodano funkcję fdiv(), wykonująca operację dzielenia bez zgłaszania błędu w przypadku dzielenia przez zero.
  • Zmodyfikowana logika łączenia ciągów. Na przykład wyrażenie ‘echo „suma: ” . $a + $b’ wcześniej interpretowane było jako ‘echo („suma: ” . $a) + $b’, a w PHP 8 będzie przetwarzane jako ‘echo „suma: ” . ($a + $b)’.
  • Zwiększona sprawdzanie operacji arytmetycznych i bitowych, na przykład wyrażenia „[] % [42]” i „$object + 4” będą prowadzić do błędu.
  • Zrealizowano stabilny algorytm sortowania, w którym przy różnych uruchomieniach zachowany jest porządek występowania identycznych wartości.

Źródło: opennet.ru

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster