dziś napisałem prosty mechanizm ochrony przed spamującymi botami.
Demo modułu można zobaczyć tutaj:
http://kohana.phpworkstation.com/antibottest
Paczuszkę z niezbędnymi plikami oraz przykładem wykorzystania można pobrać stąd:
http://kohana.phpworkstation.com/download/antibot.zip
Oto pliki wchodzące w skład modułu:
modules/antibot/config/antibot.php
<?php /** * Tajny klucz służący do zakodowania nazw plików graficznych. */ 'security_key' => 'mójmegatajnyklucz', /** * Nazwa katalogu / ścieżka katalogu z plikami graficznymi. */ 'images_directory' => 'img/antibot', /** * Liczba losowanych poprawnych elementów. */ 'good' => 2, /** * Liczba losowanych niepoprawnych elementów. */ 'bad' => 3 ), /** * Tablica nazw poprawnych plików graficznych. */ '1.jpg', '2.jpg', '3.jpg', '4.jpg', '5.jpg' ), /** * Tablica nazw niepoprawnych plików graficznych. */ '10.jpg', '20.jpg', '30.jpg', '40.jpg', '50.jpg' ), ) ); ?>
modules/antibot/libraries/Antibot.php
<?php /** * Klasa tworząca przyjazne zabezpieczenie formularzy przed atakami botów. * * Działanie klasy polega na wyświetleniu określonej liczby plików graficznych, * wśród których znajduje się pewna liczba elementów, które należy zaznaczyć w formularzu. * * @author phpion */ class Antibot { /** * Losowy ciąg znaków wykorzystywany przy kodowaniu nazwy pliku graficznego. * * @var string */ private $token = ''; /** * Tajny klucz bezpieczeństwa wykorzystywany przy kodowaniu nazwy pliku graficznego. * * @var string */ private $security_key = ''; /** * Nazwa katalogu / ścieżka katalogu, w którym znajdują się pliki graficzne. * * @var string */ private $images_directory = ''; /** * Tablica zawierająca informację o ilości losowanych plików graficznych z rozróżnieniem na typ (dobry/zły). * * $array = array( * 'good' => 2, * 'bad' => 3 * ); * * @var array */ /** * Tablica nazw plików graficznych służących do wyświetlania dobrych/złych elementów. * * $array = array( * 'good' => array(1, 2, 3), * 'bad' => array(10, 20, 30 * ); * * @var <type> tablica */ /** * Konstruktor klasy Antibot. * * Automatycznie pobiera potrzebne dane z pliku konfiguracyjnego. */ public function __construct() { $config = Kohana::config('antibot'); $this->security_key = (string)$config['security_key']; $this->images_directory = (string)$config['images_directory']; $this->set_token(); } /** * Losuje listę plików graficznych. * * @return array Tablica zakodowanych nazw plików graficznych. */ public function get_images() { } foreach ($return as $key => $item) { $return[$key] = $this->encode_image($item); } return $return; } /** * Koduje nazwę pliku graficznego. * * @param string $image Nazwa pliku graficznego. * @return array Zakodowana nazwa pliku graficznego. */ private function encode_image($image) { $input = Input::instance(); } /** * Wyszukuje prawdziwą nazwę pliku graficznego na podstawie jego zakodowanej nazwy. * * @param string Zakodowana nazwa pliku graficznego. * @return string|boolean Prawdziwa nazwa pliku graficznego jeśli zostanie znaleziony; w przeciwnym razie zwraca FALSE. */ private function find_image($encoded_image) { foreach ($images as $image) { if ($this->encode_image($image) === $encoded_image) { return $image; } } return FALSE; } /** * Zwraca obiekt typu Image reprezentujący plik graficzny. * * @param string Zakodowana nazwa pliku graficznego. * @return Image|boolean Obiekt typu Image jeśli znaleziono prawdziwy plik graficzny; w przeciwnym razie zwraca FALSE. */ public function get_image($encoded_image) { $decoded_image = $this->find_image($encoded_image); return $decoded_image ? new Image($_SERVER['DOCUMENT_ROOT'].Kohana::config('config.site_domain').$this->images_directory.'/'.$decoded_image) : FALSE; } /** * Koduje token. * * @return string Zakodowany token. */ private function encode_token() { $return = $this->token; return $return; } /** * Sprawdza czy użytkownik wskazał poprawne elementy z przedstawionej mu listy. * * @param array $checked Tablica zaznaczonych elementów. * @return boolean TRUE jeśli zaznaczono poprawne elementy; w przeciwnym razie zwraca FALSE. */ $correct = 0; foreach ($this->images[self::GOOD] as $item) { $correct++; } } return $correct === (int)$this->randoms[self::GOOD]; } return FALSE; } /** * Ustawia token dla instancji klasy. * * Jeżeli nie przekazano parametru $token wówczas nadawany jest losowy token. * * @param string|NULL $token Token. */ public function set_token($token = NULL) { } $this->token = (string)$token; } /** * Zwraca token. * * @return string Token. */ public function get_token() { return $this->token; } /** * Nazwa klucza dla poprawnych elementów. */ const GOOD = 'good'; /** * Nazwa klucza dla niepoprawnych elementów. */ const BAD = 'bad'; } ?>
modules/antibot/controllers/antibot.php
<?php /** * Kontroler odpowiedzialny za wyświetlanie odpowiedniego pliku graficznego. */ final class Antibot_Controller extends Controller { /** * Zwraca do przeglądarki konkretny plik graficzny. */ public function render_image() { $image = (string)$this->input->get('image', ''); $token = (string)$this->input->get('token', ''); $ab = new Antibot(); $ab->set_token($token); $image = $ab->get_image($image); if ($image instanceof Image) { } } } ?>
Jeżeli macie jakiekolwiek uwagi czy sugestie to chętnie się z nimi zapoznam

Pozdrawiam,
pion