La empresa Vimeo nuevo lanzamiento del analizador estático , que permite identificar tanto errores evidentes como difíciles de detectar en el código en PHP, así como corregir automáticamente ciertos tipos de errores. El sistema es adecuado para detectar problemas tanto en código obsoleto como en código que utiliza características modernas introducidas en nuevas versiones de PHP. El código del proyecto está escrito en PHP y bajo licencia MIT.
Psalm identifica la mayoría de los problemas relacionados con el uso incorrecto de los tipos, así como diversos . Por ejemplo, se soporta la emisión de advertencias sobre la mezcla en una expresión de variables con diferentes tipos, así como comprobaciones lógicas incorrectas (como «if ($a && $a) {}», «if ($a && !$a) {}» y «if ($a) {} elseif ($a) {}»), y la inicialización incompleta de propiedades de objeto. El analizador se ejecuta en modo multihilo. Es posible realizar comprobaciones incrementales, donde solo se analizan los archivos que han cambiado desde la última verificación.
Además, se proporcionan herramientas de programación segura que permiten anotaciones en formato («/** @var Type */») para proporcionar información sobre los tipos de variables, valores devueltos, parámetros de funciones y propiedades de objetos. También se soporta la definición de patrones de uso de tipos y la aplicación de expresiones assert. Por ejemplo:
/** @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();
}
Para automatizar la corrección de los problemas encontrados, se proporciona la utilidad Psalter, que soporta plugins y solucionar problemas típicos en el código, agregar anotaciones sobre tipos, así como realizar maniobras como mover clases de un espacio de nombres a otro, mover métodos entre clases, renombrar clases y métodos.
En el nuevo lanzamiento de Psalm la opción «—taint-analysis», que permite rastrear la relación entre los parámetros de entrada recibidos del usuario (por ejemplo, $_GET['name']) y su uso en lugares que requieren la escapatoria de caracteres (por ejemplo, echo «<h1>$name</h1>»), incluyendo el seguimiento de cadenas de asignaciones intermedias y llamadas a funciones. Se consideran fuentes de datos potencialmente peligrosos el uso de arrays asociativos $_GET, $_POST y $_COOKIE, pero también es posible y fuentes propias. Dentro de las acciones que requieren seguimiento de escape, se consideran las operaciones de salida que generan contenido en formato HTML, la adición de encabezados HTTP o la ejecución de consultas SQL.
La verificación se aplica al utilizar funciones como echo, exec, include y header. Al analizar la necesidad de escape, se consideran tipos de datos como texto, cadenas SQL, HTML y código Shell, así como cadenas con parámetros de autenticación. El modo propuesto permite identificar vulnerabilidades en el código que conducen a ataques de scripting entre sitios (XSS) o inyección de código SQL.
También se puede destacar pruebas alfa de la nueva rama de PHP 8.0. El lanzamiento está programado para el 26 de noviembre. Se esperan novedades en la nueva rama como: , como:
- , cuyo uso permitirá aumentar el rendimiento.
- Soporte , que definen colecciones de dos o más tipos (por ejemplo «public function foo(Foo|Bar $input): int|float;»).
- Soporte (anotaciones), que permiten vincular metadatos (por ejemplo, información sobre tipos) a clases sin utilizar la sintaxis de Docblock.
- para la definición de clases, que permite combinar la definición del constructor y las propiedades.
- Nuevo tipo de valores de retorno — .
- Nuevo tipo — , que se puede usar para definir la recepción de parámetros de función con diferentes tipos.
- Expresión para el manejo de excepciones.
- para crear objetos que se pueden recolectar con el recolector de basura (por ejemplo, para almacenar cachés opcionales).
- de usar la expresión «::class» para objetos (análogo a la llamada a get_class()).
- definición en el bloque catch de excepciones no vinculadas a variables.
- omitir la coma después del último elemento en la lista de parámetros de la función.
- Nueva interfaz para identificar cualquier tipo de cadena o datos que se puedan convertir a una cadena (para los que está disponible el método __toString()).
- Nueva función , análogo simplificado de strpos para determinar la inclusión de una subcadena, así como las funciones str_starts_with() y str_ends_with() para verificar coincidencias al inicio y al final de una cadena.
- Se agregó la función , que realiza la operación de división sin generar un error en caso de división por cero.
- la lógica de concatenación de cadenas. Por ejemplo, la expresión ‘echo «sum: » . $a + $b’ anteriormente se interpretaba como ‘echo («sum: » . $a) + $b’, mientras que en PHP 8 se procesará como ‘echo «sum: » . ($a + $b)’.
- la verificación de operaciones aritméticas y bit a bit, por ejemplo, las expresiones «[] % [42]» y «$object + 4» generarán un error.
- un algoritmo de ordenamiento estable, donde se conserva el orden de aparición de valores idénticos en distintas ejecuciones.
Fuente: opennet.ru
