Vimeo Neue Version des statischen Analysetools , das sowohl offensichtliche als auch schwer fassbare Fehler im PHP-Code erkennt und automatisch einige Arten von Fehlern behebt. Das System eignet sich zur Auffindung von Problemen sowohl in veraltetem Code als auch in Code, der moderne Funktionen nutzt, die in neuen PHP-Versionen eingeführt wurden. Der Projektcode ist in PHP geschrieben und unter der MIT-Lizenz.
Psalm identifiziert die meisten Probleme im Zusammenhang mit der falschen Verwendung von Typen sowie verschiedene . Beispielsweise werden Warnungen über Variablen mit unterschiedlichen Typen in Ausdrücken unterstützt, fehlerhafte logische Überprüfungen (wie „if ($a && $a) {}“, „if ($a && !$a) {}“ und „if ($a) {} elseif ($a) {}“), unvollständige Initialisierung von Objektattributen. Der Analysator läuft im Multithreading-Modus. Inkrementelle Prüfungen sind möglich, bei denen nur die seit der letzten Überprüfung geänderten Dateien analysiert werden.
Zusätzlich werden Mittel für sicheres Programmieren bereitgestellt, die es erlauben, Annotations im («/** @var Type */») zur Bereitstellung von Informationen über die Typen von Variablen, Rückgabewerten, Funktionsparametern und Eigenschaften von Objekten. Außerdem wird die Definition von Nutzungsmustern für Typen und die Anwendung von assert-Ausdrücken unterstützt. Zum Beispiel:
/** @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();
}
Zur Automatisierung der Behebung gefundener Probleme steht das Utility Psalter zur Verfügung, das Plugins unterstützt und typische Probleme im Code behebt, Typannotationen hinzufügt und auch solche Manipulationen durchführt, wie das Verschieben von Klassen zwischen Namensräumen, das Verschieben von Methoden zwischen Klassen sowie das Umbenennen von Klassen und Methoden.
In der neuen Ausgabe von Psalm Die Option «—taint-analysis» ermöglicht es, die Verbindung zwischen den vom Benutzer eingegebenen Parametern (wie $_GET[‘name’]) und ihrer Verwendung an Stellen nachzuvollziehen, die eine Auszeichnung von Zeichen erfordern (z. B. echo «<h1>$name</h1>»), einschließlich der Verfolgung von Ketten zwischenzeitlicher Zuweisungen und Funktionsaufrufen. Als Quellen potenziell gefährlicher Daten werden die Verwendung von assoziativen Arrays wie $_GET, $_POST und $_COOKIE betrachtet, es sind jedoch auch andere Möglichkeiten denkbar. eigenen Quellen. Zu den Aktionen, die das Verfolgen von Escaping erfordern, gehören Ausgabenoperationen, die zur Erstellung von Inhalten im HTML-Format führen, das Hinzufügen von HTTP-Headern oder das Ausführen von SQL-Abfragen.
Die Überprüfung erfolgt bei der Verwendung von Funktionen wie echo, exec, include und header. Bei der Analyse der Notwendigkeit einer Escapierung werden Datentypen wie Text, SQL-Strings, HTML und Shell-Code sowie Authentifizierungsparameter berücksichtigt. Der vorgeschlagene Modus hilft, Schwachstellen im Code zu identifizieren, die zu Cross-Site-Scripting (XSS) oder SQL-Injection führen können.
speziellen Distribution die Alpha-Testphase des neuen PHP 8.0 Branches. Der Release ist für den 26. November geplant. In dem neuen Branch werden unter anderem erwartet: , wie:
- , dessen Einsatz die Leistung steigern wird.
- Support , die Sammlungen aus zwei oder mehr Typen definieren (zum Beispiel „public function foo(Foo|Bar $input): int|float;“).
- Support (Annotationen), die es ermöglichen, Metadaten (z. B. Informationen über Typen) an Klassen ohne Verwendung der Docblock-Syntax zu binden.
- zur Klassendefinition, der es erlaubt, Konstruktor- und Eigenschaftsdefinitionen zu kombinieren.
- Ein neuer Typ der Rückgabewerte — .
- Ein neuer Typ — , der verwendet werden kann, um einer Funktion Parameter mit unterschiedlichen Typen zu definieren.
- Ein Ausdruck zur Verarbeitung von Ausnahmen.
- zum Erstellen von Objekten, die beim Garbage Collection verworfen werden können (zum Beispiel zum Speichern optionaler Caches).
- Verwendung des Ausdrucks «::class» für Objekte (entspricht dem Aufruf von get_class()).
- Definition von Ausnahmen im catch-Block, die nicht an Variablen gebunden sind.
- Beibehaltung des Kommas nach dem letzten Element in der Parameterliste einer Funktion.
- Die neue Benutzeroberfläche zur Identifizierung beliebiger stringbasierter Typen oder Daten, die in einen String umgewandelt werden können (für die die Methode __toString() verfügbar ist).
- Neue Funktion , eine vereinfachte Alternative zu strpos zur Bestimmung des Vorkommens von Substrings sowie die Funktionen str_starts_with() und str_ends_with() zur Überprüfung auf Übereinstimmungen am Anfang und Ende des Strings.
- Funktion hinzugefügt , die eine Division durchführt, ohne einen Fehler bei einer Division durch Null zu erzeugen.
- die Logik der String-Verkettung. Zum Beispiel wurde der Ausdruck ‘echo «sum: » . $a + $b’ zuvor als ‘echo («sum: » . $a) + $b’ interpretiert, während er in PHP 8 als ‘echo «sum: » . ($a + $b)’ behandelt wird.
- Überprüfung von arithmetischen und bitweisen Operationen, zum Beispiel werden Ausdrücke wie «[] % [42]» und «$object + 4» zu einem Fehler führen.
- ein stabiler Sortieralgorithmus, der bei unterschiedlichen Ausführungen die Reihenfolge gleicher Werte beibehält.
Quelle: opennet.ru
