Vrystelling van Psalm 3.12, 'n statiese ontleder vir die PHP-taal. Alfa-vrystelling van PHP 8.0

Vimeo Maatskappy gepubliseer nuwe vrystelling van statiese ontleder Psalm 3.12, wat jou toelaat om beide ooglopende en subtiele foute in PHP-kode te identifiseer, asook om sekere tipes foute outomaties reg te stel. Die stelsel is geskik vir die identifisering van probleme in beide verouderde kode en in kode wat moderne kenmerke gebruik wat in nuwe takke van PHP bekendgestel is. Die projekkode is geskryf in PHP en versprei deur onder die MIT-lisensie.

Psalm identifiseer meeste van die probleme wat verband hou met verkeerde tipe gebruik, asook verskeie tipiese foute. Dit ondersteun byvoorbeeld waarskuwings oor die vermenging van veranderlikes van verskillende tipes in 'n uitdrukking, verkeerde logiese toetse (soos "if ($a && $a) {}", "if ($a && !$a) {}" en " if ( $a) {} elseif ($a) {}"), onvolledige inisialisering van voorwerpeienskappe. Die ontleder loop in multi-threaded modus. Dit is moontlik om inkrementele skanderings uit te voer, wat slegs lêers ontleed wat sedert die laaste skandering verander het.

Daarbenewens word veilige programmeringsinstrumente verskaf om dit toe te laat te gebruik aantekeninge in die formaat Dokblok ("/** @var Tipe */") om inligting oor veranderlike tipes, terugkeerwaardes, funksieparameters, objek-eienskappe te verskaf. Die definisie van tipe gebruikspatrone en die gebruik van beweringstellings word ook ondersteun. Byvoorbeeld:

/** @var string|nul */
$a = foo();

/** @var string $a */
echo strpos($a, 'hallo');

/** @psalm-assert-if-true B $a */
funksie isValidB(A $a): bool {
gee $a instansie van B && $a->isValid();
}

Om die uitskakeling van probleme wat gevind is, te outomatiseer, word die Psalter-hulpmiddel verskaf, wat plugins en dit laat los algemene kodeprobleme op, voeg tipe-aantekeninge by en voer manipulasies uit soos om klasse van een naamruimte na 'n ander te skuif, metodes tussen klasse te skuif en klasse en metodes te hernoem.

In die nuwe uitgawe van Psalm geïmplementeer die "--taint-analysis"-opsie laat jou toe om die verwantskap tussen invoerparameters wat van die gebruiker ontvang is (byvoorbeeld $_GET['naam']) en hul gebruik op plekke wat karakterontsnap vereis (byvoorbeeld, eggo ") op te spoor. $naam "), insluitend deur naspoorkettings van intermediêre opdragte en funksie-oproepe. Die gebruik van assosiatiewe skikkings $_GET, $_POST en $_COOKIE word beskou as bronne van potensieel gevaarlike data, maar dit is ook moontlik definisie eie bronne. Aksies wat ontsnappingsnasporing vereis, sluit in uitvoerbewerkings wat HTML-inhoud genereer, HTTP-opskrifte byvoeg of SQL-navrae uitvoer.

Validasie word gebruik wanneer funksies soos eggo, exec, include en header gebruik word. Wanneer die behoefte aan ontsnapping ontleed word, word datatipes soos teks, stringe met SQL, HTML en Shell-kode, stringe met verifikasieparameters in ag geneem. Die voorgestelde modus laat jou toe om kwesbaarhede in die kode te identifiseer wat lei tot kruis-werf scripting (XSS) of SQL vervanging.

Daarbenewens kan dit opgemerk word die begin alfa-toetsing van die nuwe PHP 8.0-tak. Die vrystelling is geskeduleer vir 26 November. Die volgende word in die nuwe tak verwag: innovasiesSoos:

  • insluiting JIT samesteller, waarvan die gebruik produktiwiteit sal verbeter.
  • Ondersteun vakbond tipes, wat versamelings van twee of meer tipes definieer (byvoorbeeld, "public function foo(Foo|Bar $input): int|float;").
  • Ondersteun eienskappe (aantekeninge) wat jou toelaat om metadata (soos tipe inligting) aan klasse te bind sonder om Docblock-sintaksis te gebruik.
  • Verkorte sintaksis klasdefinisies, wat jou toelaat om die definisie van 'n konstruktor en eienskappe te kombineer.
  • Nuwe tipe terugkeer - statiese.
  • Nuwe tipe - gemengde, wat gebruik kan word om te bepaal of 'n funksie parameters van verskillende tipes aanvaar.
  • uitdrukking gooi om uitsonderings te hanteer.
  • Swak Kaart om voorwerpe te skep wat tydens vullisversameling opgeoffer kan word (byvoorbeeld om onnodige caches te stoor).
  • Geleentheid gebruik die uitdrukking "::klas" vir voorwerpe (analoog aan die oproep van get_class()).
  • Geleentheid definisies in die vangblok van uitsonderings wat nie aan veranderlikes gebonde is nie.
  • Geleentheid 'n komma agter die laaste element in die lys funksieparameters te laat.
  • Nuwe koppelvlak Snaarbaar om enige stringtipes of data te identifiseer wat na 'n string omgeskakel kan word (waarvoor die __toString()-metode beskikbaar is).
  • Nuwe funksie str_bevat(), 'n vereenvoudigde analoog van strpos vir die bepaling van die voorkoms van 'n substring, sowel as die funksies str_starts_with() en str_ends_with() vir die kontrolering van passings aan die begin en einde van 'n string.
  • Kenmerk bygevoeg fdiv(), wat 'n deelbewerking uitvoer sonder om 'n fout te gooi wanneer dit deur nul gedeel word.
  • Verander snaarverbindingslogika. Byvoorbeeld, die uitdrukking 'echo "som:" . $a + $b' is voorheen geïnterpreteer as 'echo ("som: " . $a) + $b', en sal in PHP 8 as 'echo "som: " behandel word. ($a + $b)'.
  • Styf getrek nagaan van rekenkundige en bisbewerkings, byvoorbeeld, sal die uitdrukkings "[] % [42]" en "$object + 4" 'n fout tot gevolg hê.
  • Geïmplementeer 'n stabiele sorteeralgoritme waarin die volgorde van identiese waardes oor verskillende lopies bewaar word.

Bron: opennet.ru

Voeg 'n opmerking