Kural
Kaçın rekürsiyonu olmadan derinlik kullanmaktan kaçının.
Derinlik derinlik derinlik derinlik derinlik riskler yığın
taşma ve oluşturur DoS güvenlik açıkları oluşturur kötü niyetli
girişlerden Yineleme ile derinlik derinlik derinlik ve uygun
sınırları kontrolü kabul kabul edilebilir.
Dil desteği: 45+Giriş
Derinlik sınırı olmayan özyinelemeli işlevler, çağrı yığınını tüketerek sistemin çökmesine neden olabilir. Derinlemesine iç içe geçmiş JSON nesneleri veya döngüsel veri yapıları gibi kötü niyetli girdiler, kasıtlı olarak sınırsız özyinelemeyi tetikleyebilir. Tek bir özel olarak hazırlanmış istek, yığın sınırlarını aşarak hizmetinizi çökertebilir ve istismar edilmesi son derece kolay bir hizmet reddi güvenlik açığı yaratabilir.
Neden önemli?
Güvenlik etkileri (DoS saldırıları): Saldırganlar, derin özyinelemeyi tetikleyerek uygulamanızı çökertecek girdiler oluşturabilir. Derinlemesine iç içe geçmiş JSON, XML veya bağlantılı veri yapıları yaygın saldırı vektörleridir. Tek bir kötü niyetli istek, yığını tüketerek tüm kullanıcılar için hizmetin tamamını devre dışı bırakır.
Sistem kararlılığı: Yığın taşması hataları, kademeli bir bozulma süreci olmaksızın işlemi anında çökertir. Üretim ortamında bu durum, isteklerin kaybolması, işlemlerin kesintiye uğraması ve hizmetin kullanılamaması anlamına gelir. Sorunun giderilmesi için uygulamanın tamamının yeniden başlatılması gerekir.
Kaynak tükenmesi: Sınırsız özyineleme, yığın belleğini katlanarak tüketir. Her özyinelemeli çağrı bir yığın çerçevesi ekler ve derin özyineleme zincirleri megabaytlarca bellek tüketebilir. Bu durum, aynı sunucudaki diğer işlemleri etkiler ve bellek yetersizliği durumlarına yol açabilir.
Kod örnekleri
❌ Uygun değil:
function processNestedData(obj) {
if (typeof obj !== 'object' || obj === null) {
return obj;
}
const result = {};
for (const key in obj) {
result[key] = processNestedData(obj[key]);
}
return result;
}Neden yanlış: Derinlik sınırı olmaması, saldırganların yığın sınırlarını aşan, derinlemesine iç içe geçmiş nesneler göndermesine olanak tanır. Şu tür girdiler: {a: {a: {a: {...}}}} 10.000 seviyeye kadar iç içe geçmiş yapılar, yığın taşması nedeniyle uygulamanın çökmesine neden olur. İşlev, derinliği kontrol etmeden körü körüne yinelenir.
✅ Uygunluk:
function processNestedData(obj, depth = 0, maxDepth = 100) {
if (depth > maxDepth) {
throw new Error('Maximum nesting depth exceeded');
}
if (typeof obj !== 'object' || obj === null) {
return obj;
}
const result = {};
for (const key in obj) {
result[key] = processNestedData(obj[key], depth + 1, maxDepth);
}
return result;
}Bunun önemi: Şu maxDepth Bu parametre, yığın taşmasını önlemek amacıyla yinelemeyi 100 seviyeyle sınırlar. Bu sınır, meşru iç içe veri yapıları için yeterince yüksek olmakla birlikte (gerçek dünyadaki verilerin çoğu nadiren 10-20 seviyeyi aşar), önemli miktarda yığın belleği tüketilmeden saldırıları durdurmak için de yeterince düşüktür. Kötü niyetli, derinlemesine iç içe geçmiş girdiler, uygulamanın çökmesine neden olmak yerine bir hata verir. Derinlik kontrolü, işleme öncesinde gerçekleştirilir ve sınırlar aşıldığında hızlı bir şekilde hata verilir.
Sonuç
Dış verileri işleyen tüm özyinelemeli işlevlere derinlik parametreleri ekleyin. Beklenen veri yapısı karmaşıklığına göre makul maksimum derinlik değerleri belirleyin. Derinlik sınırları aşıldığında, programın çökmesi yerine hata mesajı verin veya varsayılan değerleri döndürün.

