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, strcpy işlevi kopyaladığı dizenin hedef arabellek için çok büyük olup olmadığını söyleyemez. Güvenli karşılığı olan strcpy_s, arabellek boyutunu parametre olarak alır. Bu nedenle, bir arabellek taşmasının meydana gelip gelmeyeceğini 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 basit yol, _CRT_SECURE_NO_WARNINGS tanımlamak veya warning pragmayı kullanmaktır. Ya kullanımdan kaldırma uyarılarını devre dışı bırakır veya onları tetikleyen 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, şu kullanım dışı çağrıyı strcpy göz önünde bulundurun:

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

_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES'ı 1 olarak tanımlamak, strcpy çağrısını strcpy_s olarak değiştirerek arabelleğin taşmasını önleyen 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, access'yi _access olarak değiştirin) veya _CRT_NONSTDC_NO_WARNINGS'yi tanımlayarak POSIX 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:

    • NULL değerleri kontrol ediliyor.
    • 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_invalid_parameter_handler_set_thread_local_invalid_parameter_handler bu sorunları denetlemenize olanak tanır.

  • Boyutlandırılmış Arabellekler

    Arabellek boyutunu arabelleğe yazma işlemi yapan herhangi bir güvenli işleve iletmeniz gerekir. Yazma işleminden önce arabelleğin yeterince büyük olduğunu doğrulayan güvenli sürümler vardır. 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 geri döndürür ve eğer 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.

    Güvenlikle geliştirilmiş bazı CRT işlevlerinin hata ayıklama sürümleri, kendilerine geçirilen arabelleği özel bir karakterle (0xFE) doldurur. Bu doldurma karakteri, yanlış boyutun fonksiyona iletildiği durumları bulmaya yardımcı olur. Ne yazık ki, bu aynı zamanda performansı da azaltıyor. Performansı geliştirmek için _CrtSetDebugFillThreshold kullanarak arabellek doldurmayı devre dışı bırakın. Daha fazla bilgi ve bu davranışa sahip işlevlerin listesi için bkz _CrtSetDebugFillThreshold. .

  • Null sonlandırma

    Potansiyel olarak sonlandırılmamış dizeler bırakan bazı işlevlerin, dizelerin düzgün şekilde null sonlandırılmasını sağlayan daha güvenli sürümleri vardır.

  • 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 errno ayarlar ve genellikle bir errno kod türü 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ı