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

Kompania Vimeo publikoi lëshimi i ri i analizatorit static Psalm 3.12, i cili identifikon si gabime të qarta ashtu edhe ato të vështira për t'u kapur në kodin PHP, si dhe automatikisht korrigjon disa lloje gabimesh. Sistemi përshtatet për identifikimin e problemeve në kodin e vjetër dhe në atë që shfrytëzon mundësitë moderne që janë shfaqur në versionet e reja të PHP. Kodi i projektit është shkruar në PHP dhe distribuohet në përputhje me licencën MIT.

Psalm përcakton shumicën e problemeve që lidhen me përdorimin e papërshtatshëm të tipeve, si dhe gabime tipike. Për shembull, mbështetet shtypja e paralajmërimeve në lidhje me përzierjen e variablave me tipe të ndryshme në shprehje, verifikime logjike të pasakta (si «if ($a && $a) {}», «if ($a && !$a) {}» dhe «if ($a) {} elseif ($a) {}»), inicizim të papërsosur të pronave të objektit. Analizatori ekzekutohet në modalitetin multi-thread. Ekziston mundësia e kryerjes së kontrollimeve inkrementale, ku analizohen vetëm skedarët që janë ndryshuar që nga kontrollimi i mëparshëm.

Për më tepër, ofrohen mjete për programim të sigurtë që lejojnë përdorimi annotation në format Docblock («/** @var Type */») për të ofruar informacion mbi tipet e variablave, vlerat e kthimit, parametrat e funksioneve, pronat e objekteve. Gjithashtu mbështetet përcaktimi i skemave të përdorimit të tipeve dhe aplikimi i shprehjeve assert. Për shembull:

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

Për automatizimin e rregullimit të problemeve të gjetura, ofrohet utilitari Psalter, i cili mbështet plugin dhe lejon shkarkon probleme tipike në kod, shton annotations për tipe, si dhe kryen manipulime të tilla si zhvendosjen e klasave nga një hapësirë emri në një tjetër, zhvendosjen e metodave mes klasave, dhe rinaming të klasave dhe metodave.

Në lëshimin e ri të Psalm është realizuar opsioni «—taint-analysis», e cila lejon të ndjekë lidhjen midis parametrave të marrë nga përdoruesi (p.sh., $_GET[‘emri’]) dhe përdorimit të tyre në vende që kërkojnë shkrirje të simboleve (p.sh., echo «<h1>$emri</h1>»), përfshirë ndjekjen e zinxhirëve të caktimeve të ndërmjetme dhe thirrjeve të funksioneve. Si burime të të dhënave potencialisht të rrezikshme shqyrtohen përdorimi i array-ve asocative $_GET, $_POST dhe $_COOKIE, por është e mundur edhe definicion burimet e veta. Si aktivitete që kërkojnë ndjekjen e escapes, shqyrtohen operacionet e daljes, të cilat çojnë në formimin e përmbajtjes në formatin HTML, shtimin e titujve HTTP ose ekzekutimin e pyetjeve SQL.

Kontrolli zbatohet kur përdoren funksione si echo, exec, include dhe header. Gjatë analizës së nevojës për escapes, merren parasysh tipe të dhënash, si teksti, vargje me SQL, HTML dhe Shell code, vargje me parametra autentikimi. Režimi i propozuar lejon identifikimin e dobësive në kod që çojnë në sulme Cross-Site Scripting (XSS) ose injeksion SQL.

Për më tepër, mund të theksohet fillimi testimi alfa i degës së re PHP 8.0. Lëshimi është planifikuar për 26 nëntor. Në degën e re priten risitë, siç janë:

  • Aktivizimi i kompilerit JIT, përdorimi i të cilit do të mundësojë rritjen e performancës.
  • Mbështetje tipet union, që përcaktojnë koleksione të dy ose më shumë tipeve (për shembull «public function foo(Foo|Bar $input): int|float;»).
  • Mbështetje atributëve (annotations), që lejojnë lidhjen e metadatas (për shembull, informacion mbi tipet) me klasat pa përdorur sintaksën Docblock.
  • Sintaksa e shkurtuar e përcaktimit të klasave, që lejon bashkimin e definicionit të konstruktori me atributet.
  • Lloji i ri i vlerave të kthimit — static.
  • Lloji i ri — mixed, i cili mund të përdoret për të përcaktuar marrjen e parametrave me tipe të ndryshme nga funksioni.
  • Shprehja throw për trajtimin e përjashtimeve.
  • WeakMap për krijimin e objekteve që mund të sakrifikohen gjatë pastrimit të plehrave (për shembull, për ruajtjen e memorieve të tepërta).
  • Mundësia përdorimi i shprehjes «::class» për objekte (analog i thirrjes get_class()).
  • Mundësia përcaktimi në bllokun catch të përjashtimeve, që nuk janë të lidhura me variablat.
  • Mundësia lënia e simboleve të presjes pas elementit të fundit në listën e parametrave të funksionit.
  • Ndërfaqja e re Stringable për identifikimin e çdo tipi ose të dhënash të vargut, të cilët mund të konvertohen në varg (për të cilët është në dispozicion metoda __toString()).
  • Funksioni i ri str_contains(), një analog i thjeshtuar i strpos për identifikimin e përmbajtjes së nënvargut, si dhe funksionet str_starts_with() dhe str_ends_with() për të verifikuar përputhjet në fillim dhe në fund të vargut.
  • Shtesa e funksionit fdiv(), që kryen operacionin e ndarjes pa nxjerrë një gabim në rast ndarjeje me zero.
  • Është ndryshuar logjika e lidhjes së vargjeve. Për shembull, shprehja ‘echo «sum: » . $a + $b’ më parë interpretohej si ‘echo («sum: » . $a) + $b’, ndërsa në PHP 8 do të trajtohet si ‘echo «sum: » . ($a + $b)’.
  • Ngritur kontrolli i operacioneve aritmetike dhe bitore, për shembuj, shprehjet «[] % [42]» dhe «$object + 4» do të sjellin një gabim.
  • E realizuar algoritmi i qëndrueshëm për renditjen, në të cilin në herë të ndryshme ruhet rendi i të njëjtave vlera.

Burimi: opennet.ru

Bleni hostim të besueshëm për faqe me mbrojtje nga DDoS, serverë VPS VDS 🔥 Bleni hostim të besueshëm për faqe me mbrojtje nga DDoS, serverë VPS VDS | ProHoster