İçeriğe geç

Django Sensitive Informations

Günümüzde modern web uygulamaları fazlasıyla kompleks ve kapsamlı.

Her gün yüzbinlerce kişi tarafından kullanılan web uygulamalarımızın zaman ilerledikçe yeni problemleri ve gereksinimleri oluşuyor, sonrasında IT çalışanları olarak bu ihtiyaçları karşılayacak yada problemleri çözecek yöntemler oluşturuyor yada varolanları değiştirip geliştiriyoruz.

Örneğin ölçekleyebilme, kullanıcıya temiz bir deneyim sunma vs.

Bu ihtiyaçların en başındaysa güvenlik bulunuyor. İnternet farklı pencerelerden bakıldığında tehlikeli bir yer ve uygulamamızı kullanan kullanıcının bize emanet ettiği bilgileri iyi korumamız gerekiyor.


Django yerleşik olarak sunduğu güvenlik araçlarıyla geliştirmesi hem keyifli hem de güvenli bir framework.

Öncelikle hiçbir Django projesini DEBUG=True şeklinde yayına almamalı, hassas bilgi içeren bilgileri(tokenler, access keyler vs) açıkca yazılı olarak proje reposunda tutmamalıyız.

Aksi halde, amacımız kullanıcılara yada geliştiricilere iyi niyetli bir hata bildirimi yapmak olsada,  bu işlem sırasında gönderilecek hata raporunun içerisinde hassas bilgileri güvenilmez ellere teslim etmiş olabiliriz.

Hata raporlarını filtreleme.

Hata raporları, hata ayıklamak için yararlıdır, bu nedenle hızlı çözüme gidebilmek için mümkün olduğunca çok bilgi kaydetmek genellikle iyi bir yaklaşımdır. Örneğin, varsayılan olarak Django, ortaya çıkan hataya kadar oluşan tam tracebacki, call historyi ve değişkenleri tutar.

Fakat bu işlem projede canlıda çalışıyorsa ve hassas bilgi içeren bir kısımda gerçekleşiyorsa, örneğin kullanıcının kart bilgileri, parolası yada telefon numarası vs filtrelenmeli hata raporlarından bilinçli şekilde çıkartılmalıdır.

Django hata raporlarından bazı prefixler ile başlayan settingsleri çıkartır. Gerektiği durumda bizim bu işlemi kontrollü bir şekilde yapabilmemiz içinse bize 2 decorator sunar.

Not. Django’nın hariç tuttuğu settings name prefixleri.

    • ‘SECRET’
      PASS’
      ‘KEY’
      ‘SIGNATURE’
      ‘API’
      ‘TOKEN’

TOKEN yada TOKENIZED olarak adlandırılan bir değişken hata raporlarından çıkartılacaktır.


sensitive_variables(*variables)

Kod bloğu hassas bilgi tutan değişkenler barındırıyorsa sensitive_variables decoratorı, bu blokta ele alınmayan bir hata meydana geldiğinde belirtmiş olduğunuz değişkenlerin değerini hata raporunda “*********” olarak değiştirecektir.

from django.views.decorators.debug import sensitive_variables

@sensitive_variables('user', 'pw', 'cc')
def process_info(user):
    pw = user.pass_word
    cc = user.credit_card_number
    name = user.name
    ...

name değişkeni dışındaki tüm değerler gizlenecektir. kod bloğunun içerisindeki tüm değişkenler hassas ise aşağıdaki gibi bir kullanımla tamamını da gizleyebilirsiniz;

from django.views.decorators.debug import sensitive_variables

@sensitive_variables()
def process_info(user):
    ...

sensitive_post_parameters(*parameters)

View’ınız sadece POST isteği kabul ediyorsa ve post edilen veri içerisindeki bilgileri gizlemek isterseniz sensitive_post_parameters decoratorunu kullanabilirsiniz.

from django.views.decorators.debug import sensitive_post_parameters

@sensitive_post_parameters('pass_word', 'credit_card_number')
def record_user_profile(request):
    UserProfile.create(
        user=request.user,
        password=request.POST['pass_word'],
        credit_card=request.POST['credit_card_number'],
        name=request.POST['name'],
    )
    ...

name dışındaki POST verisi “*****” ile gizlenecektir.

Tüm POST verisini hata raporu dışında tutmak isterseniz herhangi bir parametre belirtmeden aşağıdaki gibi kullanabilirsiniz.

@sensitive_post_parameters()
def record_user_profile(request):
    ...

Django admin yada django.contrib.auth.views altındaki yerleşik auth viewlarını kullanıyorsanız, POST isteğine izin veren tüm viewlar sensitive_post_parameters ile korunmaktadır ekstradan bir override işlemi yapılmasına gerek yoktur.

Class üzerinde kullanım.

Class based viewlarda yada iş akışı barındıran sınıflarda sensitive_variables ve sensitive_post_parameters kullanımı için method_decorator decoratorınden yardım alabilirsiniz.

class ProcessInfoView(View):

    @method_decorator(sensitive_post_parameters())
    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request, *args, **kwargs)

    ...



class BusinessLogic:

    @method_decorator(sensitive_variables())
    def update_profile(self):
        ...

Sentry gibi exception tracking uygulamaları kullanıyorsanız, bu uygulamaların tuttuğu tracelerde bazı prefixe sahip değişkenler otomatik olarak filtreleniyor olabilir, fakat yinede bunu 3.parti bir uygulamaya bırakmak yerine hata raporunu bilinçli şekilde filtrelemek yararınıza olacaktır.

Custom hata raporu sınıfları oluşturmak ve Django’nın güvenlik mekanizmaları hakkında daha fazla bilgi almak içinse link burada.

İyi günler!

 

Tarih:Blog

İlk Yorumu Siz Yapın

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.

Göster
Gizle