Résolue

Formulaire de contact maison

# Cybersécurité # Formulaires

Gabriel Trouvé

Mentor

Bonsoir,

Je me suis fait un petit formulaire de contact. Sans tuto donc je ne sais pas si ce que j'ai fait c'est sécure... lol
Est-ce qu'il vaut mieux rajouter un captcha selon vous ?

Merci

def contact_view(request):
    if request.method == "POST":
        email = request.POST.get("email")
        subject = request.POST.get("subject")
        message = request.POST.get("message")
        send_mail(subject=subject,
                  message=f"Message de {email} \n{message}",
                  from_email=None,
                  recipient_list=["[email protected]"])
        # recipient_list : penser à passer une liste !
        # from_email None (va chercher dans les settings)
        return redirect('ideas:contact-ok')

    # auth verify
    if request.user.is_authenticated:
        form = ContactForm(initial=model_to_dict(request.user, exclude="password"))
    else:
        form = ContactForm()

    return render(request, "ideas/contact.html", context={"form": form})

Salut !

Il est sympa ton formulaire de contact ! 🤘 Concernant la sécurité, il y a toujours des choses à améliorer, mais voici déjà quelques conseils.

Rajouter un captcha est une bonne idée pour éviter les robots et les attaques de type spam. Le plus couramment utilisé est le Google reCAPTCHA, tu peux le mettre en place assez facilement en suivant leur documentation ici.

Dans ton code, je vois pas de validation des données entrées par l'utilisateur. Tu peux ajouter un nettoyage des champs de formulaire. Par exemple, en utilisant des méthodes comme clean_ dans ton formulaire ContactForm. cf. la doc: https://docs.djangoproject.com/en/4.2/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other

J'aimagine que tu l'as déjà mais assure-toi que ton site est protégé contre les attaques CSRF en ajoutant {% csrf_token %} dans ton fichier HTML de formulaire.

Gabriel Trouvé

Mentor

Salut PA !
Pour le token c'est bon.

Merci pour google captcha !

Du coup tu me conseilles un formulaire avec une validation (form.is_valid) ?
Tu t'en servirai pour quoi du nettoyage ?
J'avoue que là je ne fais que de la récupération de données.

Gabriel Trouvé

Mentor

OK, je n'ai pas eu le choix de passer par une validation du formulaire. Et tant qu'à faire autant utiliser la validation ^^

def contact_view(request):
    if request.method == "POST":
        form = ContactForm(request.POST)
        if form.is_valid():
            email = form.cleaned_data["email"]
            subject = form.cleaned_data["subject"]
            message = form.cleaned_data["message"]
            send_mail(subject=subject,
                      message=f"Message de {email} \n{message}",
                      from_email=None,
                      recipient_list=["[email protected]"])
            # recipient_list : penser à passer une liste !
            # from_email None (va chercher dans les settings)
            return redirect('ideas:contact-ok')

    # auth verify
    if request.user.is_authenticated:
        form = ContactForm(initial=model_to_dict(request.user, exclude="password"))
    else:
        form = ContactForm()

    return render(request, "ideas/contact.html", context={"form": form})

class ContactForm(forms.Form):
    email = forms.EmailField(label="Email")
    subject = forms.CharField(max_length=100, label="Objet", help_text="100 caractères max")
    message = forms.CharField(label="Message", max_length=5000, help_text="5000 caractères max", widget=forms.Textarea)
    captcha = ReCaptchaField(widget=ReCaptchaV2Checkbox)

Merci PA !

Inscris-toi

(c'est gratuit !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.