Blog Inhalte von Passwort-Feldern nicht wieder anzeigen

Das Passwort-Widget aus Django Newforms zeigt bei einer erneuten Ausgabe den Formulares den Inhalt wieder an. Das ist zum einen sicherheitskritisch: in einem ungünstigen Fall könnte ein Dritter die Daten des Formulares erkunden und das Passwort sehen (Der Wert eines Passwort-Feldes ist im HTML-Quelltext klar zu sehen), zum anderen soll der User sowieso beide Passwörter neu eingeben.

Als Beispiel dient dieses einfache Registrierungsformular:

class RegistrationForm(forms.Form):
    name = forms.CharField(label='Name')
    password = forms.CharField(label='Passwort', widget=forms.PasswordInput)
    password_confirm = forms.CharField(label='Passwort (Bestätigung)', widget=forms.PasswordInput)

    # Prüfe hier, ob überhaupt korrekte Passwörter eingegeben wurden
    # def clean_password(self):
    # ... bspw. auf mindestens 8 Zeichen prüfen, wovon mindestens 1 Ziffer dabei ist

    def clean(self):
        if self.cleaned_data.get('password') != self.cleaned_data.get('password_confirm'):
            raise forms.ValidationError('Die beiden Passwörter müssen identisch sein')
        return self.cleaned_data

Angenommen wir klicken einmal auf den Submit-Button so würde das Formular (da in unserem Fall die Passwörter nicht identisch sind) wieder angezeigt:

Das Passwort wird wieder angezeigt.

Das PasswordInput-Widget bietet aber eine (nicht dokumentierte?) Funktion, den Inhalt des Feldes nicht mehr, genauer gesagt: nie, anzeigen zu lassen. Füge dem Wigdet das Attribut render_value=False hinzu und das Passwort-Feld ist bei jedem Rendern des Formulares leer.

Beispiel:

class RegistrationForm(forms.Form):
    name = forms.CharField(label='Name')
    password = forms.CharField(label='Passwort', widget=forms.PasswordInput(render_value=False))
    password_confirm = forms.CharField(label='Passwort (Bestätigung)', widget=forms.PasswordInput(render_value=False))

    # ...