En Yaygın 10 Programlama ve Kodlama Hataları
Şimdi bahsedeceğimiz geliştiriciler tarafından yapılan en yaygın programlama ve kodlama hatalarından bazılarıdır. Bu hatalar, yaygın kesintiler, veri hırsızlığı, izinsiz girişler ve daha fazlasıyla sonuçlanır. Web tasarım güvenliği yada web site güvenliği niz için, Bazı hatalar C, C++ vb. gibi belirli dillere özgü olsa da bazıları da en yaygın karşılaşılan Java, JavaScript, Python vb programlama dillerine aittir.
Bu liste şöyledir:
1. Buffer Overflow
Buffer Overflow, veri bitiminden sonra bir arabelleğe yazıldığında oluşur. Yazma pozisyonunun hatalı hesaplamaları nedeniyle ortaya çıkabilir. Ya da uzunluğunu kontrol etmeden bir buffer’a sürekli yazma. Sebep ne olursa olsun, bu hata en yaygın olanlardan biridir ve büyük istismarlarla sonuçlanmıştır. Bunlardan bazıları, 1988‘de Morris İnternet Solucanı, 2001‘de W32 / Nimda solucanı ve 2003‘te Sendmail hatasıdır.
C Örneği:
char array[6] = “hello”;
strcat(array, “, joe”); /* <- This line causes a buffer overflow. */
2. SQL Injection
SQL Injection, SQL komutlarını kullanıcı girdisine enjekte etmek için bu komutların doğrudan veritabanı tarafından yürütüldüğü bir tekniktir. Bu, saldırganın tabloları silmek, veri tabanlarını bırakmak, veri çalmak ve çok daha fazlası gibi kötü niyetli eylemler gerçekleştirmesine izin verir.
SQL Injection saldırılarının temel nedenlerinden biri, kullanıcı girdisini işleyen uygulama yazılımının, yürütme için veritabanına geçmeden önce girişte yetersiz kontrol ve doğrulama gerçekleştirmesidir.
Java Örneği:
// The following is a parameter value with SQL injection
String username = “joe’; delete from user where username like ‘%”;
Connection con = …; // create connection to database
// When this statement is executed, all users are deleted from the database.
con.createStatement().execute(“update user set logged_in = 1 where username = ‘” + username + “‘”);
3. OS Command Injection
OS Command Injection (İşletim Sistemi Komutu), kullanıcı tarafından belirlenen girişin, uygulama tarafından uygun bir şekilde inceleme yapılmadan uygulama için doğrudan işletim sistemine teslim edilmesi durumunda ortaya çıkar. Böyle bir işlem, OS‘ta mevcut bir komutu kullanmak için bir uygulama tarafından kullanılabilir. Uygulama, doğru bir şekilde doğrulamadan kullanıcı girişini geçtiğinde, bir saldırganın kötü amaçlı komutları yürütmek için akıllı yapıları kullanmasını önler. Bu komutlar örneğin dosyaları silmek, veri çalmak, dosyalardaki izinleri değiştirmek ve daha fazlası olabilir.
4. Integer Overflow or Wraparound (Tamsayı Taşması veya Silme)
Daha büyük bir değeri sığacak olandan daha büyük bir değerde depolamaya çalıştığınızda Tamsayı Taşması hatası oluşur. Bu olduğunda, daha büyük değer kesilir ve işlem öngörülemeyen bir sonucu saklar. Örneğin, 2 byte’lık bir imzasız kısa bir maksimum değer olan 65535‘i saklayabilir. Şimdi, 65530 ve 10 gibi iki kısa değer ekleyip sonucun kısa bir sürede saklandığını hayal edin. Sonuç (65545), kısaltma sonucunda hedef kısada bazı öngörülemeyen değerler bırakarak kısa sürmeyecektir. Daha sonra bu değeri başka bir işlemde (dizi dizini gibi) kullanırken, tahmin edilemeyen sonuçlar gösterir.
C Örneği:
short a = 65530, b = 10;
short c = a + b;
// on my computer, c has the unexpected value: 4
5. Improper Validation of an Array Index (Dizi Dizininin Yanlış Doğrulanması)
Yazılımda karşılaşılan bir diğer yaygın hata da dizi dizininin yanlış doğrulanmasıdır. Dizinin sınırlarının dışında kalan bir diziyi kullanarak bir diziye erişirken ortaya çıkar. Programın geçerli veri sınırları dışında bir konuma eriştiğinizde, bir bellek erişim hatasıyla sonuçlanırsınız (bölümleme ihlali olarak da bilinir). Bellek konumu veri sınırları içinde ancak dizinin dışında bulunduğunda, bu tür konumlara yazarken bellek bozulmasına bakarsınız.
Bu tür hatalar C ve C++ ile daha yaygındır, ancak Java, JavaScript, Python gibi otomatik bellek yönetimine sahip olanlar da dahil olmak üzere herhangi bir dil ile ortaya çıkabilir. Yazılımda bu tür hataların azaltılması tek yolu sizin tarafınızdan gerçekleştirilmesidir yani programcı, kodlama sırasında yeterli bakımı yapmalıdır.
6. Allocate Resources Without Limits (Sınırları Olmadan Kaynakları Tahsis Etme)
Bellek ayırma C ve C++ ‘da çok yaygındır, çünkü bu dillerdeki tüm bellek yönetimi manueldir. Atanan boyutun uygun şekilde doğrulanması olmadan bellek ayırmak, ayırmanın başarısız olmasına neden olabilir. Bu tahsisin sonucu kontrol edilmediğinde, ancak doğrudan kullanıldığında işte felaket için bir reçeteniz var demektir. Bu tür hatalar, dizileri ayırırken Java, JavaScript ve Python gibi manuel bellek yönetimi olmadan da mümkündür. Dolayısıyla, bu dillerdeki dizileri tahsis ederken uygun bakım yapılmalıdır. Ortaya çıkan bu hatanın bir başka olasılığı da uygun denetim olmadan dosya tanıtıcıları veya bağlantı kolları gibi başka kaynakların oluşturulmasıdır. Bu kaynakları kullanmanız bittiğinde uygun şekilde kapatmamak, bu kaynak sınırlarına ulaşmanın en yaygın yoludur.
7. Expired Pointer Dereference (Süresi dolan İşaretçi Dereferansı)
C ve C++ gibi dillerde, işiniz bittiğinde bellek boşaltılabilir. Zaten serbest bırakılmış olan bu bellek bloğuna bir işaretçi kullanmak hatadır. Bu tür bir hata da büyük kesintiler nedeniyle gündemdeolmuştur, bu nedenle kodunuzda bu tür bir hatanın gerçekleşmemesi için doğrulamayı düzgün biçimde yapmanız gerekir.
8. Null Pointer Dereference (Boş İşaretçi Dereferansı)
Bir işaretçi, düzgün şekilde başlatılmadan önce (veya bellek serbest bırakıldıktan sonra) boş bir değere sahip olabilir. Böyle bir işaretçiyi devre dışı bırakmak, boş bir işaretçi hatasına neden olur (Java’da Null Pointer Exception olarak adlandırılır). C, C++ ve Java‘da çok yaygındır ama diğer dillerde de mümkündür. Bu tür bir hatayı önlemek için kodunuzda dikkatli olmalısınız.
9. Missing Initialization (Eksik Başlangıç)
Yerel değişkenler, bir işlev (veya blok) içinde bildirilenler ve işlevin sonunda var olanlardır. Bu değişkenler stack’da tahsis edilir ve ilk ilan edildiğinde rasgele çöp olacaktır. Bir programcı olarak, beyan edildikleri anda bu değişkenlere uygun bir değer atamak sizin görevinizdir. Başlatmadan önce bunları kullanmak, eksik başlatma hatası ile sonuçlanır ve kesinlikle kötü bir şekilde sona erer.
C Örneği:
int pos;
char buffer[] = “hello world”;
// this line may print garbage and/or may crash the program since pos is not initialized.
printf(“Value of character at pos %d is: %c “, pos, buffer[pos]);
10. Broken or Risky Cryptographic Algorithm (Kırık veya Riskli Şifreleme Algoritması)
Kriptografi dünyası sürekli gelişmektedir. Bugün kabul edilebilir olan şey artık yarın kabul edilmeyebilir. Bunun nedeni, bilgisayarları yıllarca sürdüğü kabul edilen bilgisayar görevlerinin yarın dakikalar alabileceği bilgisayarların artan gücüne bağlı olabilir. Ya da birisi, algoritmayı işe yaramaz hale getiren belirli bir algoritmayı kırmanın yeni bir yolunu bulur.
Bu nedenle, kullandığınız algoritmalarda güvenlik açıkları ve korsanların bulunması durumunda, şifrelerinizdeki gelişmeleri sürekli olarak tutmanız ve kodunuzu güncellemeniz gerekir (eğer hala kullanılıyorsa).
Örneğin, karma algoritma olan SHA-1, bilgi işlem karmaları için artık önerilmemektedir. 2005 yılında bu algoritmaya karşı saldırılar tespit edilmiş ve SHA-2 veya SHA-3 önerilmiştir. Bu nedenle, kodunuz SHA-1‘i herhangi bir noktada kullanıyorsa, tabi yazılım hala kullanılıyorsa, önerilen olanla değiştirmeniz gerekecektir. Aksi halde, uygulamanızın saldırıya açık olduğu riskiyle karşı karşıya kalırsınız.