MathCaptcha – matematyczna captcha

MathCaptcha to bardzo fajna, mała biblioteka do generowania matematycznej captchy. Biblioteka pozwala na generowanie prostych zadań matematycznych opartych o dodawanie, odejmowanie, mnożenie i dzielenie. Zadania mogą być prezentowane za pomocą zarówno liczb jak i słów (czyli np. 7 i siedem). Również podanie wyniku działania, może być wymagane w postaci liczny lub słowa. Bardzo fajne rozwiązanie. Dla każdego rodzaju działania, mamy przygotowanych po pięć podstawowych sformułowań dla pytania, które zostanie zadane, np: „Ile jest dziesięć razy 2?”, „Ile jest 4 dodać 6?”, „Dodaj 10 i sześć, co otrzymasz?”, „Jaki jest iloczyn 5 i 8?”

W moim przypadku integracja z polem formularza przebiegła właściwie bezproblemowo. Oto prosty przykład działania – na początek funkcja kontrolera:

public function myform()
{
    $this->load->library(array('session', 'form_validation', 'mathcaptcha')); // wczytujemy wymagane biblioteki
    $this->load->helper('form'); // wczytujemy wymagany przez nasz widok helper

    $config = array(
        'language' => 'polish', // wersja pliku językowego, którego użyjemy
        'operation' => 'random', // typ działania: dodawanie, odejmowanie, mnożenie, dzielenie, losowe albo tablica (addition, subtraction, multiplication, division, random)
        'question_format' => 'random', // rodzaj przedstawiania liczb w działanu: liczby, słowa, losowo (numeric, word, random)
        'answer_format' => 'either' // rodzaj poprawnej odpowiedzi: liczba, słowo, oba (numeric, word, either)
    );
    $this->mathcaptcha->init($config); // inicjujemy bibliotekę z powyższą konfiguracją

    $data['math_captcha_question'] = $this->mathcaptcha->get_question(); // losujemy pytanie i przekazujemy do zmiennej

    // definiujemy reguły walidacji dla pola formularza
    // zwróć uwagę na warość callback
    $this->form_validation->set_rules('math_captcha', 'Wynik działania', 'required|callback__check_math_captcha'); 

    if ($this->form_validation->run() == FALSE) // jeśli któryś z warunków walidacji nie jest spełniony
    {
        $this->load->view('myform', $data); // zwracamy widok razem z danymi (wylosowanym pytaniem i wiadomością błędu walidacji - o ile takowa istnieje)
    }
    else
    {
        $this->load->view('myform', $data); // zwracamy formularz z pytaniem (bez błędów) 
    }
}

I do tego callback dla pola formularza:

function _check_math_captcha($str)
{
    if ($this->mathcaptcha->check_answer($str)) // sprawdzamy, czy podana przez nas odpowiedź jest prawidłowa
    {
        return TRUE; // jeśli tak zwracamy wartość TRUE
    }
    else
    {
        // jeśli nie, ustawiamy wiadomość błędu dla pola formularza
        $this->form_validation->set_message('_check_math_captcha', 'Musisz podać poprawny wynik działania.');
        // i zwracamy wartość FALSE
        return FALSE;
    }
}

A na koniec plik widoku:

// wyświetlamy błędy walidacji dla formularza
<?php echo validation_errors(); ?>
// otwieramy formularz
<?php echo form_open(); ?>
// wyświetlamy wylosowane wcześniej pytanie
<?php echo $math_captcha_question;?>
// wyświetlamy pole odpowiedzi na pytanie
<?php echo form_input('math_captcha');?>
// wyświetlamy przycisk submit dla formularza
<?php echo form_submit('submit', 'Wyślij'); ?>
// zamykamy formularz
<?php echo form_close();?>

Autor biblioteki miał niezłe wyczucie czasu, ponieważ pojawiła się ona akurat kiedy potrzebowałem takiego rozwiązania. Po więcej informacji zapraszam na stronę projektu.

6 komentarzy do “MathCaptcha – matematyczna captcha”

  1. Jeśli chodzi o walkę z botami to znam jeden fajny i prosy sposób. Raczej przydatny jedynie w przypadku małych „stronek”.

    Tworzysz *

    potem w css, #niedlabota { display:none; }

    90% potworków mamy z głowy. Wiadomo, człowiek to odrazu rozgryzie.

    Chodzi o to, że bot uzypełni te pole a człowiek nie.

    Odpowiedz
    • Czyli kolejny + dla MathCaptcha ;)

      Na szczęście można w łatwy sposób zmienić formę pytań na taką, która będzie bardziej dostosowana do naszych potrzeb (albo raczej naszych użytkowników).

      Odpowiedz
  2. Polecam używanie skróconych wariantów składni :>
    Bedzie czytelniej. W ramach przypomnienia

    ===>

    bla bla ? echo 'jasne ze bla bla’; : echo 'nie bla bla’;

    if(bla): jasne ze bla bla else: nie bla bla endif;

    foreach(bla as b):
    echo b->la;
    endforeach;

    itp itd… :)

    Odpowiedz
  3. A ja dla odmiany nie zgodzę się z Wami. Po pierwsze nie jest problemem dopisanie modułu dla robota sieciowego, który będzie rozwiązywać tego typu „zagadki matematyczne”. Dodatkowo nie podoba mi się fragment kodu odpowiedzialny za „tłumaczenie” wartości liczbowych na wartości słowne (totalnie przesadzone), bo można to ująć w małej funkcji/metodzie. Dodatkowo tutaj można było przyjąć format, który zostałby łyknięty przez sprintf(). Zawartość tablicy $config wewnątrz metody myform() jest lekko przesadzona tj. wartości mogłyby być inne niż string i tym samym oszczędzić kilka bajtów w pamięci parsera.

    Odpowiedz

Dodaj komentarz

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.