Pythonda kullanıcıdan veri alabilmek için input() ve raw_input() adlı iki farklı fonksiyondan faydalanıyoruz. Bu iki fonksiyonun kendilerine has görevleri ve kullanım alanları vardır. Ancak eğer yazdığınız kodlarda güvenliği de ön planda tutmak isterseniz input() fonksiyonundan kaçınmayı tercih edebilirsiniz. Çünkü input() fonksiyonu kullanıcıdan gelen bilgiyi bir komut olarak algılar. Peki, bu ne anlama geliyor?
Şimdi şöyle bir kod yazdığımızı düşünün:
Bu kodlarımızı çalıştırdığımızda bir sayı girin: sorusuyla karşılaşacağız. Şimdi bu soruya cevap olarak şunları yazalım:
Bunu yazıp ENTER tuşuna bastığımızda 4 çıktısını elde ediyoruz. Bu demek oluyor ki, input() fonksiyonu kullanıcıdan gelen bilgiyi bir komut olarak yorumladığı için, bu fonksiyon yardımıyla kullanıcılarımız Python kodlarını çalıştırabiliyor. Ne güzel, değil mi? Hiç de değil! Başta çok hoş bir özellik gibi görünse de bu, aslında beraberinde bazı güvenlik risklerini de getirir. Şimdi yukarıdaki programı tekrar çalıştırın ve soruya şu cevabı yazın:
ENTER tuşuna bastığınızda, o anda içinde bulunduğunuz dizin altındaki dosyaların ekranda listelendiğini göreceksiniz.
Yukarıdaki satırda geçen komutları henüz öğrenmedik. Ama yukarıdaki satır yardımıyla sistem komutlarını çalıştırabildiğimizi görüyorsunuz. Burada gördüğümüz dir bir sistem komutudur. Bu komutun görevi bir dizin altındaki dosyaları listelemek. Mesela GNU/Linuxta dosya silmemizi sağlayan komut rm, Windowsta ise deldir. Dolayısıyla yukarıdaki komutu şu şekilde yazdığımızda neler olabileceğini bir düşünün:
veya:
Hatta bu satır, şimdi burada göstermek istemediğimiz, çok daha yıkıcı sonuçlar doğurabilecek sistem komutlarının çalıştırılabilmesini sağlar (bütün sabit diski silmek gibi...). Dolayısıyla eğer özellikle sunucu üzerinden çalışacak kodlar yazıyorsanız input() fonksiyonunu kullanırken dikkatli olmalısınız.
input() fonksiyonunun yukarıdaki risklerinden ötürü Python programcıları genellikle bu fonksiyonu kullanmamayı tercih eder. Bunun yerine her zaman raw_input() fonksiyonu kullanılır. Zaten raw_input() fonksiyonu kullanıcıyla veri alış-verişine ilişkin bütün ihtiyaçlarımızı karşılayacak özelliktedir. Ancak biz henüz raw_input() fonksiyonunu tam kapasite kullanacak kadar bilgi sahibi değiliz. Birkaç bölüm sonra eksik bilgilerimizi de tamamladıktan sonra input() fonksiyonuna hiç ihtiyacınız olmadığını göreceksiniz.
Şimdi şöyle bir kod yazdığımızı düşünün:
Kod:
#!/usr/bin/env python # -*- coding: utf-8 -*- sayi = input("bir sayı girin: ") print sayi
Kod:
2 + 2
Kod:
eval("__import __('os').system('dir')")
Yukarıdaki satırda geçen komutları henüz öğrenmedik. Ama yukarıdaki satır yardımıyla sistem komutlarını çalıştırabildiğimizi görüyorsunuz. Burada gördüğümüz dir bir sistem komutudur. Bu komutun görevi bir dizin altındaki dosyaları listelemek. Mesela GNU/Linuxta dosya silmemizi sağlayan komut rm, Windowsta ise deldir. Dolayısıyla yukarıdaki komutu şu şekilde yazdığımızda neler olabileceğini bir düşünün:
Kod:
eval("__import__('os').system('rm bir_dosya')")
Kod:
eval("__import __('os').system('del bir_dosya')")
input() fonksiyonunun yukarıdaki risklerinden ötürü Python programcıları genellikle bu fonksiyonu kullanmamayı tercih eder. Bunun yerine her zaman raw_input() fonksiyonu kullanılır. Zaten raw_input() fonksiyonu kullanıcıyla veri alış-verişine ilişkin bütün ihtiyaçlarımızı karşılayacak özelliktedir. Ancak biz henüz raw_input() fonksiyonunu tam kapasite kullanacak kadar bilgi sahibi değiliz. Birkaç bölüm sonra eksik bilgilerimizi de tamamladıktan sonra input() fonksiyonuna hiç ihtiyacınız olmadığını göreceksiniz.

