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)
У мові JavaScript описується механізм, відомий як Hoisting, де оголошення змінних, функцій, класів або імпортів концептуально піднімаються на верхню частину їхньої області видимості перед виконанням коду. Цей процес автоматично виконується движком JavaScript, який проходить через скрипт у кілька проходів.
Під час першого проходу движок аналізує код, щоб перевірити наявність синтаксичних помилок, і перетворює його в абстрактне синтаксичне дерево. Ця фаза включає підйом, процес, в якому певні оголошення переміщуються на верхню частину контексту виконання. Якщо фаза парсингу успішна, що вказує на відсутність синтаксичних помилок, виконання скрипту продовжується.
Важливо зрозуміти, що:
Скрипт повинен бути вільним від синтаксичних помилок для виконання. Правила синтаксису повинні суворо дотримуватись.
Розміщення коду в скрипті впливає на виконання через підйом, хоча виконуваний код може відрізнятися від його текстового представлення.
Відповідно до інформації з MDN, існує чотири різні типи підйому в JavaScript:
Value Hoisting: Дозволяє використовувати значення змінної в її області видимості до рядка оголошення.
Declaration Hoisting: Дозволяє посилатися на змінну в її області видимості до оголошення без виклику ReferenceError
, але значення змінної буде undefined
.
Цей тип змінює поведінку в межах його області через оголошення змінної до фактичного рядка оголошення.
Побічні ефекти оголошення відбуваються до того, як буде оцінено решту коду, що його містить.
Докладніше, оголошення функцій демонструють поведінку підйому типу 1. Ключове слово var
демонструє поведінку типу 2. Лексичні оголошення, які включають let
, const
і class
, показують поведінку типу 3. Нарешті, оператори import
є унікальними тим, що вони піднімаються з поведінками типу 1 і типу 4.
Отже, якщо у вас є сценарії, де ви можете Inject JS code after an undeclared object використовується, ви могли б fix the syntax оголосивши його (щоб ваш код виконувався замість того, щоб викликати помилку):
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)