Aikido

Derinlik koruması olmadan özyinelemeden neden kaçınmalısınız?

Hata Riski

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.

Sık Sorulan Sorular

Sorularınız mı var?

Makul bir maksimum özyineleme derinliği ne kadardır?

Veri yapılarınıza bağlıdır. JSON ayrıştırma veya ağaç taraması için 100-1000 seviye makul bir aralıktır. Çoğu meşru veri yapısı 10-20 seviyeyi aşmaz. Alanınıza göre sınırlar belirleyin, ancak her zaman bir sınır koyun. Gerçek derinlikleri görmek için üretim ortamını izleyin ve buna göre ayarlamalar yapın.

Yinelemeyi yinelemeli işleme nasıl dönüştürebilirim?

Açık yığınlar veya kuyruklar kullanın. Özyinelemeli çağrıları, öğeleri yığına ekleyen, ardından bunları yığından alıp işleyen döngülerle değiştirin. Bu, bellek kullanımı ve derinlik üzerinde tam kontrol sağlar. Ağaç taraması için, açık veri yapıları kullanılarak yapılan genişlik öncelikli veya derinlik öncelikli yinelemeler, yığın taşmasını önler.

Derinliği, özyinelemeli çağrıların başında mı yoksa sonunda mı kontrol etmeliyim?

Başlangıçta, herhangi bir işleme yapılmadan önce. Sınırlar aşıldığında bu işlem hızla başarısız olur ve reddedilecek veriler üzerinde gereksiz hesaplama yapılmasını önler. İşlev girişindeki koruma koşulları, derinlik kontrollerini açık hale getirir ve denetlenmesini kolaylaştırır.

Yinelemeli işlevlerde döngüsel referansları nasıl ele almalıyım?

Ziyaret edilen nesneleri bir Set veya WeakSet içinde takip edin. Yinelemeye başlamadan önce, nesnenin daha önce ziyaret edilip edilmediğini kontrol edin. Eğer öyleyse, ya onu atlayın, ya bir hata verin ya da bir yer tutucu döndürün. Bu, döngüsel veri yapılarından kaynaklanan sonsuz yinelemeyi önler: obj.child.parent === obj.

Şimdi güvenliğinizi sağlayın

Kodunuzu, bulutunuzu ve çalışma zamanınızı tek bir merkezi sistemde güvenceye alın.
Güvenlik açıklarını otomatik olarak hızla bulun ve düzeltin.

Kredi kartı gerekmez | Tarama sonuçları 32 saniyede.