Aikido

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

Mantık hatası

Kural
Çelişkili veya imkansız mantığı tespit
edin. Denetim akışı göz önüne alındığında 
zaten ihlal edilmiş koşulları kontrol eden
veya imkansız durumları varsayan kod. control flow.

Desteklenen diller: 45+

Giriş

Çelişkili mantık, kod önceki denetim akışına (control flow) göre zaten doğru veya yanlış olduğu bilinen koşulları kontrol ettiğinde ortaya çıkar. Bu durum, yeniden düzenleme sonrasında doğrulama sıralaması değiştirildiğinde veya geliştiriciler halihazırda hangi garantilerin mevcut olduğunu anlamadan savunmacı kontroller eklediğinde gerçekleşir. Bir fonksiyon if (user !== null) çağrıldıktan sonra user.email kontrolünü yapıyorsa çelişkili bir mantığa sahiptir; null kontrolü çok geç gelmektedir. Bu mantıksal imkansızlıklar, kod organizasyonundaki daha derin sorunlara veya her kod yolunun neyi garanti ettiğinin eksik anlaşılmasına işaret eder.

Neden önemli?

Güvenlik etkileri: Yanlış doğrulama, tehlikeli bir güvenli̇k illüzyonu yaratır. Güvenlik kontrolleri veriler zaten kullanıldıktan sonra gerçekleştirildiğinde, saldırganlar doğrulama yapılana kadarki zaman aralığını istismar edebilir. Ayrıcalıklı işlemler yürütüldükten sonra kullanıcı izinlerini doğrulayan kodlar gerçek bir koruma sağlamaz; yalnızca güvenlikle ilgili yanıltıcı yorumlar sunar.

Kodun sürdürülebilirliği: Çelişkili mantık, kodun geliştiricinin zihinsel modeliyle uyuşmadığını gösterir. Birisi bir koşulun kontrol edilmesi gerektiğine karar vermiş ancak bunu yanlış yere koymuş ya da ilgili kontroller güncellenmeden kod yeniden yapılandırılmış (refactor) olabilir. Gelecekte kodu sürdürecek kişiler, ihtiyaç duyulan yerde doğrulama olduğuna güvenemez ve gerçek güvenlik garantilerini anlamak için tüm fonksiyonları incelemek zorunda kalır.

Hata göstergeleri: İmkânsız koşullar nadiren tek başına var olur. Eksik hata yönetimi, fonksiyon sözleşmeleri hakkında yanlış varsayımlar veya başarısız yeniden yapılandırma gibi daha derin sorunların sinyalini verirler. Asla yürütülemeyen bir kontrol, genellikle bu durumu engellemesi gereken başka bir kontrolün başka bir yerde eksik olduğu anlamına gelir.

Kod örnekleri

❌ Kural dışı:

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, items order.items.reduce() değeri null veya undefinedçökmeye neden olduğunda çağrılır ve ardından öğelerin var olup olmadığını kontrol eder. Ayrıca total < 0 kontrolü de çelişkilidir çünkü reduce fonksiyonu fiyatları toplarken her zaman negatif olmayan değerler döndürür.

✅ Kurallara uygun:

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' };
}

Neden önemli?: Tüm doğrulamalar veriler kullanılmadan önce gerçekleşir, kontroller mantıksal sırayla yapılır ve koşullar gerçek gereksinimleri yansıtır. Fonksiyon girdileri baştan doğrular, ardından gereksiz veya çelişkili kontroller olmaksızın geçerli verileri işler.

Sonuç

Doğrulamaları veriyi kullandıktan sonra değil, önce gerçekleştirin. Savunmacı gibi görünen ancak verilere zaten erişildikten veya veriler değiştirildikten sonra ortaya çıkan koşulları gözden geçirin. Yeniden yapılandırma (refactoring) sırasında, fonksiyon genelinde mantıksal tutarlılığı korumak için ilgili doğrulamaları 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ımdan önce fonksiyon sınırlarında doğrular. Çelişkili mantık ise kullanımdan sonra doğrulama yapar veya daha önceki kodlar tarafından zaten garanti edilmiş koşulları kontrol eder. Zamanlama ve gereklilik önem taşır. Eğer kullanıcı nesnesi zaten user.email ile çözümlendiyse, sonrasında if (user) kontrolü yapmak savunmacı değil, çelişkilidir.

TypeScript'teki tür daraltma (type narrowing) durumu nedir?

TypeScript'in akış kontrolü analizi, her noktada neyin mümkün olduğunu takip eder. TypeScript bir kontrole izin veriyorsa, koşul erişilebilir olabilir. Ancak çalışma zamanı (runtime) JavaScript bu türleri zorlamaz; bu nedenle tür güvenliğine rağmen çelişkili çalışma zamanı kontrolleri hâlâ var olabilir. Yalnızca statik türlere değil, çalışma zamanı akış kontrolüne odaklanın.

Çelişkili mantık güvenlik açıkları (vulnerability) oluşturabilir mi?

Evet, güvenlik kontrolleri ayrıcalıklı işlemler yürütüldükten sonra gerçekleştiğinde bu durum yaşanır. Veritabanı yazma işlemlerinden sonra izinleri kontrol etmek, SQL sorgusu çalıştırıldıktan sonra girdileri doğrulamak veya hassas veriler ifşa edildikten sonra kimlik doğrulamasını onaylamak, zamanlama açıkları (TOCTOU) yaratır. Güvenliğin etkili olması için doğrulamanın eylemden önce gelmesi gerekir.

İmkânsız gibi görünen hata yönetimi kodları hakkında ne söylenebilir?

Daha önceki doğrulamalar göz önüne alındığında oluşamayacak istisnalar için yazılan hata yakalayıcılar, aşırı savunmacı programlamaya veya doğrulama eklenmeden önceki eski hata yönetimi yaklaşımlarına işaret edebilir. Her hata yolunun gerçekten erişilebilir olup olmadığını inceleyin. Eğer imkânsızsa, kodu basitleştirmek ve gelecekte kodu sürdürecek kişilerin kafasını karıştırmamak için bunu kaldırın.

Mevcut kodda çelişkili mantığı nasıl bulabilirim?

Veri erişiminden sonra yapılan doğrulama kontrollerine, önceki dallara göre her zaman doğru veya yanlış olan koşullara ve halihazırda engellenmiş durumlar için yazılan hata yönetimlerine dikkat edin. Kod kapsamı (code coverage) araçları, erişilemeyen dalları belirlemeye yardımcı olur. Doğrulama kalıplarının manuel olarak incelenmesi, çok geç gerçekleşen veya imkânsı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.