İçeriğe geç

Django Password Validators

Merhabalar. Kullanıcıların parola güvenliği, uygulamalarımızın en önemli parçalarından biri. Fakat geliştirici ekibin aksine, kullanıcılar tarafından pek önemsenmeyecek olacak ki zayıf ve tahmin edilebilir parolalar kullanmaya devam etmekteler. 🙂

Şanslıyız ki kullanıcıları bu tarz kolay parolalardan uzak tutmak için Django kendi içinde genişletilebilir ve özelleştirilebilir bir validator yapısı sunmakta. Bugün varsayılan parola validatorlerinden ve farklı durumlarda kullanılmak üzere kendi parola validatorümüzü nasıl oluşturabileceğimiz üzerine konuşacağız.


Varsayılan validatorler.

Django settings.py dosyasında AUTH_PASSWORD_VALIDATORS‘de tanımlandığı üzere ilk kurulumda bir kaç validator ile birlikte gelir.

AUTH_PASSWORD_VALIDATORS = [
    {
        "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator",
    },
    {
        "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",
    },
    {
        "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator",
    },
    {
        "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",
    },
]

Kullanıcı parolasını belirlerken bu validatorler sırası ile işletilir ve uygun olmayan bir durumda ValidationError fırlatılır.  Varsayılan validatorler arasında, kullanıcının diğer bilgileri ile benzerlik oranını kontrol etme, minimum parola uzunluğunu kontrol etme veya Django kaynak kodunda bulunan, şu adresten de görülebilecek olan dünya genelinde çok fazla kullanılan bazi parolaların kullanılamaması kontrolünü içerir.


Kendi validatorümüzü yazmak.

Eğer daha spesifik ihtiyaçlarınız var ise yeni bir validator yazmak için 2 metoda olan bir Python sınıfı yazmanız yeterli olacaktır. Bu metodlar;

  1. validate(self, password, user=None) bu metod kontrolü yapan kısımdır. Kontrol edilen parola uygun ise None dönmesi, aksi durumda ValidationError fırlatması gerekmektedir. user parametresinin, kontrol aşamasında üzerinde çalışılan kullanıcıya ihtiyaç duyuluyorsa kullanılmakta ve yönetilmesi gerekmekte. Kullanıcı metod içine sağlanmamış ise doğrudan return ederek bu validatorü yoksayıp çalışma esnasında oluşacak olan hatanın önüne geçmemiz gerekmekte. Bu duruma örnek olması açısından, kullanıcın takımını kaydettiğiniz bir tablonuz var ve takım ismi ile aynı bir parola koymasını istemiyorsunuz, ilk kayıt aşamasında bu durum yok sayılacak fakat daha sonraki güncelleme işlemlerinde dikkate alınacaktır.
  2. get_help_text(self) kullanıcıya validatorün gereklilikleri ile alakalı bilgi vermektedir

Validatörler projenin herhangi bir dizininde yaşayabilir fakat genellikle projenin, kullanıcılar uygulaması altında password_validators.py içerisinde tanımlanır.


Bildiğiniz üzere parolaların özel karakter içermesi güvenliği arttırmakta biz de bunu örneklemek ve pekiştirmek için özel karakter kullanımını zorunlu hale getiren bir validator yazacağız

Kullanıcı parolasını oluştururken veya güncellerken */.?!+%^#&}{-[] bu karakterlerden en az birini kullanmak zorunda olacak.

from django.utils.translation import ngettext
from django.core import exceptions


class SpecialCharacterPasswordValidator:
    def __init__(self, special_chars="*/.?!+%^#&}{-[]", count=1):
        self.special_characters = special_chars
        self.count = count

    def validate(self, password, user=None):

        if len([ch for ch in self.special_characters if ch in password]) < self.count:
            raise exceptions.ValidationError(
                ngettext(
                    "Your password not contains {} special character.",
                    "Your password not contains {} special characters.",
                    self.count,
                ).format(self.count)
            )

    def get_help_text(self):
        return ngettext(
            "Your password must contain at least {} special character.",
            "Your password must contain at least {} special characters.",
            self.count,
        ).format(self.count)

Gerekli kontrolü bu blokta yapıyor, belirlenen kurala uymayan bir durumda ValidationError fırlatıyoruz.

Daha sonrasında bunu settings dosyamıza eklememiz gerekmekte.

AUTH_PASSWORD_VALIDATORS = [
    # other validaotrs.
    {
        "NAME": "your_app.password_validators.SpecialCharacterPasswordValidator",
    }
]

Halihazırda ki Django admin, auth uygulaması üzerindeki formları kullanmakta. Validatorü oradan kontrol edecek olursak;

help_text.

Kullanıcının yeni parola belirleme kuralı konusunda yönlendirdiğini aşağıdan görebiliriz.

help_texts

validasyon.

Validasyona takılan bir durum olması durumunda, ilgili hatanın fırlatıldığını da aşağıda görüyoruz.

Test yazmak daha profesyonel olabilirdi 😀


Değiştirilebilir nitelikler.

Bunun yanında farkettiğiniz üzere şu anda hem özel karakter listemiz hemde bu karakterlerden kaç tanesinin parolada bulunacağını belirten değişkenler statik. Farklı uygulamaların farklı ihtiyaçları olabilir.

Örneğin özel karakter listesi olarak sadece ?!/&+ bu karakterler üzerinde kontrolün yapılması, sayı olarak 3 adet bulunmasını, ya da minimum karakter uzunluğunun 10 karakter olması vs. Bu gibi parametreler değişkenlik gösterebilir.

Bu gibi durumlarda validatorünüze aşağıdaki gibi OPTIONS tanımlaması yapmanız yeterli olacaktır. Burada bulunan değerler validator örneklenip kullanılacağı zaman __init__ metoduna geçirilecek ve ezilmiş olacaktır.

AUTH_PASSWORD_VALIDATORS = [
    # other validators.
    {
        "NAME": "absolute.password_validators.SpecialCharacterPasswordValidator",
        "OPTIONS": {"special_chars": "?!/&+", "count": 3},
    },
    {
        "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",
        "OPTIONS": {"min_length": 10},
    },
]

Son olarak projenizin ayrık bir parçasıdna Django parola validatorlerini kullanmak ve kontrol sağlamak isterseniz; django.contrib.auth.password_validation.validate_password fonksiyonunu kullanabilirsiniz. Varsayılan olarak içerisine kabul ettiği parolayı setttings dosyasında tanımlı olan validatorler ile karşılaştıracaktır.

Sonuç.

Geçenlerde çalışma arkadaşıma bu konuda destek verirken, onun önerisi üzerine belki başka birilerinin de işine yaraması dileğiyle bu yazıyı da burada bitiriyorum. Gece geç saatlerde yazılmış bir yazı olduğu için, herhangi bir imla, anlam bozukluğu ve düşüklüğünü anlayışla karşılayacak olduğunuzu umuyorum 🙂

İyi çalışmalar.

 

 

 

 

Tarih:Blog

İlk Yorumu Siz Yapın

Bir cevap yazın

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

Göster
Gizle