JS Hoisting
Podstawowe informacje
W języku JavaScript istnieje mechanizm znany jako Hoisting, w którym deklaracje zmiennych, funkcji, klas lub importów są koncepcyjnie przenoszone na górę swojego zakresu przed wykonaniem kodu. Proces ten jest automatycznie wykonywany przez silnik JavaScript, który przechodzi przez skrypt wielokrotnie.
Podczas pierwszego przejścia silnik analizuje kod w celu sprawdzenia błędów składniowych i przekształca go w drzewo składni abstrakcyjnej. Ta faza obejmuje hoisting, czyli proces, w którym pewne deklaracje są przenoszone na górę kontekstu wykonania. Jeśli faza analizy przebiegnie pomyślnie, co oznacza brak błędów składniowych, wykonanie skryptu jest kontynuowane.
Należy zrozumieć, że:
Skrypt musi być wolny od błędów składniowych, aby doszło do wykonania. Należy ściśle przestrzegać zasad składni.
Umieszczenie kodu w skrypcie wpływa na wykonanie ze względu na hoisting, chociaż wykonany kod może różnić się od jego reprezentacji tekstowej.
Rodzaje Hoistingu
Na podstawie informacji z MDN, w języku JavaScript istnieją cztery różne rodzaje hoistingu:
Hoisting wartości: Umożliwia użycie wartości zmiennej w jej zakresie przed linią deklaracji.
Hoisting deklaracji: Pozwala na odwołanie się do zmiennej w jej zakresie przed jej deklaracją, nie powodując błędu
ReferenceError
, ale wartość zmiennej będzieundefined
.Ten rodzaj zmienia zachowanie w swoim zakresie ze względu na deklarację zmiennej przed jej rzeczywistą linią deklaracji.
Skutki uboczne deklaracji występują przed resztą kodu zawierającego tę deklarację.
Szczegółowo, deklaracje funkcji wykazują zachowanie hoistingu typu 1. Słowo kluczowe var
demonstruje zachowanie hoistingu typu 2. Deklaracje leksykalne, które obejmują let
, const
i class
, wykazują zachowanie hoistingu typu 3. Na koniec, instrukcje import
są unikalne, ponieważ są hoistowane zarówno z zachowaniem typu 1, jak i typu 4.
Scenariusze
Jeśli więc masz scenariusze, w których można wstrzyknąć kod JS po użyciu niezadeklarowanego obiektu, możesz naprawić składnię, deklarując go (w ten sposób twój kod zostanie wykonany zamiast zgłaszania błędu):
Więcej scenariuszy
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
JavaScript hoisting can also be exploited in event handlers. An attacker can inject malicious code into an event handler and then trigger that event to execute the XSS attack.
4. Inline Scripts
Inline scripts, such as those found in HTML attributes like onmouseover
or onclick
, can also be used to exploit JavaScript hoisting. An attacker can inject malicious code into an inline script and then trigger the event associated with that script to execute the XSS attack.
By understanding these additional scenarios, you can better identify and mitigate the risks associated with JavaScript hoisting in web applications.
Odwołania
Last updated