Aikido

Kodunuzdaki çelişkili mantığı nasıl tespit edip düzeltebilirsiniz?

Mantık hatası

Kural
Algılama çelişkili veya imkansız mantık
Kod ki koşulları koşulları koşulları koşulların 
zaten ihlal ihlal edildikten ya da varsayar devletlerin
ki olması imkansız verildiğinde koşullar altında kontrol akışı göz önüne alındığında.

Desteklenen diller: 45+

Giriş

Çelişkili mantık, kodun önceki kontrol akışına göre zaten doğru veya yanlış olduğu bilinen koşulları kontrol ettiği durumlarda ortaya çıkar. Bu durum, yeniden yapılandırma sonrasında doğrulama işlemlerinin sırası değiştiğinde ya da geliştiricilerin halihazırda hangi garantilerin mevcut olduğunu anlamadan önleyici kontroller eklediklerinde meydana gelir. Bir fonksiyonun kontrol etmesi if (kullanıcı !== null) aradıktan sonra kullanıcı.e-posta çelişkili bir mantığa sahiptir; boşluk kontrolü çok geç yapılmaktadır. Bu mantıksal imkansızlıklar, kodun düzenlenişinde daha derin sorunlara ya da her bir kod yolunun neyi garanti ettiğine dair anlayış eksikliğine işaret etmektedir.

Neden önemli?

Güvenlik açısından sonuçları: Yanlış doğrulama, tehlikeli bir güvenlik yanılsaması yaratır. Güvenlik kontrolleri, veriler çoktan kullanıldıktan sonra devreye girdiğinde, saldırganlar doğrulama işlemi gerçekleşmeden önceki bu zaman aralığından yararlanabilir. Ayrıcalıklı işlemleri gerçekleştirdikten sonra kullanıcı izinlerini doğrulayan kod, gerçek bir koruma sağlamaz; sadece güvenlik konusunda yanıltıcı açıklamalar sunar.

Kodun bakım kolaylığı: Çelişkili mantık, kodun geliştiricinin zihinsel modeliyle uyuşmadığını gösterir. Birisi bir koşulun kontrol edilmesi gerektiğini düşünmüş ancak bunu yanlış yere yerleştirmiş olabilir ya da kod, ilgili kontroller güncellenmeden yeniden düzenlenmiş olabilir. Gelecekteki bakımcılar, gerekli yerlerde doğrulama işlemlerinin mevcut olduğuna güvenemezler; bu da onları, gerçek garantileri anlamak için fonksiyonların tamamını tek tek incelemek zorunda bırakır.

Hata göstergeleri: İmkânsız koşullar nadiren tek başına ortaya çıkar. Bunlar, hata işleme eksikliği, işlev sözleşmeleriyle ilgili yanlış varsayımlar veya başarısız yeniden yapılandırma gibi daha derin sorunlara işaret eder. Asla yürütülmeyen bir kontrol, genellikle bu durumu önlemesi gereken başka bir yerdeki kontrolün eksik olduğu anlamına gelir.

Kod örnekleri

❌ Uygun değil:

function processOrder(order) {
    if (!order) {
        return { error: 'Order required' };
    }

    const total = order.items.reduce(
        (sum, item) => sum + item.price,
        0
    );

    if (order.items && order.items.length > 0) {
        applyDiscount(order);
    }

    if (total < 0) {
        throw new Error('Invalid total');
    }

    return { total, status: 'processed' };
}

Neden yanlış: Kod şu çağrıyı yapar: order.items.reduce() eğer items, null veya tanımlanmamış, ardından öğelerin mevcut olup olmadığını kontrol eder. Bu total < 0 Bu kontrol ayrıca çelişkili bir durum oluşturmaktadır; zira fiyatları toplarken reduce işlevi her zaman negatif olmayan değerler döndürür.

✅ Uygunluk:

function processOrder(order) {
    if (!order || !order.items || order.items.length === 0) {
        return { error: 'Valid order with items required' };
    }

    const hasInvalidPrice = order.items.some(
        item => typeof item.price !== 'number' || item.price < 0
    );

    if (hasInvalidPrice) {
        throw new Error('Invalid item prices');
    }

    const total = order.items.reduce(
        (sum, item) => sum + item.price,
        0
    );

    if (order.items.length >= 5) {
        applyBulkDiscount(order);
    }

    return { total, status: 'processed' };
}

