3 grudnia 2024
Człowiek czy maszyna – oto jest pytanie, obecnie nie mamy pewności czy wysłane żądanie do serwera jest spowodowane akcją człowieka. Pozostaje więc kwestia jak weryfikować osobę, która znajduje się w naszym zakątku internetu. Popularnym rozwiązaniem jest użycie reCAPTCHA od Google'a, nie trzeba jednak ograniczać się do jednego sposobu. Można skorzystać z innych paczek, które będą pełnić funkcję rozróżniania ludzi od komputerów. Takim pakietem jest django-simple-captcha, który wymaga Django w wersji 1.8 lub nowszej, jak wskazuje nazwa w prosty sposób możemy sprawić, że tylko ludzie pójdą dalej, a roboty zostaną za drzwiami, które są dla nich do nie przejścia.
Po standardowej instalacji opisanej w dokumentacji, którą można znaleźć pod podanym linkiem, czas stworzyć CAPTCHA. Niech będzie to jedynie formularz pobierający imię od człowieka, który będzie musiał dodatkowo przejść nasz test.
from django.forms import ModelForm
from captcha.fields import CaptchaField
from .models import Human
class CaptchaForm(ModelForm):
captcha = CaptchaField()
class Meta:
model = Human
fields = [
'name',
'captcha'
]
Formularz będzie wyglądać w następujący sposób:
Można oczywiście obsłużyć powodzenie jak i niepowodzenie, przykładowy widok:
from django.views.generic import FormView, TemplateView
from django.urls import reverse_lazy
from .forms import CaptchaForm
class CheckView(FormView):
template_name = 'check.html'
form_class = CaptchaForm
success_url = reverse_lazy('cap:human')
def form_valid(self, form):
#your code if human
return super().form_valid(form)
def form_invalid(self, form):
#your code if robot
return super().form_invalid(form)
class ThisIsHuman(TemplateView):
template_name = 'human.html'
Jeśli zwykła CAPTCHA jest zbyt nudna można zmieniać na proste zagadki matematyczne, zwiększać lub zmniejszać czcionkę, ustawiać różne kolory tła oraz rotować tekst. Oto kilka przykładowych CAPTCHA, które wygenerowały się gdy zostały zmodyfikowane zmienne:
CAPTCHA_IMAGE_SIZE
CAPTCHA_FONT_SIZE
CAPTCHA_LETTER_ROTATION
CAPTCHA_BACKGROUND_COLOR
A oto kilka wygenerowanych testów:
Stwórzmy teraz własne CAPTCHA, niech będzie to pytanie o imię psa, dla człowieka odpowiedź na to pytanie będzie oczywista. Wystarczy, że zwrócimy dwa stringi, pytanie i odpowiedź, kod będzie wyglądał w następujący sposób:
import random
def my_super_captcha():
questions = []
answers = []
questions.append('Jak sie nazywa reksio?')
answers.append('reksio')
questions.append('Jak sie nazywa pluto?')
answers.append('pluto')
questions.append('Jak sie nazywa rex?')
answers.append('rex')
x = random.randint(0, len(questions)-1)
return questions[x], answers[x]
Losujemy pytania i oczekujemy odpowiedzi, teraz wystarczy dodać w settings.py ścieżkę do naszej funkcji losującej i gotowe.
CAPTCHA_CHALLENGE_FUNCT = 'cap.captcha_fun.my_super_captcha'
Tak wyglądają nasze pytania, żeby przejść dalej trzeba podać poprawnie imię psa, a o co zapytasz Ty? Ogranicza Cię jedynie wyobraźnia.
Często jestem robotem dla reCAPTCHA, gdy nie potrafię zdecydować się, czy na danym kafelku jest jeszcze sygnalizacja świetlna, czy już jej nie ma. Jeśli nie chcesz, żeby użytkownik zastanawiał się nad swoim człowieczeństwem, zrób takie CAPTCHA jakie uważasz za odpowiednie. Możliwości jest dużo, można zaskoczyć użytkownika pomysłowymi zagadkami, co sprawi, że zapamięta Twoją stronę jako różną od wszystkiego innego co jest w sieci. Pakiet django-simple-captcha daje możliwość zrobienia takiej CAPTCHA jaka sie nam podoba, spróbuj sam i stwórz wyjątkowe testy, w prosty i szybki sposób. Dzięki temu, zawsze będziesz wiedzieć kto jest po tamtej stronie.