Väljaanne Psalm 3.12, staatilise analüsaatori jaoks PHP keelele. Alpha väljaanne PHP 8.0

Vimeo ettevõte avalikustasin uue staatilise analüsaatori väljaanne Psalm 3.12, mis tuvastab nii ilmsed kui ka raskesti märgatavad vead PHP keeles kirjutatud koodis ning parandab automaatselt teatud tüüpi vigu. Süsteem sobib probleemide avastamiseks nii vananenud koodis kui ka koodis, mis kasutab uusi võimalusi, mis on tekkinud PHP uutes harudes. Projekti kood on kirjutatud PHP keeles ja GNU Üldine Avaliku litsentsi alusel. on MIT litsentsi all.

Psalm tuvastab enamik probleeme, mis on seotud tüüpide vale kasutamisega, samuti erinevad tüüpilised vead. Näiteks toetatakse hoiatuste väljastamist segamise kohta muutujate vahel erinevates tüüpides, vale loogiliste kontrollide puhul (nt „if ($a && $a) {}“, „if ($a && !$a) {}“ ja „if ($a) {} elseif ($a) {}“), objekti omaduste mittetäielik algatamine. Analüsaator töötab lõimede režiimis. On võimalik teostada inkrementaalseid kontrollimisi, kus analüüsitakse ainult faile, mis on muutunud alates viimase kontrollimise ajast.

Lisaks on saadaval ohutu programmeerimise vahendid, mis võimaldavad kasutada annotatsioone vormingus Docblock («/** @var Type */») muutujatüüpide, tagastatavate väärtuste, funktsiooniparametrite ja objekti omaduste teabe edastamiseks. Samuti toetatakse tüüpide kasutusmallide määratlemist ja assert-käskluste rakendamist. Näiteks:

/** @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();
}

Leitud probleemide automaatseks lahendamiseks on olemas utiliit Psalter, mis toetab pluginaid ja lubab lahendab koodis tüüpilisi probleeme, lisab tüüpide annotatsioone ning teostab selliseid toiminguid nagu klasside liigutamine ühest nimestikku teise, meetodite liigutamine klasside vahel, klasside ja meetodite nimede muutmine.

Uues Pilaris on rakendatud valik «—taint-analysis», mis võimaldab jälgida seoseid kasutajalt saadud sisendparameetrite (näiteks $_GET[‘name’]) ja nende kasutamise vahel kohtades, kus on vajalik sümbolite escaping (nt echo «<h1>$name</h1>»), sealhulgas jälgides vahepealseid määramisi ja funktsioonikutsungite ahelat. Potentsiaalselt ohtlike andmete allikateks peetakse assotsiatiivsete massiivide kasutamist $_GET, $_POST ja $_COOKIE, kuid mõeldav on ka määratlemisele oma allikatest. Ekstraheerimise jälgimist vajavad toimingud hõlmavad väljundite operatsioone, mis viivad HTML-formaadis sisu genereerimise, HTTP-pealkirjade lisamise või SQL-päringute täitmiseni.

Kontroll rakendub selliste funktsioonide kasutamisel nagu echo, exec, include ja header. Andmete eristamisel, mis vajavad escape'i, arvestatakse andmetüüpe, nagu tekst, SQL stringid, HTML ja shell-kood, autentimisparameetrite stringid. Pakutud režiim võimaldab tuvastada koodis haavatavusi, mis võivad viia XSS (Cross-Site Scripting) või SQL-i sisestamise rünnakuteni.

Lisaks saab märkida algus PHP 8.0 uue haru alfa-testimine. Väljalase on planeeritud 26. novembriks. Uues haru oodatakse selliseid uuendused, nagu:

  • Käivitamine JIT-kompilaator, mille rakendamine võimaldab suurendada jõudlust.
  • Toetamine ühend-tyüpide, mis määratlevad kollektsioonid, mis koosnevad kahest või enamast tüübist (nt „public function foo(Foo|Bar $input): int|float;“).
  • Toetamine atribuutide (annotatsioonide), mis võimaldavad siduda metaandmeid (nt teavet tüüpide kohta) klassidega ilma Docblock süntaksit kasutamata.
  • Lühendatud süntaks klasside määratlemiseks, mis võimaldab kombineerida konstruktori ja omaduste määratlemise.
  • Uus tagastatavate väärtuste tüüp — staatiline.
  • Uus tüüp — mixed, mida saab kasutada funktsioonile erinevate tüüpide parameetrite määratlemiseks.
  • Väljend viska erandite töötlemiseks.
  • WeakMap objektide loomiseks, millest on võimalik loobuda prügi kogumise ajal (näiteks valikuliste vahetaminekube hoidmiseks).
  • Võimalus väljendi „::class“ kasutamine objektide jaoks (sarnane get_class() väljakutsetega).
  • Võimalus erandite määratlemine catch plokis, mida ei seostata muutujatega.
  • Võimalus viimane element funktsiooni parameetrite nimekirjas koma sümboli jätmine.
  • Uus liides Stringable kõikide stringi tüüpide või andmete identifitseerimiseks, mida saab muuta stringiks (kellel on meetod __toString()).
  • Uus funktsioon str_contains(), lihtsustatud analoog strpos-st, et määrata alammängu esinemist ning funktsioonid str_starts_with() ja str_ends_with(), et kontrollida vastavust stringi alguses ja lõpus.
  • Lisa funktsionaalsus fdiv(), teostab jagamistehte, ilma et tekiks viga jagamisel nulliga.
  • Muudetud stringide ühendamise loogika. Näiteks väljend ‘echo «sum: » . $a + $b’ tõlgendati varem kui ‘echo («sum: » . $a) + $b’, kuid PHP 8-s töödeldakse seda kui ‘echo «sum: » . ($a + $b)’.
  • Tugevdatud aritmeetiliste ja bititegevuste kontroll, näiteks väljendid «[] % [42]» ja «$object + 4» põhjustavad vea.
  • Tehtud stabiilne sortimise algoritm, kus erinevate käivituste ajal säilitatakse sama väärtuse järjestus.

Allikas: opennet.ru

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster