JS Hoisting
Last updated
Last updated
Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lerne & übe GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
In der Programmiersprache JavaScript wird ein Mechanismus beschrieben, der als Hoisting bekannt ist, bei dem Deklarationen von Variablen, Funktionen, Klassen oder Imports konzeptionell an den Anfang ihres Geltungsbereichs verschoben werden, bevor der Code ausgeführt wird. Dieser Prozess wird automatisch von der JavaScript-Engine durchgeführt, die das Skript in mehreren Durchläufen durchgeht.
Während des ersten Durchlaufs analysiert die Engine den Code, um nach Syntaxfehlern zu suchen, und verwandelt ihn in einen abstrakten Syntaxbaum. Diese Phase umfasst das Hoisting, einen Prozess, bei dem bestimmte Deklarationen an den Anfang des Ausführungskontexts verschoben werden. Wenn die Analysephase erfolgreich ist und keine Syntaxfehler vorliegen, wird die Skriptausführung fortgesetzt.
Es ist entscheidend zu verstehen, dass:
Das Skript muss frei von Syntaxfehlern sein, damit die Ausführung stattfinden kann. Syntaxregeln müssen strikt eingehalten werden.
Die Platzierung des Codes innerhalb des Skripts beeinflusst die Ausführung aufgrund des Hoistings, obwohl der ausgeführte Code von seiner textuellen Darstellung abweichen kann.
Basierend auf den Informationen von MDN gibt es vier verschiedene Arten von Hoisting in JavaScript:
Wert-Hoisting: Ermöglicht die Verwendung des Wertes einer Variablen innerhalb ihres Geltungsbereichs vor ihrer Deklarationszeile.
Deklarations-Hoisting: Ermöglicht das Referenzieren einer Variablen innerhalb ihres Geltungsbereichs vor ihrer Deklaration, ohne einen ReferenceError
auszulösen, aber der Wert der Variablen wird undefined
sein.
Diese Art verändert das Verhalten innerhalb ihres Geltungsbereichs aufgrund der Deklaration der Variablen vor ihrer tatsächlichen Deklarationszeile.
Die Nebenwirkungen der Deklaration treten auf, bevor der Rest des Codes, der sie enthält, ausgewertet wird.
Im Detail zeigen Funktionsdeklarationen das Verhalten des Typs 1 Hoisting. Das var
-Schlüsselwort demonstriert das Verhalten des Typs 2. Lexikalische Deklarationen, die let
, const
und class
umfassen, zeigen das Verhalten des Typs 3. Schließlich sind import
-Anweisungen einzigartig, da sie sowohl mit dem Verhalten des Typs 1 als auch des Typs 4 gehostet werden.
Daher, wenn du Szenarien hast, in denen du JS-Code nach der Verwendung eines nicht deklarierten Objekts einschleusen kannst, könntest du die Syntax beheben, indem du es deklarierst (damit dein Code ausgeführt wird, anstatt einen Fehler auszulösen):
Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lerne & übe GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)