Società Vimeo nuova versione dell'analizzatore statico , che consente di identificare errori sia evidenti che subdoli nel codice PHP, nonché di correggere automaticamente alcuni tipi di errori. Il sistema è adatto per identificare problemi sia nel codice legacy che nel codice che utilizza funzionalità moderne introdotte nei nuovi rami di PHP. Il codice del progetto è scritto in PHP e con licenza MIT.
Salmo identifica la maggior parte dei problemi associati all'utilizzo errato del tipo, oltre a vari . Ad esempio, supporta avvisi relativi alla combinazione di variabili di tipo diverso in un'espressione, test logici errati (come "if ($a && $a) {}", "if ($a && !$a) {}" e " if ( $a) {} elseif ($a) {}"), inizializzazione incompleta delle proprietà dell'oggetto. L'analizzatore funziona in modalità multi-thread. È possibile eseguire scansioni incrementali, che analizzano solo i file che sono cambiati dall'ultima scansione.
Inoltre, vengono forniti strumenti di programmazione sicuri per consentire annotazioni nel formato (“/** @var Type */”) per fornire informazioni su tipi di variabili, valori restituiti, parametri di funzione, proprietà dell'oggetto. È inoltre supportata la definizione di modelli di utilizzo del tipo e l'utilizzo di istruzioni assert. Per esempio:
/** @var stringa|null */
$a = pippo();
/** @var stringa $a */
echo strpos($a, 'ciao');
/** @salmo-asserisci-se-vero B $a */
funzione isValidB(A $a) : bool {
restituisce $un'istanza di B && $a->isValid();
}
Per automatizzare l'eliminazione dei problemi riscontrati, viene fornita l'utilità Salterio, che supporta plugin e risolvere i problemi comuni del codice, aggiungere annotazioni di tipo ed eseguire manipolazioni come spostare classi da uno spazio dei nomi a un altro, spostare metodi tra classi e rinominare classi e metodi.
Nel nuovo numero di Salmo l'opzione "--taint-analysis" consente di tracciare la relazione tra i parametri di input ricevuti dall'utente (ad esempio, $_GET['nome']) e il loro utilizzo in luoghi che richiedono l'escape dei caratteri (ad esempio, echo " $nome "), anche attraverso il tracciamento di catene di assegnazioni intermedie e chiamate di funzioni. L'uso degli array associativi $_GET, $_POST e $_COOKIE è considerato fonte di dati potenzialmente pericolosi, ma è anche possibile proprie fonti. Le azioni che richiedono il tracciamento dell'escape includono operazioni di output che generano contenuto HTML, aggiungono intestazioni HTTP o eseguono query SQL.
La convalida viene utilizzata quando si utilizzano funzioni come echo, exec, include e header. Nell'analisi della necessità di escape vengono presi in considerazione tipi di dati come testo, stringhe con codice SQL, HTML e Shell, stringhe con parametri di autenticazione. La modalità proposta consente di identificare le vulnerabilità nel codice che portano al cross-site scripting (XSS) o alla sostituzione SQL.
Inoltre si può notare test alpha del nuovo ramo PHP 8.0. L'uscita è prevista per il 26 novembre. Nella nuova filiale sono attesi: Come:
- , il cui utilizzo migliorerà la produttività.
- Sostegno , definendo raccolte di due o più tipi (ad esempio, "funzione pubblica foo(Foo|Bar $input): int|float;").
- Sostegno (annotazioni) che consentono di associare metadati (come informazioni sul tipo) alle classi senza utilizzare la sintassi Docblock.
- definizioni di classe, che consentono di combinare la definizione di un costruttore e le proprietà.
- Nuovo tipo di reso - .
- Nuovo tipo - , che può essere utilizzato per determinare se una funzione accetta parametri di tipo diverso.
- espressione per gestire le eccezioni.
- per creare oggetti che possono essere sacrificati durante la garbage collection (ad esempio, per archiviare cache non necessarie).
- utilizzando l'espressione “::class” per gli oggetti (analoga alla chiamata get_class()).
- definizioni nel blocco catch delle eccezioni che non sono legate alle variabili.
- lasciando una virgola dopo l'ultimo elemento nell'elenco dei parametri della funzione.
- Nuove interfacce per identificare eventuali tipi di stringa o dati che possono essere convertiti in una stringa (per i quali è disponibile il metodo __toString()).
- Nuova caratteristica , un analogo semplificato di strpos per determinare l'occorrenza di una sottostringa, nonché le funzioni str_starts_with() e str_ends_with() per verificare le corrispondenze all'inizio e alla fine di una stringa.
- Funzione aggiunta , che esegue un'operazione di divisione senza generare errori durante la divisione per zero.
- logica di unione delle stringhe. Ad esempio, l'espressione 'echo "sum:" . $a + $b' era precedentemente interpretato come 'echo ("sum: " . $a) + $b', mentre in PHP 8 verrà trattato come 'echo "sum: " . ($a + $b)'.
- controllando le operazioni aritmetiche e di bit, ad esempio, le espressioni "[] % [42]" e "$oggetto + 4" genereranno un errore.
- un algoritmo di ordinamento stabile in cui l'ordine di valori identici viene preservato tra esecuzioni diverse.
Fonte: opennet.ru
