- Konu sahibi
- #1
Python uygulamasını güvenli geliştirmek için önce desteklenen bir Python sürümü ve projeye özel sanal ortam kullanın; ardından bağımlılıkları yönetin, dışarıdan gelen verileri doğrulayın ve sorgularda veriyle komutları ayırın. Uygulamayı en az yetkiyle çalıştırıp gizli bilgileri koddan uzak tutarak ve güncellemeleri test ederek riski azaltabilirsiniz. Bu adımlar tek başına güvenlik garantisi vermez; uygulamanın ağ erişimi, yetkilendirme ve dağıtım ayarları da ayrıca değerlendirilmelidir.
Güvenlik güncellemesi alan bir Python sürümü kurun ve terminalde
Proje dizininde bir sanal ortam oluşturun. Sanal ortam, projenin paketlerini diğer Python ortamlarından varsayılan olarak ayırır; ancak güvenilmeyen kod için bir güvenlik kum havuzu değildir.
Linux veya macOS'ta bash ya da zsh kullanıyorsanız
Etkin ortamda aşağıdaki komutu çalıştırın:
Çıktıdaki yolun projenin
Yalnız ihtiyacınız olan paketleri, adlarını ve kaynağını doğrulayarak kurun. Projenin bağımlılık sürümlerini bir dosyada veya kullandığınız paket yönetim aracının kilit dosyasında kaydedin; böylece geliştirme ve sunucu ortamlarında hangi sürümlerin kullanıldığını izleyebilirsiniz. Sürüm sabitlemek bilinen bir hatayı ortadan kaldırmaz: Bağımlılıkların güvenlik duyurularını düzenli izleyin, düzeltmeleri test ortamında deneyin ve ardından üretime geçirin.
Etkin sanal ortamda
API anahtarlarını, parolaları ve erişim belirteçlerini kaynak koduna veya sürüm kontrolüne koymayın. Bunları ortam değişkeni ya da dağıtım ortamınızın gizli bilgi yönetimi aracılığıyla sağlayın; erişimi uygulamanın ihtiyaç duyduğu hesaplarla sınırlayın. Bir anahtar yanlışlıkla depoya veya günlüğe yazıldıysa yalnızca kaydı silmekle yetinmeyin: Anahtarı sağlayıcıda iptal edip yenisini oluşturun ve uygulamayı yeni değerle güncelleyin.
Kullanıcıdan, dosyadan veya ağdan gelen veriyi beklediğiniz tür, uzunluk ve biçime göre doğrulayın. Doğrulama, veriyi kullanacağınız yere uygun korumaların yerine geçmez. Özellikle SQL sorgularında kullanıcı girdisini metne birleştirmek yerine parametre kullanın.
Aşağıdaki varsayımsal örneği
Kullanıcı girdisini
Bir otomasyon betiği dış program çalıştırıyorsa mümkünse Python'un kendi kütüphanelerini tercih edin.
Uygulamayı mümkünse yönetici yerine ayrı ve sınırlı yetkili bir hesapla çalıştırın. Bu hesaba yalnız gerekli dosya, veritabanı ve ağ erişimini verin. Web uygulamasında hata ayıklama modunu üretimde kapatın; ayrıntılı hata kayıtlarını erişimi sınırlandırılmış günlüklerde tutun ve kullanıcıya gizli bilgi içermeyen bir hata mesajı gösterin.
Dağıtımdan önce beklenen girdileri, reddedilmesi gereken girdileri ve yetkisiz erişim denemelerini test edin. Bir sorun incelenirken günlüklerde parola, belirteç veya kişisel veri yayımlamayın; geçici tanılama çıktısını iş bitince kaldırın. Güncelleme sonrasında testleri tekrar çalıştırın ve başarısızlık varsa ilgili hata mesajı ile değişen sürümleri karşılaştırarak uyumsuzluğu giderin.
Çalışma ortamını hazırlayın
Güvenlik güncellemesi alan bir Python sürümü kurun ve terminalde
python --version komutuyla hangi sürümün çalıştığını görün. Bazı sistemlerde komut python3 veya Windows'ta py olabilir. Kurulu sürümün hâlâ desteklenip desteklenmediğini Python'un resmî sürüm bilgilerinden doğrulayın.Proje dizininde bir sanal ortam oluşturun. Sanal ortam, projenin paketlerini diğer Python ortamlarından varsayılan olarak ayırır; ancak güvenilmeyen kod için bir güvenlik kum havuzu değildir.
Kod:
python -m venv .venv
Linux veya macOS'ta bash ya da zsh kullanıyorsanız
source .venv/bin/activate komutuyla ortamı etkinleştirin. Windows PowerShell'de .venv\Scripts\Activate.ps1, Komut İstemi'nde ise .venv\Scripts\activate.bat kullanın. Etkinleştirme zorunlu değildir; sanal ortamın içindeki Python çalıştırılabilir dosyasının yolu da doğrudan kullanılabilir.Etkin ortamda aşağıdaki komutu çalıştırın:
Kod:
python -c "import sys; print(sys.executable); print(sys.prefix != sys.base_prefix)"
Çıktıdaki yolun projenin
.venv dizinini göstermesi ve ikinci satırın True olması beklenir. False görürseniz ortamı yeniden etkinleştirin veya ortamın Python dosyasını doğrudan çalıştırın. Bu kontrol, doğru ortamın kullanıldığını gösterir; ortamın içindeki paketlerin güvenli olduğunu kanıtlamaz.Bağımlılıkları ve gizli bilgileri yönetin
Yalnız ihtiyacınız olan paketleri, adlarını ve kaynağını doğrulayarak kurun. Projenin bağımlılık sürümlerini bir dosyada veya kullandığınız paket yönetim aracının kilit dosyasında kaydedin; böylece geliştirme ve sunucu ortamlarında hangi sürümlerin kullanıldığını izleyebilirsiniz. Sürüm sabitlemek bilinen bir hatayı ortadan kaldırmaz: Bağımlılıkların güvenlik duyurularını düzenli izleyin, düzeltmeleri test ortamında deneyin ve ardından üretime geçirin.
Etkin sanal ortamda
python -m pip check çalıştırmak, kurulu paketlerin bağımlılıklarının birbiriyle uyumlu olup olmadığını kontrol eder. Hata çıkarsa bildirilen paket ve sürüm gereksinimlerini inceleyip uyumlu sürümleri seçin. Bu komut güvenlik açığı taraması yapmaz.API anahtarlarını, parolaları ve erişim belirteçlerini kaynak koduna veya sürüm kontrolüne koymayın. Bunları ortam değişkeni ya da dağıtım ortamınızın gizli bilgi yönetimi aracılığıyla sağlayın; erişimi uygulamanın ihtiyaç duyduğu hesaplarla sınırlayın. Bir anahtar yanlışlıkla depoya veya günlüğe yazıldıysa yalnızca kaydı silmekle yetinmeyin: Anahtarı sağlayıcıda iptal edip yenisini oluşturun ve uygulamayı yeni değerle güncelleyin.
Dış girdiyi veri olarak işleyin
Kullanıcıdan, dosyadan veya ağdan gelen veriyi beklediğiniz tür, uzunluk ve biçime göre doğrulayın. Doğrulama, veriyi kullanacağınız yere uygun korumaların yerine geçmez. Özellikle SQL sorgularında kullanıcı girdisini metne birleştirmek yerine parametre kullanın.
Aşağıdaki varsayımsal örneği
sorgu_ornegi.py adıyla kaydedip python sorgu_ornegi.py komutuyla çalıştırabilirsiniz. Harici paket veya mevcut veritabanı gerektirmez:
Python:
import sqlite3
con = sqlite3.connect(":memory:")
try:
con.execute("CREATE TABLE kullanicilar (ad TEXT)")
con.execute("INSERT INTO kullanicilar (ad) VALUES (?)", ("ayse",))
aranan = input("Kullanıcı adı: ")
satir = con.execute(
"SELECT ad FROM kullanicilar WHERE ad = ?", (aranan,)
).fetchone()
print("Bulundu:", satir[0]) if satir else print("Kayıt bulunamadı")
finally:
con.close()
ayse girildiğinde Bulundu: ayse, örneğin ' OR 1=1 -- girildiğinde ise Kayıt bulunamadı çıktısı beklenir. İkinci girdi SQL komutu olarak değil, aranacak kullanıcı adı olarak ele alınır. Bu örnek yalnızca sorgudaki değerleri korur; tablo veya sütun adlarını kullanıcı seçiyorsa bunları ayrıca izin verilen adlar listesiyle sınırlamanız gerekir. Parametreli sorgu, kullanıcının kaydı görmeye yetkili olup olmadığını da belirlemez.Kullanıcı girdisini
eval() veya exec() ile çalıştırmayın; güvenilmeyen kaynaklardan gelen pickle verisini açmayın. Veri alışverişi için uygun olduğunda JSON kullanabilir, okuduğunuz alanları ayrıca doğrulayabilirsiniz. JSON kullanmak da verinin doğruluğunu veya kaynağın güvenilirliğini kendiliğinden garanti etmez.Bir otomasyon betiği dış program çalıştırıyorsa mümkünse Python'un kendi kütüphanelerini tercih edin.
subprocess gerektiğinde, komutu ve argümanlarını ayrı liste öğeleri olarak verin; kullanıcı girdisini shell=True ile oluşturulan bir komuta birleştirmeyin. Yine de dış programın kabul ettiği seçenekleri doğrulayın: Kabuk kullanılmaması, programa verilen her argümanın güvenli olduğu anlamına gelmez. Windows'taki toplu iş dosyaları için ayrıca platforma özgü kabuk davranışını dikkate alın.Sunucuda yetkileri ve hataları sınırlandırın
Uygulamayı mümkünse yönetici yerine ayrı ve sınırlı yetkili bir hesapla çalıştırın. Bu hesaba yalnız gerekli dosya, veritabanı ve ağ erişimini verin. Web uygulamasında hata ayıklama modunu üretimde kapatın; ayrıntılı hata kayıtlarını erişimi sınırlandırılmış günlüklerde tutun ve kullanıcıya gizli bilgi içermeyen bir hata mesajı gösterin.
Dağıtımdan önce beklenen girdileri, reddedilmesi gereken girdileri ve yetkisiz erişim denemelerini test edin. Bir sorun incelenirken günlüklerde parola, belirteç veya kişisel veri yayımlamayın; geçici tanılama çıktısını iş bitince kaldırın. Güncelleme sonrasında testleri tekrar çalıştırın ve başarısızlık varsa ilgili hata mesajı ile değişen sürümleri karşılaştırarak uyumsuzluğu giderin.