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ı strcpy
gö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_s
değ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 _access
değiştirinaccess
) veya tanımlayarak _CRT_NONSTDC_NO_WARNINGS
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:
- 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_handler
aracılığıyla_set_invalid_parameter_handler
bu sorunları denetlemenize olanak tanır.- Değerler denetleniyor
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. gibigets
giriş 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ıperrno
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ı