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 dilinde, değişkenlerin, fonksiyonların, sınıfların veya importların tanımlarının, kod çalıştırılmadan önce kapsamlarının en üstüne kavramsal olarak yükseltildiği bir mekanizma olan Hoisting tanımlanmıştır. Bu süreç, JavaScript motoru tarafından otomatik olarak gerçekleştirilir ve motor, scripti birden fazla geçişte inceler.
İlk geçişte, motor kodu sözdizimi hatalarını kontrol etmek için ayrıştırır ve onu soyut bir sözdizimi ağacına dönüştürür. Bu aşama, belirli tanımların yürütme bağlamının en üstüne taşındığı hoisting işlemini içerir. Ayrıştırma aşaması başarılı olursa, yani sözdizimi hatası yoksa, scriptin çalıştırılması devam eder.
Anlamak önemlidir ki:
Scriptin çalıştırılması için sözdizimi hatalarından arınmış olması gerekir. Sözdizimi kurallarına kesinlikle uyulmalıdır.
Script içindeki kodun yerleşimi, hoisting nedeniyle yürütmeyi etkiler, ancak yürütülen kodun metinsel temsili farklı olabilir.
MDN'den alınan bilgilere dayanarak, JavaScript'te dört farklı hoisting türü vardır:
Değer Hoisting: Bir değişkenin değerinin, tanım satırından önce kapsamı içinde kullanılmasına olanak tanır.
Tanım Hoisting: Bir değişkenin tanımından önce kapsamı içinde referans verilmesine izin verir, bu da ReferenceError
oluşturmaz, ancak değişkenin değeri undefined
olacaktır.
Bu tür, değişkenin gerçek tanım satırından önce tanımlanması nedeniyle kapsam içindeki davranışı değiştirir.
Tanımın yan etkileri, onu içeren diğer kodun değerlendirilmesinden önce gerçekleşir.
Detaylı olarak, fonksiyon tanımları tür 1 hoisting davranışı sergiler. var
anahtar kelimesi tür 2 davranışını gösterir. let
, const
ve class
gibi sözcüksel tanımlar tür 3 davranışını gösterir. Son olarak, import
ifadeleri, hem tür 1 hem de tür 4 davranışlarıyla hoisted olan benzersiz bir özelliğe sahiptir.
Bu nedenle, Tanımsız bir nesne kullanıldıktan sonra JS kodu enjekte edebileceğiniz senaryolarınız varsa, onu tanımlayarak sözdizimini düzeltebilirsiniz (böylece kodunuz bir hata fırlatmak yerine çalıştırılır):
AWS Hacking öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE) GCP Hacking öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)