JS Hoisting
Grundlegende Informationen
In der JavaScript-Sprache wird ein Mechanismus namens Hoisting beschrieben, bei dem Deklarationen von Variablen, Funktionen, Klassen oder Imports konzeptionell an den Anfang ihres Gültigkeitsbereichs verschoben werden, bevor der Code ausgeführt wird. Dieser Prozess wird automatisch vom JavaScript-Engine durchgeführt, der den Code in mehreren Durchläufen durchläuft.
Während des ersten Durchlaufs analysiert die Engine den Code, um Syntaxfehler zu überprüfen und ihn in einen abstrakten Syntaxbaum umzuwandeln. 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 wichtig zu verstehen, dass:
Das Skript frei von Syntaxfehlern sein muss, damit die Ausführung erfolgen kann. Die 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.
Arten des Hoistings
Basierend auf den Informationen von MDN gibt es vier verschiedene Arten des Hoistings in JavaScript:
Value Hoisting: Ermöglicht die Verwendung des Werts einer Variablen innerhalb ihres Gültigkeitsbereichs vor ihrer Deklarationszeile.
Declaration Hoisting: Ermöglicht das Referenzieren einer Variablen innerhalb ihres Gültigkeitsbereichs vor ihrer Deklaration, ohne einen
ReferenceError
zu verursachen, aber der Wert der Variablen wirdundefined
sein.Dieser Typ ändert das Verhalten innerhalb seines Gültigkeitsbereichs aufgrund der Deklaration der Variablen vor ihrer tatsächlichen Deklarationszeile.
Die Seiteneffekte der Deklaration treten auf, bevor der restliche Code, der sie enthält, ausgewertet wird.
Im Detail zeigen Funktiondeklarationen das Verhalten des Typs 1 Hoisting. Das Schlüsselwort var
zeigt das Verhalten des Typs 2. Lexikalische Deklarationen, zu denen let
, const
und class
gehören, zeigen das Verhalten des Typs 3. Schließlich werden import
-Anweisungen dadurch gekennzeichnet, dass sie sowohl das Verhalten des Typs 1 als auch des Typs 4 aufweisen.
Szenarien
Daher können Sie in Szenarien, in denen Sie JS-Code nach Verwendung eines nicht deklarierten Objekts injizieren können, den Syntaxfehler beheben, indem Sie es deklarieren (damit Ihr Code ausgeführt wird, anstatt einen Fehler zu werfen):
Weitere Szenarien
In addition to the scenarios mentioned earlier, there are a few more scenarios where JavaScript hoisting can be exploited for cross-site scripting (XSS) attacks. These scenarios include:
1. Function Declarations
When a function declaration is hoisted, it can be used to execute arbitrary JavaScript code. An attacker can inject malicious code into a function declaration and then call that function to trigger the XSS attack.
2. Variable Declarations
Similar to function declarations, variable declarations can also be hoisted and used to execute malicious code. An attacker can inject JavaScript code into a variable declaration and then use that variable to trigger the XSS attack.
3. Event Handlers
Event handlers, such as onclick
or onmouseover
, can also be exploited using JavaScript hoisting. An attacker can inject malicious code into an event handler and then trigger the event to execute the code.
4. Inline Scripts
Inline scripts, which are JavaScript code embedded directly in HTML tags, can also be vulnerable to XSS attacks through hoisting. An attacker can inject malicious code into an inline script and then trigger the execution of that code.
By understanding these additional scenarios, you can better identify and mitigate XSS vulnerabilities that exploit JavaScript hoisting.
Referenzen
Last updated