JS Hoisting
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
W języku JavaScript opisany jest mechanizm znany jako Hoisting, w którym deklaracje zmiennych, funkcji, klas lub importów są konceptualnie przenoszone na górę ich zakresu przed wykonaniem kodu. Proces ten jest automatycznie realizowany przez silnik JavaScript, który przetwarza skrypt w wielu przejściach.
Podczas pierwszego przejścia silnik analizuje kod, aby sprawdzić błędy składniowe i przekształca go w abstrakcyjne drzewo składniowe. Faza ta obejmuje hoisting, proces, w którym niektóre deklaracje są przenoszone na górę kontekstu wykonania. Jeśli faza analizy jest udana, co wskazuje na brak błędów składniowych, wykonanie skryptu postępuje.
Kluczowe jest zrozumienie, że:
Skrypt musi być wolny od błędów składniowych, aby mogło nastąpić wykonanie. Zasady składni muszą być ściśle przestrzegane.
Umiejscowienie kodu w skrypcie wpływa na wykonanie z powodu hoistingu, chociaż wykonywany kod może różnić się od jego reprezentacji tekstowej.
Na podstawie informacji z MDN istnieją cztery wyraźne typy hoistingu w JavaScript:
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ą bez powodowania ReferenceError
, ale wartość zmiennej będzie undefined
.
Ten typ zmienia zachowanie w swoim zakresie z powodu deklaracji zmiennej przed jej rzeczywistą linią deklaracji.
Efekty uboczne deklaracji występują przed oceną reszty kodu, który ją zawiera.
Szczegółowo, deklaracje funkcji wykazują zachowanie hoistingu typu 1. Słowo kluczowe var
demonstruje zachowanie typu 2. Deklaracje leksykalne, które obejmują let
, const
i class
, pokazują zachowanie typu 3. Na koniec, instrukcje import
są unikalne, ponieważ są hoistowane zarówno z zachowaniem typu 1, jak i typu 4.
Dlatego jeśli masz scenariusze, w których możesz Wstrzyknąć kod JS po użyciu niezadeklarowanego obiektu, możesz naprawić składnię poprzez jego zadeklarowanie (tak aby twój kod został wykonany zamiast zgłoszenia błędu):
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)