Aracılığıyla paylaş


CRT'deki Güvenlik Özellikleri

Birçok eski CRT işlevinin daha yeni ve daha güvenli sürümleri vardır. Güvenli bir işlev varsa, eski, daha az güvenli sürüm kullanım dışı olarak işaretlenir. Yeni sürümde _s ("güvenli") son eki bulunur.

Bu bağlamda "kullanım dışı" ifadesi işlevin kullanılmasının önerilmiyor olduğu anlamına gelir. Bu, işlevin CRT'den kaldırılacağı anlamına gelmez.

Güvenli işlevler güvenlik hatalarını engellemez veya düzeltmez. Bunun yerine, oluştuklarında hataları yakalarlar. Hata koşulları için ek denetimler yapar. Bir hata varsa, bir hata işleyicisi çağırırlar (bkz . Parametre doğrulama).

Örneğin işlev, strcpy kopyalanan dizenin hedef arabellek için çok büyük olup olmadığını anlayamaz. Güvenli karşılığı olan strcpy_s, arabellek boyutunu parametre olarak alır. Bu nedenle, arabellek taşması olup olmadığını belirleyebilir. 11 karakteri 10 karakterlik arabelleğe kopyalamak için kullanırsanız strcpy_s , bu sizin hatanızdır; strcpy_s hatanızı düzeltemezsiniz. Ancak hatanızı algılayabilir ve geçersiz parametre işleyicisini çağırarak sizi bilgilendirebilir.

Kullanımdan kaldırma uyarılarını ortadan kaldırma

Eski ve daha az güvenli işlevler için kullanımdan kaldırma uyarılarını ortadan kaldırmanın çeşitli yolları vardır. En basiti pragması tanımlamak _CRT_SECURE_NO_WARNINGS veya kullanmaktır warning . Her iki durumdan biri de kullanımdan kaldırma uyarılarını devre dışı bırakır, ancak uyarılara neden olan güvenlik sorunları hala mevcuttur. Kullanımdan kaldırma uyarılarını etkin bırakmak ve yeni CRT güvenlik özelliklerinden yararlanmak daha iyidir.

C++ dilinde kullanımdan kaldırma uyarılarını ortadan kaldırmanın en kolay yolu Güvenli şablon aşırı yüklemelerini kullanmaktır. Aşırı yüklemeler çoğu durumda kullanımdan kaldırma uyarılarını ortadan kaldırır. Kullanım dışı bırakılan işlevlere yapılan çağrıları, işlevlerin güvenli sürümlerine yapılan çağrılarla değiştirir. Örneğin, için bu kullanım dışı çağrıyı strcpygöz önünde bulundurun:

char szBuf[10];
strcpy(szBuf, "test"); // warning: deprecated

1 olarak tanımlamak _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES , arabelleğin taşmasını önleyen çağrıyı strcpy olarak strcpy_sdeğiştirerek uyarıyı ortadan kaldırır. Daha fazla bilgi için bkz . Güvenli şablon aşırı yüklemeleri.

Güvenli şablon aşırı yüklemeleri olmadan kullanım dışı bırakılan işlevler için kodunuzu güvenli sürümleri kullanacak şekilde el ile güncelleştirmeyi kesinlikle göz önünde bulundurmalısınız.

Güvenlikle ilgili olmayan kullanımdan kaldırma uyarılarının bir diğer kaynağı da POSIX işlevleridir. POSIX işlev adlarını standart eşdeğerleriyle değiştirin (örneğin, olarak _accessdeğiştirinaccess) veya tanımlayarak _CRT_NONSTDC_NO_WARNINGSPOSIX ile ilgili kullanımdan kaldırma uyarılarını devre dışı bırakın. Daha fazla bilgi için bkz . Uyumluluk.

Diğer güvenlik özellikleri

Güvenlik özelliklerinden bazıları şunlardır:

  • Parametre Doğrulama

    Güvenli işlevler ve bunların güvenli olmayan karşılıklarının çoğu parametreleri doğrular. Doğrulama şunları içerebilir:

    • Değerler denetleniyor NULL .
    • Numaralandırılmış değerlerin geçerliliği denetleniyor.
    • İntegral değerlerin geçerli aralıklarda olup olmadığını denetleme.

    Daha fazla bilgi için bkz . Parametre doğrulama.

    Geçersiz parametrelerin işleyicisine geliştirici de erişebilir. bir işlev, uygulamadan onay ve çıkış yapmak yerine geçersiz bir parametreyle karşılaştığında, CRT veya _set_thread_local_invalid_parameter_handleraracılığıyla _set_invalid_parameter_handler bu sorunları denetlemenize olanak tanır.

  • Boyutlandırılmış Arabellekler

    Arabellek boyutunu arabelleğe yazan herhangi bir güvenli işleve geçirmeniz gerekir. Güvenli sürümler, arabellek yazmadan önce yeterince büyük olduğunu doğrular. Doğrulama, kötü amaçlı kodun yürütülmesine izin verebilecek tehlikeli arabellek taşması hatalarını önlemeye yardımcı olur. Bu işlevler genellikle bir errno hata kodu döndürür ve arabellek boyutu çok küçükse geçersiz parametre işleyicisini çağırır. gibi getsgiriş arabelleklerinden okuyan işlevler, en büyük boyutu belirtmenizi gerektiren güvenli sürümlere sahiptir.

  • Null sonlandırma

    Sonlandırılma olasılığı olan dizeleri bırakan bazı işlevler, dizelerin düzgün şekilde null sonlandırıldığından emin olan güvenli sürümlere sahiptir.

  • Gelişmiş hata raporlama

    Güvenli işlevler, önceden var olan işlevlerle sağlanandan daha fazla hata bilgisi içeren hata kodları döndürür. Güvenli işlevler ve önceden var olan işlevlerin çoğu artık daha iyi hata raporlaması sağlamak için bir errno kod türü de ayarlayıp errno genellikle döndürür.

  • Dosya sistemi güvenliği

    Güvenli dosya G/Ç API'leri, varsayılan durumda güvenli dosya erişimini destekler.

  • Windows güvenliği

    Güvenli işlem API'leri güvenlik ilkelerini zorunlu kılar ve ACL'lerin belirtilmesine izin verir.

  • Biçim dizesi söz dizimi denetimi

    Örneğin, biçim dizelerinde printf yanlış tür alanı karakterleri kullandığınızda geçersiz dizeler algılandı.

Ayrıca bkz.

Parametre doğrulama
Güvenli şablon aşırı yüklemeleri
C çalışma zamanı (CRT) ve C++ Standart Kitaplığı (STL) .lib dosyaları