Vydání Psalm 3.12, statického analyzátoru pro jazyk PHP. Alfa verze PHP 8.0

Společnost Vimeo publikovala nové vydání statického analyzátoru Psalm 3.12, 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 distribuováno 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é typické chyby. 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í použít annotace ve formátu Docblock ("/** @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 umožňuje 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 byla implementována 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 definice 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 začátek 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é novinky, jako:

  • Zahrnutí JIT kompilátoru, jehož použití umožní zvýšit výkon.
  • Podpora union typů, které definují kolekce ze dvou a více typů (například „public function foo(Foo|Bar $input): int|float;“).
  • Podpora atributů (annotací), které umožňují přiřadit metadata (například informace o typech) třídám bez použití syntaxe Docblock.
  • Zkrácená syntaxe definice tříd, která umožňuje sloučit definici konstruktoru a vlastností.
  • Nový typ návratových hodnot — static.
  • Nový typ — mixed, který může být použit k určení příjmu parametru funkcí s různými typy.
  • Výraz IllegalStateException( pro zpracování výjimek.
  • WeakMap 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).
  • Možnost použití výrazu „::class“ pro objekty (ekvivalent volání get_class()).
  • Možnost definice v bloku catch výjimek, které nejsou vázány na proměnné.
  • Možnost zanechání čárky po posledním prvku v seznamu parametrů funkce.
  • Nové rozhraní Stringable 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 str_contains(), 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 fdiv(), která provádí dělení bez vyvolání chyby v případě dělení nulou.
  • Změněno 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)’.
  • Zesílena kontrola aritmetických a bitových operací, například výrazy „[] % [42]“ a „$object + 4“ povedou k chybě.
  • Realizováno 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

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster