Sécurisez vos formulaires avec Django Captcha

Ce tutoriel se décompose ainsi :

  1. Création de l’environnement virtuel pour le projet
  2. Création et configuration du projet
  3. Création d’un challenge captcha personnalisé
  4. Création des routes
  5. Définition du formulaire
  6. Création de la vue et du template

Création de l’environnement virtuel pour le projet

Tout d’abord, commençons par installer pip et virtualenv.

sudo apt-get install pip
sudo pip install virtualenv

On crée l’environnement virtuel.

virtualenv venv-django-1.8

Puis, on s’y connecte.

cd venv-django-1.8
source bin/activate

On installe les paquets requis.

pip install Django==1.8
pip install django-simple-captcha

Création du projet

On crée la structure du projet.

#venv-django1.8
django-admin startproject django_captcha_test
cd django_captcha_test/
python manage.py startapp project
cd project
mkdir -p templates/project

On configure Django dans settings.py.

Ajoutons les apps captcha et project dans INSTALLED_APPS ainsi que ‘DIRS’: [‘templates’] dans TEMPLATES.

Configuration du projet

Passons maintenant à la configuration

CAPTCHA_CHALLENGE_FUNCT vous permet de modifier le défi pour valider le captcha.

3 défis sont proposés initialement dans la documentation:

L’utilisateur doit saisir la suite de caractères affichée aléatoirement

CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.random_char_challenge'

L’utilisateur doit saisir le résultat de l’opération mathématique affiché

CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.math_challenge'

L’utilisateur doit recopier le mot affiché => ‘captcha.helpers.word_challenge’

CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.word_challenge'

Il est également possible de créer son propre challenge !! 🙂

Vous pouvez spécifier n’importe quelle fonction dans CAPTCHA_CHALLENGE_FUNCT à condition quelle retourne un tuple de chaine de caractères.

Pour l’exemple, créons un fichier helpers.py dans project et ajoutons le code suivant :

#project/helpers
import random
def emoji_challenge():
    emojis = ((':-)',':-)'),(':-(',':-('),(':-D',':-D'),(':-O',':-O'))
    x = tuple(emojis)
    ret = random.choice(x)
    return ret

Cette méthode retourne un tuple (‘: – )’,’: – )’) aléatoire composé du captcha et de la réponse.
Le captcha sera validé si la réponse est égale au texte affiché.

CAPTCHA_NOISE_FUNCTIONS = ('captcha.helpers.noise_arcs','captcha.helpers.noise_dots')

CAPTCHA_NOISE_FUNCTIONS nous permet d’ajouter du grain à l’image pour rendre plus difficile la lecture de 2 manières :

  1. en traçant des arcs de cercle au hasard dans l’image => ‘captcha.helpers.noise_arcs’
  2. en ajoutant des points aléatoirement sur l’image => ‘captcha.helpers.noise_dots’

Nous pouvons facilement retirer un effet en remplaçant l’élément du tuple avec ‘captcha.helpers.noise_null’

CAPTCHA_NOISE_FUNCTIONS = ('captcha.helpers.noise_null','captcha.helpers.noise_dots')

Les autres paramètres de configuration :

# Nombre de minutes avant timeout
CAPTCHA_TIMEOUT = 1
#Lisse l'image, si le défi "chaine de caractère aléatoire" est utilisé
CAPTCHA_FILTER_FUNCTIONS = ('captcha.helpers.post_smooth',)
CAPTCHA_FONT_SIZE = 18
CAPTCHA_BACKGROUND_COLOR = '#A426B7'
CAPTCHA_FOREGROUND_COLOR = 'white'
CAPTCHA_IMAGE_SIZE = (100,50)
#Inclinaison des premièrs symboles et du dernier
CAPTCHA_LETTER_ROTATION = (-35,35)

 

Création des routes

On crée une route vers l’application project dans django_captcha_test/urls.py

urlpatterns += patterns('',
    url(r'^captcha/', include('captcha.urls')),
    url(r'', include('project.urls')),
)

On crée un fichier urls.py dans project puis on ajoute le contenu suivant

#project/urls.py

from django.conf.urls import patterns, url, include
from project import views

urlpatterns = patterns('',
	url(r'',views.index),
)

Définition du formulaire

On crée le fichier forms.py dans project et un formulaire contenant le champs captcha à l’intérieur

#project/forms.py

from django import forms
from captcha.fields import CaptchaField
from django.contrib.auth.models import User

class CaptchaTestForm(forms.Form):
    captcha = CaptchaField()

Création de la vue et du template

On définit la vue index pour tester

#project/views.py

from django.shortcuts import render
from .forms import CaptchaTestForm

def index(request):
	if request.POST:
		form = CaptchaTestForm(request.POST)
		if form.is_valid():
			print "Form valid !!!"
	else:
		form = CaptchaTestForm()

	return render(request,'project/index.html',{'form':form})

#templates/project/index.html

On teste le projet accessible à http://localhost:8000/

Si la réponse saisie est valide, vous pouvez voir « Form Valid !! » s’affichait en console.

Félicitations, le tutoriel est terminé.
Vous savez à présent définir un captcha pour sécuriser vos formulaires.

La sources utilisée : django-captcha doc

Laisser un commentaire