JS Hoisting
Temel Bilgiler
JavaScript dilinde, Hoisting olarak bilinen bir mekanizma, değişkenlerin, fonksiyonların, sınıfların veya importların bildirimlerinin, kodun çalıştırılmadan önce kapsamlarının en üstüne kavramsal olarak yükseltildiği şekilde tanımlanır. Bu işlem, JavaScript motoru tarafından otomatik olarak gerçekleştirilir ve motor, betiği birden fazla geçişte tarar.
İlk geçiş sırasında, motor, sözdizimi hatalarını kontrol etmek ve betiği soyut sözdizim ağacına dönüştürmek için kodu ayrıştırır. Bu aşama, hoisting'i içeren bir süreç olan bildirimleri yürütme bağlamının en üstüne taşır. Ayrıştırma aşaması, sözdizimi hataları olmadığını gösteren başarılı bir şekilde tamamlandığında, betik yürütmesi devam eder.
Şunları anlamak önemlidir:
Betik, yürütme için sözdizimi hatalarından arındırılmış olmalıdır. Sözdizimi kurallarına kesinlikle uyulmalıdır.
Kodun betik içindeki yerleşimi, hoisting nedeniyle yürütme üzerinde etkili olur, ancak yürütülen kod, metinsel temsilinden farklı olabilir.
Hoisting Türleri
MDN'den alınan bilgilere göre, JavaScript'te dört farklı hoisting türü bulunmaktadır:
Değer Hoisting: Bir değişkenin değerinin, bildirim satırından önceki kapsamında kullanılmasını sağlar.
Bildirim Hoisting: Bir değişkenin bildiriminden önceki kapsamında başvurulmasına izin verir ve
ReferenceError
hatası oluşturmadan, değişkenin değeriundefined
olur.Bu tür, değişkenin gerçek bildirim satırından önceki bildirimi nedeniyle kapsam içindeki davranışı değiştirir.
Bildirimin yan etkileri, içeren kodun geri kalanının değerlendirilmeden önce gerçekleşir.
Ayrıntılı olarak, fonksiyon bildirimleri 1. tür hoisting davranışını sergiler. var
anahtar kelimesi 2. tür davranışı gösterir. let
, const
ve class
içeren leksikal bildirimler 3. tür davranışı gösterir. Son olarak, import
ifadeleri, hem 1. tür hem de 4. tür davranışlarla hoisted olarak benzersizdir.
Senaryolar
Bu nedenle, tanımlanmamış bir nesnenin kullanıldıktan sonra JS kodu enjekte edebileceğiniz senaryolarda, bunu bildirerek (böylece kodunuz hata fırlatmak yerine yürütülür):
Daha Fazla Senaryo
In addition to the scenarios mentioned earlier, there are a few more scenarios where JavaScript hoisting can be exploited for XSS attacks. Let's take a look at them:
1. Function Declarations
When a function is declared using the function
keyword, it is hoisted to the top of its scope. This means that even if the function is defined after it is called, it can still be executed without any errors. Attackers can take advantage of this behavior to execute malicious code.
2. Variable Declarations
Similarly, variable declarations using the var
keyword are also hoisted to the top of their scope. This allows attackers to use variables before they are actually declared.
3. Object Declarations
When an object is declared using the var
keyword, the variable is hoisted but the object itself is not. However, the properties of the object can still be accessed before the object is declared.
4. Function Expressions
Unlike function declarations, function expressions are not hoisted. Therefore, if a function expression is used before it is defined, an error will occur.
By understanding these additional scenarios, you can further exploit JavaScript hoisting for XSS attacks. Remember to always validate and sanitize user input to prevent such vulnerabilities.
Referanslar
Last updated