18 10 10 CAPTCHA dla Wordpresa w 40 linijkach kodu
CAPTCHA czyli Completely Automated Public Turing test to tell Computers and Humans Apart, to rodzaj zabezpieczenia formularza na stronie internetowej, które, gdy właściwie wykonane, bardzo utrudnia jego wysłanie automatczynie. Funkcjonalna wtyczka z zabezpieczeniem typu CAPTCHA nie jest zbyt trudna do napisania. W tym wpisie przedstawiam jak tego dokonać w mniej niż 40 liniach kodu PHP.
Cały kod wtyczki znajduje się w pliku sw_hn_captcha.php, który umieściłem w katalogu wp-content/plugins/sw_hn_captcha.
Dla ułatwienia skorzystałem z nieco zmodyfikowanej biblioteki hn_captcha autorstwa Horsta Nogajskiego.
Również formularz nowego komentarza pozostawiłem tak jak jest on tworzony przez funkcję comment_form. Wynika z tego pewien problem, mianowicie funkacja ta w żaden sposób nie daje możliwości podpięcia kontrolek formularza za polem komentarza a przed kontrolką przycisku wysyłającego formularz, bez użycia JavaScript. Stąd dodatkowe pola zostały dołączone przed polem komentarza formularza.
Innym ograniczeniem wynikającym z konstrukcji funkcji comment_form jest fakt, że nie jest możliwe wyświetlenie dodatkowych pól formularza, w tym także obrazka CAPTCHA i kontrolki do wpisania znaków z niego, gdy osoba dodająca komentarz jest zalogowana.
Struktura katalogów i plików wtyczki wygląda jak następuje:
sw_hn_captcha
sw_hn_captcha.php
lib/
fonts/
tmp/
images/
c.txt
sw_hn_captcha.php – główny plik wtyczki
lib/ – katalog, w którym znajduje się klasa hn_captcha.class.php5
lib/fonts/ – katalog z czcionkami
tmp/images/ – katalog, w którym znajduja się obrazki CAPTCHA oraz plik c.txt (powinien być zapisywalny dla serwera). Katalog images/ powienien być zapisywalny dla użytkownika, pod którym działa serwer.
Kod w pliku sw_hn_captcha.php to jednak mała klasa oraz kilka definicji stałych.
/*
Plugin Name: sw_hn_captcha
Plugin URI: Not yet specified
Description: Not yer specified
Author: S.Wojnowski
Version: 1.0
Author URI: http://wojnowski.net.pl
*/
define("SW_HN_CAPTCHA_DIR",WP_PLUGIN_DIR.'/sw_hn_captcha');
define("SW_HN_CAPTCHA_LIB",SW_HN_CAPTCHA_DIR.'/lib/hn_captcha.class.php5');
define("SW_HN_CAPTCHA_FONTS",SW_HN_CAPTCHA_DIR.'/lib/fonts/');
define("SW_HN_CAPTCHA_TMP", SW_HN_CAPTCHA_DIR.'/tmp/images/');
define("SW_HN_CAPTCHA_FONT","HunkySerif-Roman.ttf");
require_once(SW_HN_CAPTCHA_LIB);
class SwHnCAPTCHA{
function __construct(){
$captcha_config = $CAPTCHA_INIT = array(
'tempfolder' => SW_HN_CAPTCHA_TMP,
'TTF_folder' => SW_HN_CAPTCHA_FONTS,
'TTF_RANGE' => SW_HN_CAPTCHA_FONT,
'chars' => 5,
'minsize' => 20,
'maxsize' => 30,
'maxrotation' => 25,
'use_only_md5' => TRUE,
'noise' => TRUE,
'websafecolors' => FALSE,
'refreshlink' => FALSE,
'lang' => 'en',
'badguys_url' => '/'
);
$this -> captcha = new hn_captcha($captcha_config, FALSE);
}
public function add_sw_captcha($fields){
$fields['captcha_image'] = '<p class = "comment-form-captcha"><label>Kod CAPTCHA</label><span class = "required"> * </span><br />'.$this -> captcha->display_form_part('image').'</p>';
$fields['captcha_input'] = '<p class = "comment-form-captcha-input"><label>Kod z obrazka</label><span class = "required"> * </span><br />'.$this -> captcha->display_form_part('input').'</p>';
return $fields;
}
public function sw_verify_captcha(){
$private_key = trim(strip_tags($_POST['hncaptcha_private_key']));
if( !($this -> captcha -> validate_submit() === 1) ){
wp_die("Wpisany kod CAPTCHA jest niepoprawny<br /><a href = '".wp_get_referer()."#respond'>Wracaj do formularza</a>");
}
}
}
$swhc = new SwHnCAPTCHA;
add_action('comment_form_default_fields',array($swhc,"add_sw_captcha"));
add_action('pre_comment_on_post',array($swhc,"sw_verify_captcha"));
Klasa hn_captcha wymaga pewnej konfiguracji, która jest umieszczona w $captcha_config.
Wyświetlanie kodu CAPTCHA
Metoda, która jest odpowiedzialna za wyświetlenie obrazka CAPTCHA i kontrolki formularza do przepisania kodu z niego ma nazwę add_sw_captcha.
Weryfikacja kodu CAPTCHA
Za weryfikację kodu CAPTCHA odpowiedzialna jest metoda sw_verify_captcha.
Cały kod jest uruchamiany za pomocą dwóch akcji tj. comment_form_default_fields i pre_comment_on_post.
Pierwsza umożliwia dodanie pól do formularza komentarzy, druga natomiast jest uruchamiana po wysłaniu danych z tego formularza.
Aby funkcjonalność oferowana przez wtyczkę była dostępna, należy ją uruchomić w standardowy sposób w panelu administracyjnym bloga.
Dodatkowe pola formularza po włączeniu wtyczki wygląda jak następuje:
W przypadku, gdy osoba dodająca komentarz niepoprawnie przepisze kod z obrazka, zobaczy błąd jak poniżej:
Ta wtyczka to oczywiście tylko przykład. Jednakże jego dostosowanie do własnych potrzeb wymaga jedynie pewnych modyfikacji w zakresie kolejności pól w formularzu dodawania komentarzy.
Wtyczkę można sobie ściągnąć stąd. Instalacja sw_hn_captcha sprowadza się do jej rozpakowania w katalogu wp-content/plugins/ i uruchomienia w panelu administracyjnym.


Autor wpisu jest blogerem, programistą PHP, administratorem Linux oraz twórcą blogów
RSS Subskrybuj wpisy bloga