Publikimi i Psalmit 3.12, një analizues statik për gjuhën PHP. Lëshimi alfa i PHP 8.0

Kompania Vimeo botuar lëshimi i ri i analizuesit statik Psalmi 3.12, i cili ju lejon të identifikoni gabime të dukshme dhe delikate në kodin PHP, si dhe të korrigjoni automatikisht disa lloje gabimesh. Sistemi është i përshtatshëm për identifikimin e problemeve si në kodin e vjetër, ashtu edhe në kodin që përdor veçori moderne të prezantuara në degët e reja të PHP. Kodi i projektit është i shkruar në PHP dhe shperndare nga nën licencën MIT.

Psalmi identifikon shumicën e problemeve që lidhen me përdorimin e llojit të gabuar, si dhe të ndryshme gabime tipike. Për shembull, ai mbështet paralajmërime për përzierjen e variablave të llojeve të ndryshme në një shprehje, teste logjike të pasakta (të tilla si "if ($a && $a) {}", "if ($a && !$a) {}" dhe " if ( $a) {} elseif ($a) {}"), inicializimi jo i plotë i vetive të objektit. Analizuesi funksionon në modalitetin me shumë fije. Është e mundur të kryhen skanime në rritje, të cilat analizojnë vetëm skedarët që kanë ndryshuar që nga skanimi i fundit.

Për më tepër, ofrohen mjete të sigurta programimi për të lejuar për t'u përdorur shënime në format Docblock (“/** @var Lloji */”) për të dhënë informacion në lidhje me llojet e variablave, vlerat e kthyera, parametrat e funksionit, vetitë e objektit. Përcaktimi i modeleve të përdorimit të tipit dhe përdorimi i deklaratave të pohimit mbështetet gjithashtu. Për shembull:

/** @var varg|null */
$a = foo();

/** vargu @var $a */
echo strpos($a, 'përshëndetje');

/** @psalm-assert-if-true B $a */
funksioni ështëValidB(A $a) : bool {
ktheni $a shembull të B && $a->isValid();
}

Për të automatizuar eliminimin e problemeve të gjetura, ofrohet mjeti Psalter, i cili mbështet shtojcat dhe Kjo i lejon zgjidhni problemet e zakonshme të kodit, shtoni shënime të tipit dhe kryeni manipulime të tilla si zhvendosja e klasave nga një hapësirë ​​emri në tjetrën, zhvendosja e metodave midis klasave dhe riemërtimi i klasave dhe metodave.

Në numrin e ri të Psalmit zbatuar opsioni "--taint-analysis" ju lejon të gjurmoni lidhjen midis parametrave të hyrjes të marra nga përdoruesi (për shembull, $_GET['name']) dhe përdorimit të tyre në vende që kërkojnë ikje të karaktereve (për shembull, jehona " $emri "), duke përfshirë përmes zinxhirëve gjurmues të detyrave të ndërmjetme dhe thirrjeve funksionale. Përdorimi i grupeve shoqëruese $_GET, $_POST dhe $_COOKIE konsiderohet si burim i të dhënave potencialisht të rrezikshme, por është gjithashtu i mundur përcaktim burimet e veta. Veprimet që kërkojnë gjurmimin e arratisjes përfshijnë operacionet e daljes që gjenerojnë përmbajtje HTML, shtojnë titujt HTTP ose ekzekutojnë pyetje SQL.

Validimi përdoret kur përdoren funksione të tilla si echo, exec, include dhe header. Kur analizohet nevoja për arratisje, merren parasysh llojet e të dhënave si teksti, vargjet me kodin SQL, HTML dhe Shell, vargjet me parametrat e vërtetimit. Mënyra e propozuar ju lejon të identifikoni dobësitë në kod që çojnë në skriptimin ndër-site (XSS) ose zëvendësimin e SQL.

Për më tepër, mund të vërehet fillimi testimi alfa i degës së re PHP 8.0. Publikimi është planifikuar për 26 nëntor. Në degën e re priten këto: risitëSi:

  • përfshirje Përpiluesi JIT, përdorimi i të cilave do të përmirësojë produktivitetin.
  • Mbështetje llojet e bashkimit, duke përcaktuar koleksionet e dy ose më shumë llojeve (për shembull, "funksioni publik foo(Foo|Bar $input): int|float;").
  • Mbështetje atributet (shënime) që ju lejojnë të lidhni meta të dhënat (siç janë informacionet e tipit) me klasat pa përdorur sintaksë Docblock.
  • Sintaksë e shkurtuar përkufizimet e klasave, duke ju lejuar të kombinoni përkufizimin e një konstruktori dhe vetitë.
  • Lloji i ri i kthimit - i pandryshueshëm.
  • Lloji i ri - i përzier, i cili mund të përdoret për të përcaktuar nëse një funksion pranon parametra të llojeve të ndryshme.
  • shprehje hedh për të trajtuar përjashtimet.
  • Harta e dobët për të krijuar objekte që mund të sakrifikohen gjatë mbledhjes së mbeturinave (për shembull, për të ruajtur memoriet e panevojshme).
  • mundësi duke përdorur shprehjen “::class” për objektet (analoge me thirrjen get_class()).
  • mundësi përkufizimet në bllokun e kapjes së përjashtimeve që nuk janë të lidhura me variabla.
  • mundësi duke lënë presje pas elementit të fundit në listën e parametrave të funksionit.
  • Ndërfaqe e re Stringable për të identifikuar çdo lloj vargu ose të dhëna që mund të konvertohen në një varg (për të cilin metoda __toString() është e disponueshme).
  • Veçori e re str_contains(), një analog i thjeshtuar i strpos për përcaktimin e shfaqjes së një nënvargu, si dhe funksionet str_starts_with() dhe str_ends_with() për kontrollimin e përputhjeve në fillim dhe në fund të një vargu.
  • Funksioni i shtuar fdiv (), i cili kryen një operacion ndarjeje pa hedhur gabim kur pjesëtohet me zero.
  • Ndryshuar logjika e bashkimit të vargut. Për shembull, shprehja 'jehonë "shuma:" . $a + $b' u interpretua më parë si 'echo ("sum: " . $a) + $b', dhe në PHP 8 do të trajtohet si "echo "sum: ". ($a + $b)'.
  • Shtrënguar kontrollimi i operacioneve aritmetike dhe bit, për shembull, shprehjet "[] % [42]" dhe "$object + 4" do të rezultojnë në një gabim.
  • Zbatuar një algoritëm i qëndrueshëm i renditjes në të cilin rendi i vlerave identike ruhet në drejtime të ndryshme.

Burimi: opennet.ru

Shto një koment