Saytınızdakı formlar üçün captcha yazmaq

Bugünlərdə əlaqə formalarına captcha əlavə etməsəniz, e-mailiniz spammerlərin qurbanına çevrilə bilər. Bu blogda sizə öz captcha skriptinizi necə yazmağı göstərəcəyəm.

İlk öncə qeyd edim ki, siz Google Recaptcha da qoşa bilərsiniz. Lakin bu ayrı mövzudur. Bu dəfə özünüzə məxsus Captcha skriptini necə yazmağı öyrənəcəksiniz.

İlk öncə Captcha adlı class yaradırıq

class Captcha {
}

Daha sonra ilk növbədə setCaptcha metodunu yaziriq. Burada captcha kodunu sessiyaya əlavə edirik.

public function setCaptcha($length = 6)
{
$string = rand(100000,999999); // bu şərtidir, siz bu hissəni özünüzə məxsus kodla əvəzləyə bilərsiniz.
$_SESSION['captcha'] = $string;

return $this; // classin ozunu qaytaririq ki, method chaining ede bilek
}

Indi isə keçirik növbəti metoda. Bu metodda artıq captcha şəklini hazırlayırıq. Burada şəklin ölçüsünü, hərf ölçüsünü verə bilərik.

public function makeCaptchaImage($width=170, $height=60, $size = 25)
{

$text_color = [244,244,244]; // text ucun rgb reng
$bg_color = [58,64,70]; // fon ucun rgb reng
$line_color = [240,244,244]; // xetler ucun rgb reng
$pixel_color = [111,111,111]; // piksel ucun rgb reng
/**
* Burada seklin ozunu formalasdiriq
*/
$image = imagecreatetruecolor($width, $height);
$color = imagecolorallocate($image, $text_color[0], $text_color[1], $text_color[2]); // red
$white = imagecolorallocate($image, $bg_color[0], $bg_color[1], $bg_color[2]);
imagefilledrectangle($image,0,0,200,100,$white);

/**
* Bu hissede sekile xetler elave edirik
*/
$line_color = imagecolorallocate($image, $line_color[0],$line_color[1],$line_color[2]);
for($i=0;$i<6;$i++) {
imageline($image,0,rand()%50,200,rand()%50,$line_color);
}

/**
* Bu hissede sekle pikseller elave edirik
*/
$pixel_color = imagecolorallocate($image, $pixel_color[0],$pixel_color[1],$pixel_color[2]);
for($i=0;$i<500;$i++) {
imagesetpixel($image,rand()%200,rand()%50,$pixel_color);
}

/**
* Sonda teksti sekile elave edirik
*/
imagettftext ($image, $size, -5, 10, 25, $color,"sizincaptcha.ttf-fontun-serverdeki-unvani(path)", $_SESSION['captcha']);

header("Content-type: image/png");
imagepng($image);
imagedestroy($image);
}

İndi isə elə etməliyik ki, yeni class yaradanda captcha şəkli hazır olsun. Bunun üçün 2 metod əlavə edirik. __construct() və __toString():

public function __construct($length = 6, $width=170, $height=60, $size = 25)
{
return $this->setCaptcha($length)->makeCaptchaImage($width, $height, $size);
}

/**
* @return string
* Make class to string
*/
public function __toString()
{
return get_class($this);
}

Artıq Captcha classımız hazırdır. İndi onu contact sehifeye yerlesdirmeliyik. Burada sizə MVC struktur saytlarda yerləşdirmə qaydası göstəriləcək.

Bunun üçün sadəcə bir route yaradırıq və orada Captchanı çağrırıq. Nümunə:

public function actionCaptchaImage()
{
$captcha = new Captcha(6,130,40,22);
echo $captcha; // Captcha seklini gosterecekdir
exit;
}

Növbəti mərhələdə isə onu html səhifədə çağırırıq:

<img style="cursor:pointer" class="your_captcha pull-left" src="/captcha-link">
<input type="text" class="form-control" name="code" value="" placeholder="Şəkildəki kodu yazın" required>

Artıq Captcha hazırdır və biz onu istifadəçiyə göstərə bilirik. Hər dəfə səhifə yeniləndikdə yeni captcha görünəcəkdir. İndi isə Post request zamanı onun düzgünlüyünü yoxlamaq lazımdır. Biz captcha kodunu sessiyada saxladığımız üçün bu heç də çətin deyil.

if($_POST['code'] != $_SESSION['captcha']) {

echo 'Sekil kodu problemi !';
exit; // bu hissede deyisiklik ederek ajax da istifade ede bilersiniz.
}

Beləcə bugün sizə sadə bir Captcha necə hazırlamaq olar onu göstərdim. Biraz fantaziyanızı və biliklərinizi işlədərək onu daha da təkmilləşdirə bilərsiniz. Əlavə suallarınız olsa koment yaza bilərsiniz.

Tags