Wykryto działanie AdBlocka!

Prawdopodobnie masz właczonego Adblocka. Korzystanie z bloga jest całkowicie darmowe. Jeśli jednak chcesz docenić prace autora, wyłacz blokowanie reklam dla tej witryny, aby jeszcze bardziej zmotywowac autora do dalszej pracy oraz częstszej publikacji artykułów.

Dziękuje :)

Treść główna bloga

Artykuły

Captcha.class.php – czy jesteś człowiekiem?


Captcha.php Po tygodniowej przerwie przedstawie skrypt, który z pewnością poprawi poziom bezpieczeństwa naszej witryny. Skrypt składa się z dwóch głównych plików: create.php oraz Captcha.class.php oraz dwóch pobocznych: index.php i style.css, ponadto stworzyłem dodatkowy folder z możliwymi czcionkami: font/. Klasa składa się z trzech publicznych metod oraz dwóch atrybutów.

Kod na Github

Czym jest Captcha?

Wikipedia mówi, że Captcha to:

Rodzaj techniki stosowanej jako zabezpieczenie na stronach www, celem której jest dopuszczenie do przesłania danych tylko wypełnionych przez człowieka.

Podobnie jak klasa security.class.php, klasa captcha.class.php została stworzona z normami PSR-2 oraz PSR-4. Dodatkowo komentarze są, napisanie zgodnie ze wskazaniami PHPdoc.

Klasa Captcha.class.php:

Metoda __construct() jako argument przyjmę zmienną $config, która jest tablicą zawierającą nazwę czcionki i folder z nimi. Jeśli nie poddano nazwy folderu, domyślnie przyjmie nazwę font/. Ponadto jeśli nie podano nazwy czcionki lub podana czcionka nie istnieje, zostanie dodany wyjątek.

Kolejną metodą jest generateCode(), generuje ona kod, który musi zostać przepisany aby skrypt mógł zadziałać.

Ostatnią metodą jest CaptchaSecurityImages(). Jako argument przyjmuje osobno długość i wysokość obrazka z kodem oraz ilość znaków na obrazku. Metoda generuje również kropki oraz linie, co utrudnia odczytanie kodu robotom.

Kolejnym istotnym plikiem jest create.php

Plik ten między innymi sprawdza czy klasa istnieje i tworzy jej obiekt. Ponadto w zmiennej $config zawarte są dane konfiguracyjny: nazwa czcionki oraz folder, w którym czcionki się znajdują. Wywołanie klasy umieszczono w bloku try {} catch() {} . Metoda CaptchaSecurityImages przyjmuje jako argumenty kolejno: długość, szerokość oraz ilość na obrazku. Programista MUSI samodzielnie ustawić te wartości, w przeciwnym razie skrypt nie zadziała.

Plik index.php

Aby skrypt działał w pliku, w którym umieszczono obrazek musi być zapoczątkowana sesja.
Główna część skryptu to:

<img src="create.php">

Create.php to plik, w którym tworzy się obrazek.

Dodatkowo w pliku index.php umieściłem kod:

Ten krótki kod sprawdza czy wysłano formularz oraz czy przepisany kod jest zgodny z tym umieszczonym na obrazku.

EIDT:
[24.05.2015]
– zmieniono sposób przekazywania parametrów do skryptu. Od teraz programista musi sam podać argumenty w pliku create.php

[12.12.2015]
– bardzo dobrą alternatywną dla tego skryptu może być reCaptcha od Google.

  • Andrzej Prusinowski

    Nie testowałem tego, ale zdaje mi się, że jeśli atakujący odwiedzi stronę create.php?width=120&height=40&characters=0, to do sesji trafi kod równy ”. Wtedy wystarczy wysłać go w POST i spam gotowy…

    • W najbliższym czasie przeanalizuje jeszcze raz kod i spróbuje wydać stosowną łatkę a także poprawić artykuł.

      • Andrzej Prusinowski

        Hmm, w sumie to w ogóle wywaliłbym ten parametr z GET. Bo nawet jeśli dasz tam warunek że > 0, to spammer wstawi sobie 1 i i tak ma o wiele prostsze zadanie niż w przypadku sześciu znaków. Jakiegokolwiek minimum nie ustalisz, użytkownik tego kodu nie będzie mógł go podnieść, bo spammer i tak sobie obniży. Lepiej np. wrzucić to na sztywno do create.php, albo jako stałą i kazać userowi ją sobie dostosować 🙂

        • Już poprawiłem skrypt. Od teraz parametry trzeba podać w pliku create.php 🙂

  • Hm.. tylko po co, skoro jest np. noCaptcha? Obecnie obrazek z tekstem to już bardzo kiepski sposób ochrony przed spamem.

    • Captcha jest jednym ze sposobów ochrony przed spamem. Nie twierdze, że jest to najlepszy sposób, aby zabezpieczyć stronę www.

  • To już ostatnia wersja kodu? Czy będą kolejne modyfikacji?

    • Póki co zmieniłem lekko kod. Uwzględniłem to w notce: EDIT:[24.05.2015]. Możliwe, że przyszłości lekko go zmodyfikuje 🙂