Bunun önemi: Tüm doğrulama işlemleri verilerin kullanılmasından önce gerçekleştirilir, kontroller mantıksal sırayla yapılır ve koşullar gerçek gereksinimleri yansıtır. İşlev, girdileri önceden doğrular, ardından geçerli verileri gereksiz veya çelişkili kontroller yapmadan işler.

Sonuç

Verileri kullanmadan önce, sonra değil, doğrulama işlemini gerçekleştirin. Savunmacı gibi görünen ancak verilere erişildikten veya değiştirildikten sonra ortaya çıkan koşulları gözden geçirin. Yeniden yapılandırma yaparken, fonksiyon genelinde mantıksal tutarlılığı korumak için ilgili doğrulama işlemlerini güncelleyin veya kaldırın.

Sık Sorulan Sorular

Sorularınız mı var?

Savunmacı programlamayı çelişkili mantıktan nasıl ayırt edebilirim?

Savunmacı programlama, girdileri kullanılmadan önce fonksiyon sınırlarında doğrular. Çelişkili mantık ise, girdileri kullanımdan sonra doğrular ya da daha önceki kod tarafından zaten garanti altına alınmış koşulları kontrol eder. Zamanlama ve gereklilik önemlidir. Eğer user.email ile user değişkeninin referansı zaten çözülmüşse, daha sonra (user) ifadesini kontrol etmek çelişkili bir yaklaşımdır, savunmacı bir yaklaşım değildir.

Peki ya TypeScript’teki tip daraltma?

TypeScript’in kontrol akışı analizi, her noktada nelerin mümkün olduğunu izler. TypeScript bir denetimi izin veriyorsa, ilgili koşula ulaşılabilmesi mümkündür. Ancak çalışma zamanı JavaScript’i bu türleri zorlamadığından, tür güvenliğine rağmen çelişkili çalışma zamanı denetimleri yine de ortaya çıkabilir. Yalnızca statik türlere değil, çalışma zamanı kontrol akışına da odaklanın.

Çelişkili mantık, güvenlik açıklarına yol açabilir mi?

Evet, güvenlik kontrolleri ayrıcalıklı işlemlerin yürütülmesinden sonra gerçekleştirildiğinde. Veritabanına yazma işlemlerinden sonra izinlerin kontrol edilmesi, SQL sorgusunun yürütülmesinden sonra girdilerin doğrulanması veya hassas verilerin ifşa edilmesinden sonra kimlik doğrulamasının kontrol edilmesi, hepsi “kontrol zamanı-kullanım zamanı” türünde güvenlik açıklarına yol açar. Güvenliğin etkili olabilmesi için doğrulama işleminin eylemden önce gerçekleştirilmesi gerekir.

Peki ya imkansız gibi görünen hata işleme kodları ne olacak?

Önceden yapılan doğrulama sonucunda ortaya çıkmaması gereken istisnalar için hata işleyicilerin bulunması, aşırı temkinli bir programlama yaklaşımına ya da doğrulama mekanizması eklenmeden önceki dönemden kalma, güncelliğini yitirmiş hata işleme yöntemlerine işaret edebilir. Her bir hata yoluna gerçekten ulaşılabilip ulaşılamadığını gözden geçirin. Ulaşılması mümkün değilse, kodu basitleştirmek ve gelecekteki bakım görevlilerini yanıltmamak için bu yolu kaldırın.

Mevcut kodda çelişkili mantık yapılarını nasıl tespit edebilirim?

Veri erişiminden sonra yapılan doğrulama kontrollerini, önceki dallar göz önüne alındığında her zaman doğru veya yanlış olan koşulları ve önceden önlenmiş durumlara yönelik hata işleme mekanizmalarını inceleyin. Kod kapsama araçları, ulaşılamayan dalların tespit edilmesine yardımcı olur. Doğrulama kalıplarının manuel olarak incelenmesi, çok geç gerçekleştirilen kontrolleri veya imkansız koşulları test eden kontrolleri ortaya çıkarır.

Ş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.