Clicky

Skocz do zawartości


Zdjęcie
- - - - -

[K2] Antibot - przyjazna ochrona przed botami (w miejsce Captcha)

Brak odpowiedzi do tego tematu

  • Zaloguj się, aby dodać odpowiedź

#1 phpion

phpion

    Senior Mastah

  • Użytkownik
  • PipPipPip
  • 774 postów
  • Skąd:Sosnowiec, Dąbrowa Górnicza

Napisano 14 maj 2009 - 21:28

Witam,
dziś napisałem prosty mechanizm ochrony przed spamującymi botami.

Demo modułu można zobaczyć tutaj:
http://kohana.phpwor...com/antibottest

Paczuszkę z niezbędnymi plikami oraz przykładem wykorzystania można pobrać stąd:
http://kohana.phpwor...oad/antibot.zip

Oto pliki wchodzące w skład modułu:

modules/antibot/config/antibot.php
<?php
$config = array(
/**
* 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',
'randoms' => array(
/**
* Liczba losowanych poprawnych elementów.
*/
'good' => 2,

/**
* Liczba losowanych niepoprawnych elementów.
*/
'bad' => 3
),
'images' => array(
/**
* Tablica nazw poprawnych plików graficznych.
*/
'good' => array(
'1.jpg',
'2.jpg',
'3.jpg',
'4.jpg',
'5.jpg'
),

/**
* Tablica nazw niepoprawnych plików graficznych.
*/
'bad' => array(
'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
*/
private $randoms = 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
*/
private $images = array();

/**
* 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->randoms = (array)$config['randoms'];
$this->images = (array)$config['images'];

$this->set_token();
}

/**
* Losuje listę plików graficznych.
*
* @return array Tablica zakodowanych nazw plików graficznych.
*/
public function get_images() {
$return = array();

foreach (array(self::GOOD, self::BAD) as $type) {
shuffle($this->images[$type]);
$images = array_chunk($this->images[$type], (int)$this->randoms[$type]);

$return = array_merge($return, $images[0]);
}

shuffle($return);

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();

return md5($this->encode_token().$image.$input->ip_address().$this->security_key);
}

/**
* 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) {
$images = array_merge($this->images[self::GOOD], $this->images[self::BAD]);

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 = strrev($return);
$return = md5($return);
$return = substr($return, 9, 14);
$return = md5($return);

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.
*/
public function validate(array $checked = array()) {
$checked = array_unique($checked);

if (count($checked) === (int)$this->randoms[self::GOOD]) {
$correct = 0;

foreach ($this->images[self::GOOD] as $item) {
if (in_array($this->encode_image($item), $checked)) {
$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) {
if (is_null($token)) {
$token = md5(uniqid());
}

$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) {
echo $image->render();
}
}
}

Jeżeli macie jakiekolwiek uwagi czy sugestie to chętnie się z nimi zapoznam :)

Pozdrawiam,
pion
Notifero - Technologie Informatyczne | Warsztat: Kohana 3.x/2.x + PostgreSQL/MySQL | Programista Kohana




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych