Azienda Vimeo nuovo rilascio dell'analizzatore statico , che consente di rilevare sia errori evidenti che difficili da individuare nel codice PHP, e di correggere automaticamente alcuni tipi di errori. Il sistema è adatto per identificare problemi sia nel codice obsoleto che in quello che sfrutta le nuove funzionalità introdotte nelle ultime versioni di PHP. Il codice del progetto è scritto in PHP e sotto licenza MIT.
Psalm identifica la maggior parte dei problemi legati all'uso improprio dei tipi, oltre a diversi . Ad esempio, supporta l'emissione di avvisi per la mescolanza di variabili di diversi tipi in un'espressione, controlli logici non corretti (come «if ($a && $a) {}», «if ($a && !$a) {}» e «if ($a) {} elseif ($a) {}») e l'inizializzazione incompleta delle proprietà degli oggetti. L'analizzatore viene eseguito in modalità multithread. È possibile eseguire controlli incrementali, in cui vengono analizzati solo i file modificati dalla precedente verifica.
In aggiunta, vengono forniti strumenti per una programmazione sicura, che consentono annotazioni in formato («/** @var Type */») per fornire informazioni sui tipi di variabili, i valori di ritorno, i parametri delle funzioni e le proprietà degli oggetti. Supporta anche la definizione di modelli di utilizzo 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 plugin e risolvere problemi di tipo nel codice, aggiungere annotazioni sui tipi e eseguire 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 il legame tra i parametri di input ricevuti dall'utente (ad esempio, $_GET[‘name’]) e il loro utilizzo in punti in cui è necessaria l'escapabilità dei caratteri (ad esempio, echo «<h1>$name</h1>»), compreso il monitoraggio delle catene di assegnazioni intermedie e chiamate di funzioni. Come sorgenti di dati potenzialmente pericolosi vengono considerati gli array associativi $_GET, $_POST e $_COOKIE, ma è possibile anche fonti proprie. Le operazioni richiedenti il tracciamento dell'escaping includono 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 è applicato quando si utilizzano funzioni come echo, exec, include e header. Durante l'analisi della necessità di escape, vengono considerati i tipi di dati, come testo, stringhe SQL, HTML e codice Shell, stringhe con parametri di autenticazione. La modalità proposta consente di rilevare vulnerabilità nel codice che possono portare a attacchi di cross-site scripting (XSS) o iniezione di codice SQL.
Inoltre, si può notare alpha-testing del nuovo ramo PHP 8.0. Il rilascio è previsto per il 26 novembre. In questo nuovo ramo ci si aspetta che ci siano , tra cui:
- , il cui utilizzo consentirà di aumentare le prestazioni.
- Supporto , che definiscono collezioni di due o più tipi (ad esempio «public function foo(Foo|Bar $input): int|float;»).
- Supporto (annotazioni), che permettono di legare metadati (ad esempio, informazioni sui tipi) alle classi senza utilizzare la sintassi Docblock.
- per la definizione delle classi, che consente di combinare la definizione del costruttore e le proprietà.
- Nuovo tipo di valori restituiti — .
- Nuovo tipo — , che può essere utilizzato per definire l'accettazione da parte di una funzione di parametri di diversi tipi.
- Espressione per la gestione delle eccezioni.
- per creare oggetti che possono essere sacrificati durante la raccolta dei rifiuti (ad esempio, per memorizzare cache opzionali).
- uso dell'espressione «::class» per gli oggetti (equivalente alla chiamata di get_class()).
- definizioni nel blocco catch di eccezioni non legate a variabili.
- lasciare il simbolo della virgola dopo l'ultimo elemento nella lista dei parametri della funzione.
- Nuova interfaccia per identificare qualsiasi tipo di stringa o dati che possono essere convertiti in una stringa (per i quali è disponibile il metodo __toString()).
- Nuova funzione , un analogo semplificato di strpos per determinare l'inserimento di una sottostringa, così come le funzioni str_starts_with() e str_ends_with() per verificare le corrispondenze all'inizio e alla fine della stringa.
- È stata aggiunta una funzione , che esegue l'operazione di divisione senza generare un errore in caso di divisione per zero.
- la logica di concatenazione delle stringhe. Ad 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, le espressioni «[] % [42]» e «$object + 4» genereranno un errore.
- un algoritmo di ordinamento stabile, in cui l'ordine degli stessi valori è preservato in esecuzioni diverse.
Fonte: opennet.ru
