Společnost Vimeo nové vydání statického analyzátoru , který umožňuje odhalovat jak zřejmé, tak těžko zjistitelné chyby v kódu jazyka PHP a také automaticky opravovat některé typy chyb. Systém je vhodný pro odhalování problémů jak ve starém kódu, tak v kódu využívajícím moderní funkce, které se objevily v nových verzích PHP. Kód projektu je napsán v PHP a je licencován pod MIT licencí.
Psalm určuje většinu problémů spojených s nesprávným použitím typů a různorodé . Například je podporováno vyhodnocování varování o smíchání proměnných s různými typy v výrazech, nesprávných logických kontrolách (jako „if ($a && $a) {}“, „if ($a && !$a) {}“ a „if ($a) {} elseif ($a) {}“), nedokončené inicializaci vlastností objektů. Analyzátor pracuje v multithreadovém režimu. Je možné provádět inkrementální kontroly, při kterých se analyzují pouze soubory, které byly změněny od poslední kontroly.
Dále jsou k dispozici prostředky pro bezpečné programování, které umožňují annotace ve formátu ("/** @var Type */") pro poskytování informací o typech proměnných, návratových hodnotách, parametrech funkcí, vlastnostech objektů. Také je podporováno definování vzorů použití typů a aplikace výrazů assert. Například:
/** @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();
}
Pro automatizaci odstraňování nalezených problémů je k dispozici utilita Psalter, která podporuje pluginy a odstraňovat typické problémy v kódu, přidávat anotace o typech a také provádět takové manipulace, jako je přesouvání tříd z jednoho jmenného prostoru do druhého, přesouvání metod mezi třídami, přejmenovávání tříd a metod.
V novém vydání Psalmu možnost „—taint-analysis“, která umožňuje sledovat spojení mezi vstupními parametry získanými od uživatele (například $_GET[‘name’]) a jejich použitím na místech, kde je nutné escapování znaků (například echo „<h1>$name</h1>„), včetně sledování řetězců mezičlánkových přiřazení a volání funkcí. Jako zdroje potenciálně nebezpečných dat se zvažuje použití asociativních polí $_GET, $_POST a $_COOKIE, ale je možné i vlastními zdroji. Z akcí, které vyžadují sledování escapingu, se zvažují výstupní operace vedoucí k vytváření obsahu ve formátu HTML, přidávání HTTP hlaviček nebo provádění SQL dotazů.
Kontrola se používá při využívání funkcí jako echo, exec, include a header. Při analýze potřeby escapování se zohledňují typy dat, jako jsou text, řetězce s SQL, HTML a Shell kódem, řetězce s autentizačními parametry. Navrhovaný režim umožňuje odhalit zranitelnosti v kódu, které vedou k mezisitevnímu skriptování (XSS) nebo SQL injekcím.
Dále lze poznamenat alfa testování nové větve PHP 8.0. Uvolnění je plánováno na 26. listopadu. V nové větvi se očekávají takové , jako:
- , jehož použití umožní zvýšit výkon.
- Podpora , které definují kolekce ze dvou a více typů (například „public function foo(Foo|Bar $input): int|float;“).
- Podpora (annotací), které umožňují přiřadit metadata (například informace o typech) třídám bez použití syntaxe Docblock.
- definice tříd, která umožňuje sloučit definici konstruktoru a vlastností.
- Nový typ návratových hodnot — .
- Nový typ — , který může být použit k určení příjmu parametru funkcí s různými typy.
- Výraz pro zpracování výjimek.
- pro vytváření objektů, které mohou být obětovány při sběru odpadu (například pro uchovávání volitelných cache).
- použití výrazu „::class“ pro objekty (ekvivalent volání get_class()).
- definice v bloku catch výjimek, které nejsou vázány na proměnné.
- zanechání čárky po posledním prvku v seznamu parametrů funkce.
- Nové rozhraní pro identifikaci jakýchkoli typů řetězců nebo dat, které lze převést na řetězec (pro které je k dispozici metoda __toString()).
- Nová funkce , zjednodušená varianta strpos pro určení výskytu podřetězce, stejně jako funkce str_starts_with() a str_ends_with() pro kontrolu shody na začátku a na konci řetězce.
- Byla přidána funkce , která provádí dělení bez vyvolání chyby v případě dělení nulou.
- logika spojování řetězců. Například výraz ‘echo „sum: “ . $a + $b’ byl dříve interpretován jako ‘echo („sum: “ . $a) + $b’, nyní v PHP 8 bude zpracován jako ‘echo „sum: “ . ($a + $b)’.
- kontrola aritmetických a bitových operací, například výrazy „[] % [42]“ a „$object + 4“ povedou k chybě.
- stabilní algoritmus třídění, který při různých spuštěních zachovává pořadí stejných hodnot.
Zdroj: opennet.ru
