Firma Vimeo nowe wydanie statycznego analizatora , 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 na licencji MIT.
Psalm określa większość problemów związanych z niepoprawnym użyciem typów, a także różnorodne . 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ą adnotacje w formacie („/** @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 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 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ż 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ć alfa-testowanie nowej gałęzi PHP 8.0. Premiera planowana jest na 26 listopada. W nowej gałęzi oczekiwane są następujące , takie jak:
- , którego zastosowanie poprawi wydajność.
- Wsparcie , definiujących kolekcje z dwóch lub więcej typów (na przykład „public function foo(Foo|Bar $input): int|float;”).
- Wsparcie (adnotacje), umożliwiające powiązanie metadanych (np. informacji o typach) z klasami bez użycia składni Docblock.
- definicji klas, pozwalający na połączenie definicji konstruktora i właściwości.
- Nowy typ wartości zwracanej — .
- Nowy typ — , który może być używany do określenia przyjmowania przez funkcję parametrów o różnych typach.
- Wyrażenie do obsługi wyjątków.
- do tworzenia obiektów, które można przekazać do zbierania śmieci (np. do przechowywania opcjonalnych pamięci podręcznych).
- używania wyrażenia „::class” dla obiektów (odpowiednik wywołania get_class()).
- definicji w bloku catch wyjątków, które nie są przypisane do zmiennych.
- pozostawienia przecinka po ostatnim elemencie na liście parametrów funkcji.
- Nowy interfejs 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 , 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ę , wykonująca operację dzielenia bez zgłaszania błędu w przypadku dzielenia przez zero.
- 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)’.
- sprawdzanie operacji arytmetycznych i bitowych, na przykład wyrażenia „[] % [42]” i „$object + 4” będą prowadzić do błędu.
- stabilny algorytm sortowania, w którym przy różnych uruchomieniach zachowany jest porządek występowania identycznych wartości.
Źródło: opennet.ru
