Rilascio di Salmo 3.12, un analizzatore statico per il linguaggio PHP. Versione alfa di PHP 8.0

Società Vimeo pubblicato nuova versione dell'analizzatore statico Salmo 3.12, 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 distribuito da con licenza MIT.

Salmo identifica la maggior parte dei problemi associati all'utilizzo errato del tipo, oltre a vari errori tipici. 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 utilizzare annotazioni nel formato Docblock (“/** @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 permette 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 implementato 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 inizio test alpha del nuovo ramo PHP 8.0. L'uscita è prevista per il 26 novembre. Nella nuova filiale sono attesi: innovazioniCome:

  • Включение Compilatore JIT, il cui utilizzo migliorerà la produttività.
  • Sostegno tipologie sindacali, definendo raccolte di due o più tipi (ad esempio, "funzione pubblica foo(Foo|Bar $input): int|float;").
  • Sostegno attributi (annotazioni) che consentono di associare metadati (come informazioni sul tipo) alle classi senza utilizzare la sintassi Docblock.
  • Sintassi abbreviata definizioni di classe, che consentono di combinare la definizione di un costruttore e le proprietà.
  • Nuovo tipo di reso - statico.
  • Nuovo tipo - misto, che può essere utilizzato per determinare se una funzione accetta parametri di tipo diverso.
  • espressione gettare per gestire le eccezioni.
  • Mappa debole per creare oggetti che possono essere sacrificati durante la garbage collection (ad esempio, per archiviare cache non necessarie).
  • Opportunità utilizzando l'espressione “::class” per gli oggetti (analoga alla chiamata get_class()).
  • Opportunità definizioni nel blocco catch delle eccezioni che non sono legate alle variabili.
  • Opportunità lasciando una virgola dopo l'ultimo elemento nell'elenco dei parametri della funzione.
  • Nuove interfacce Stringabile per identificare eventuali tipi di stringa o dati che possono essere convertiti in una stringa (per i quali è disponibile il metodo __toString()).
  • Nuova caratteristica str_contains(), 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 fdiv(), che esegue un'operazione di divisione senza generare errori durante la divisione per zero.
  • Cambiato 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)'.
  • Stretto controllando le operazioni aritmetiche e di bit, ad esempio, le espressioni "[] % [42]" e "$oggetto + 4" genereranno un errore.
  • Implementato un algoritmo di ordinamento stabile in cui l'ordine di valori identici viene preservato tra esecuzioni diverse.

Fonte: opennet.ru

Aggiungi un commento