Capcha Nasıl Yapılır? Nasıl Oluşturulur?

M2mester adında bir oyun sunucusunda gördüğüm ve daha sonra niye sürekli google recapcha ile uğraşıyorum ki diye ürettiğim bir çözüm diyebilirim.

Aslında mantığı çok basit bir capcha ve gizli değer olarak bir token gönderirseniz ekstra form güvenliğine dair bir şey yapmanız gerekmez.

Kod:

session_start();

header("Content-Type: image/png");
$temp_bg = imagecreatefromstring(file_get_contents('assets/img/transparent.png')); // bir temp görseli gerekiyor 150x40 boyunda boş bir transparent görsel oluşturun
$width = 150;
$height = 40;
$x = mt_rand(0, 450 - $width);
$y = mt_rand(0, 450 - $height);
$bg = imagecreatetruecolor($width, $height);
imagealphablending($bg, false);
imagesavealpha($bg,true);
$transparent = imagecolorallocatealpha($bg, 255, 255, 255, 127);
imagecopyresampled($bg, $temp_bg, 0, 0, 0, 0, $width, $height, $width, $height);
$font = "assets/res/fonts/J36C.TTF"; // ben bu fontu paylaşmayacağım çünkü projeden projeye değişiyor tasarıma uyumlu olması için fontu sitenin fontuyla aynı yapıyorum bu sebeple buradaki fontu sitedeki tasarımın fontuyla aynı yapabilirsiniz.
$color = imagecolorallocate($bg, 210, 210, 210);
$text = "QWERTYUIOPASDFGHJKLZXCVBNM";
$text = str_split($text);
$code = "";

$code_length = 5;
for($i = 0; $i < $code_length; $i++) {
	$code .= $text[mt_rand(0, 25)];
}

$step = ($width - 6) / $code_length;

for($i = 0; $i < $code_length; $i++) {
	
	$angle = mt_rand(-20, 20);
	
	$area = imagettfbbox(25, $angle, $font, $code[$i]);
	
	$f_width = $area[2] - $area[0];
	
	imagettftext($bg, 25, $angle, 3 + ($i * $step), $height - 7, $color, $font, $code[$i]);

}

$_SESSION['captcha'] = $code;

imagepng($bg);

Kullanımı:

<img src="capcha.php" />

Dediğim gibi font tercihi size kalmış $text = "QWERTYUIOPASDFGHJKLZXCVBNM"; Bu kısımda değişiklik yapabilirsiniz ben sadece yazı olsun istediğim için böyle ayarladım ama siz 0123456789 da dahil etmek isterseniz veya özel bir karakteri bu kısmı düzelterek yapabilirsiniz.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir