Azienda Vimeo nuova versione dell'analizzatore statico , che consente di individuare sia errori evidenti che difficili da rilevare nel codice PHP, oltre a correggere automaticamente alcuni tipi di errori. Il sistema è adatto per individuare problemi sia nel codice obsoleto sia in quello che utilizza le moderne funzionalità introdotte nelle nuove versioni di PHP. Il codice del progetto è scritto in PHP e sotto licenza MIT.
Salmo determina gran parte dei problemi legati a un uso scorretto dei tipi, così come diverse . Ad esempio, viene supportata l’emissione di avvisi per la mescolanza in un'espressione di variabili di tipi diversi, controlli logici non corretti (come «if ($a && $a) {}», «if ($a && !$a) {}» e «if ($a) {} elseif ($a) {}»), inizializzazioni incomplete delle proprietà degli oggetti. L'analizzatore viene eseguito in modalità multithreading. È possibile effettuare controlli incrementali, in cui vengono analizzati solo i file modificati dall'ultima verifica.
In aggiunta, vengono forniti strumenti per la programmazione sicura, che consentono annotazioni nel formato («/** @var Type */») per fornire informazioni sui tipi di variabili, valori restituiti, parametri delle funzioni e proprietà degli oggetti. È anche supportata la definizione di modelli d'uso dei tipi e l'applicazione di espressioni assert. Ad esempio:
/** @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();
}
Per automatizzare la risoluzione dei problemi trovati, è disponibile l'utilità Psalter, che supporta i plugin e risolvere problemi tipici nel codice, aggiungere annotazioni sui tipi, oltre a compiere operazioni come spostare classi da uno spazio dei nomi a un altro, spostare metodi tra classi, rinominare classi e metodi.
Nella nuova versione di Psalm l'opzione «—taint-analysis», che consente di tracciare la connessione tra i parametri di input forniti dall'utente (ad esempio, $_GET[‘name’]) e il loro utilizzo in punti in cui è necessaria l'escapatura dei caratteri (ad esempio, echo «<h1>$name</h1>»), compreso il monitoraggio delle catene di assegnazioni intermedie e chiamate di funzioni. Come fonti di dati potenzialmente pericolosi si considera l'uso degli array associativi $_GET, $_POST e $_COOKIE, ma è possibile anche fonti proprie. Tra le azioni che richiedono il tracciamento dell'escaping, ci sono le operazioni di output che portano alla generazione di contenuti in formato HTML, all'aggiunta di intestazioni HTTP o all'esecuzione di query SQL.
Il controllo si applica all'uso di funzioni come echo, exec, include e header. Nella valutazione della necessità di escaping, si considerano tipi di dati come testo, stringhe con SQL, HTML e codice Shell, stringhe con parametri di autenticazione. La modalità proposta consente di identificare vulnerabilità nel codice che possono portare a attacchi di cross-site scripting (XSS) o iniezione di codice SQL.
In aggiunta, si può notare alpha-testing di una nuova versione di PHP 8.0. Il rilascio è previsto per il 26 novembre. Nella nuova versione si prevedono elementi come: , quali:
- , il cui utilizzo porterà a un aumento delle prestazioni.
- Supporto , che definiscono collezioni di due o più tipi (per esempio «public function foo(Foo|Bar $input): int|float;»).
- Supporto (annotazioni), che permettono di associare metadati (ad esempio, informazioni sui tipi) a classi senza utilizzare la sintassi Docblock.
- per la definizione delle classi, che consente di unire la definizione del costruttore e delle proprietà.
- Nuovo tipo di valori restituiti — .
- Nuovo tipo — , che può essere utilizzato per definire l'accettazione da parte di una funzione di parametri di tipi diversi.
- Espressione per la gestione delle eccezioni.
- per la creazione di oggetti che possono essere raccolti durante la raccolta dei rifiuti (per esempio, per la memorizzazione di cache facoltativi).
- uso dell'espressione «::class» per gli oggetti (equivalente alla chiamata di get_class()).
- definizione nel blocco catch di eccezioni non legate a variabili.
- lasciare il simbolo di virgola dopo l'ultimo elemento nell'elenco dei parametri della funzione.
- Nuova interfaccia per identificare qualsiasi tipo di stringa o dato che può essere convertito in una stringa (per cui è disponibile il metodo __toString()).
- La nuova funzione , un'alternativa semplificata a strpos per determinare la presenza di una sottostringa, oltre alle funzioni str_starts_with() e str_ends_with() per verificare corrispondenze all'inizio e alla fine della stringa.
- Funzione aggiunta , che esegue l'operazione di divisione senza generare un errore in caso di divisione per zero.
- la logica di concatenazione delle stringhe. Per esempio, l'espressione ‘echo «sum: » . $a + $b’ veniva precedentemente interpretata come ‘echo («sum: » . $a) + $b’, mentre in PHP 8 sarà elaborata come ‘echo «sum: » . ($a + $b)‘.
- la verifica delle operazioni aritmetiche e bitwise, ad esempio, l'espressione «[] % [42]» e «$object + 4» genereranno un errore.
- algoritmo di ordinamento stabile, in cui l'ordine di apparizione dei valori identici viene mantenuto in esecuzioni diverse.
Fonte: opennet.ru
