рдирдорд╕реНрдХрд╛рд░! рд▓реЗрдЦ рдХреЗ рд╢реАрд░реНрд╖рдХ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЛрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдЧрд╛ рдЬреЛ рдореИрдВрдиреЗ рдЕрдкрдирд╛ рдХреИрдкреНрдЪрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛, рдЬрд┐рд╕реЗ рдиреНрдпреВрдирддрдо рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдиреНрдп рд░реВрдкрд░реЗрдЦрд╛рдУрдВ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреБрдЫ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг DIY рдХреИрдкреНрдЪрд╛ рд╡рд┐рдХрд╛рд╕ рдкреЛрд╕реНрдЯ рдХреА рд╕рд╛рдордЧреНрд░реА рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВ редрдкрд░рд┐рдЪрдп
рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреАрдПрдЪрдбреА рдореЗрдВ рдЬреАрдбреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ gd_info () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкреНрд░рд╕реНрддреБрдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рдореИрдВ рд╕рдВрд╕реНрдХрд░рдг 2.1.0 рдФрд░ PHP 7.4.3 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдЬреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ PHP7 рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИредрд▓реЙрдЬрд┐рдХреНрд╕
рдореБрдЭреЗ рдХреНрдпрд╛ рджреЗрдЦрдирд╛ рд╣реИ? рдПрдХ рд╣реИ рдЬреЛ рдореБрдЭреЗ рдХреЛрдбрд┐рдЧрдирд┐рдЯрд░ 4рдХреЗ рд╕рд╛рде рдореЗрд░реА рд╕рд╛рдЗрдЯ рдореЗрдВ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рджреМрд░рд╛рди рд╕рд░реНрд╡рд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдХреЗ рд╕рд╛рде рдЪрд┐рддреНрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░ рдЙрддреНрдкрдиреНрди рд╣реЛрдЧрд╛, рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛, рдмреЗрд╕ 64 рдореЗрдВ рдПрдиреНрдХреЛрдбреЗрдб рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛редрд╡рд┐рдХрд╛рд╕
рдЪрд┐рддреНрд░ рдмрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдХреЛрдб рдЬрдирд░реЗрд╢рди рд╡рд┐рдзрд┐ рд▓рд┐рдЦрддреЗ рд╣реИрдВредpublic function generate_code() {
srand((float) microtime() * 1000000);
$chars = 'ABDEFHKNRSTYZabdefhknrstyz23456789';
$length = rand(5, 7);
$numChars = strlen($chars);
$str = '';
for ($i = 0; $i < $length; $i++) {
$str .= $chars[rand(0, $numChars - 1)];
}
$array_mix = preg_split('//', $str, -1, PREG_SPLIT_NO_EMPTY);
shuffle($array_mix);
delete_cookie('cap');
set_cookie('cap', md5(implode("", $array_mix)), self::$_code_time);
return implode("", $array_mix);
}
рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдореИрдВ рд╡рд┐рднрд┐рдиреНрди рдлреЛрдВрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдХреИрд░реЗрдХреНрдЯрд░реНрд╕ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░реВрдВрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ "Z" рдФрд░ "z", "X" рдФрд░ "x x" рдЬреИрд╕реЗ рдХреИрд░реЗрдХреНрдЯрд░реНрд╕ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдХреНрд╖рд░реЛрдВ рдХреЗ рдореВрд▓ рд╕реЗрдЯ рдпрд╛ рдЦреБрдж рдлреЙрдиреНрдЯ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред "рдЖрдИ" рдФрд░ "рдПрд▓" рдЖрджрд┐, рдХреНрдпреЛрдВрдХрд┐ рдЫрд╡рд┐ рдХреЛ рд╡рд┐рдХреГрдд рдХрд░рдиреЗ рд╕реЗ рдХреИрдкреНрдЪрд╛ рдЗрдирдкреБрдЯ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИредрдореИрдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддрд╛ рд╣реВрдВредpublic static $width = 220;
public static $height = 120;
public static $fonts_num = 4;
private static $_code_time = 180;
рдореИрдВ рдкреГрд╖реНрдарднреВрдорд┐ рдФрд░ рд╢реЛрд░ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рддрд░реАрдХреЗ рддреИрдпрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ (рдЕрдВрдд рдореЗрдВ рдкреВрд░реНрдг рд╕реВрдЪреА)ред
private function _add_line($img, $mode = '', $max = 100) {
for ($i = 0; $i < rand(0, $max); $i++) {
$color = imagecolorallocate($img, rand(80, 150), rand(80, 150), rand(80, 150));
if ($mode === 'parallel') {
$r1 = rand(0, self::$width);
$r2 = rand(0, self::$width);
imageline($img, $r1, $r1, $r2, $r1, $color);
imageline($img, $r1, $r2, $r1, rand(0, 220), $color);
} else {
imageline($img, rand(0, self::$width), rand(0, self::$width), rand(0, self::$width), rand(0, self::$width), $color);
}
}
}
private function _add_poly($img) {
$points = [];
for ($i = 0; $i < 10; $i++) {
array_push($points, rand(0, self::$width * 2));
}
$color = imagecolorallocate($img, rand(80, 190), rand(80, 190), rand(80, 190));
imageFilledPolygon($img, $points, 5, $color);
}
private function _set_glitch_color($image, $xn = 0, $yn = 0, $mode = 'normal') {
$start = rand(self::$height / 2, self::$height / 2 - self::$height / 4);
$finish = $start + rand(5, 15);
for ($x = 0; $x < self::$width - 1; $x++) {
for ($y = 0; $y < self::$height - 1; $y++) {
if ($mode != 'normal') {
$xn = rand(0, 1);
$yn = rand(0, 1);
} else {
$finish = $start + 3;
}
if ($y > $start && $y < $finish) {
imagesetpixel($image, $x + $xn, $y + $yn, imagecolorat($image, $x, $y));
}
}
}
}
рд▓рдЧрднрдЧ рддреИрдпрд╛рд░ред рд╣рдо рдЪрд┐рддреНрд░ рдореЗрдВ рдЧреБрдкреНрдд рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВредprivate function _add_text($img, $text) {
$x = rand(10,20);
for ($i = 0; $i < strlen($text); $i++) {
$text_color = imagecolorallocate($img, rand(150, 250), rand(150, 250), rand(150, 250));
imagettftext($img, rand(35, 40), rand(0, 10) - rand(0, 10), $x, rand(55, 95), $text_color, 'fonts/' . rand(1, self::$fonts_num) . ".ttf", $text[$i]);
$x += rand(25, 35);
}
}
рд╣рдо рдЪрд┐рддреНрд░ рдмрдирд╛рдиреЗ рдФрд░ рдХреЛрдб рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рддрд░реАрдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВредpublic function img_code($code) {
$image = imagecreatetruecolor(self::$width, self::$height);
imageantialias($image, true);
$rand_color = imagecolorallocate($image, rand(50, 120), rand(50, 120), rand(50, 120));
imagefilledrectangle($image, 0, 0, self::$width, self::$height, $rand_color);
$this->_add_rand_bg($image);
$this->_add_text($image, $code);
$this->_add_glitch($image, 'normal');
$this->_add_glitch($image, 'boom');
$this->_add_line($image, 'rand', 200);
$file = 'temp/' . md5($code) . ".png";
imagepng($image, $file);
imagedestroy($image);
$res = base64_encode(file_get_contents($file));
unlink($file);
return $res;
}
public function check($tested) {
$cap = get_cookie('cap');
$r['error'] = '';
if (!$cap) {
$r['error'] = ' .';
} elseif (strcmp($tested, $cap)) {
$r['error'] = ' .';
}
delete_cookie('cap');
return $r;
}
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП
рдЖрд╡рд╢реНрдпрдХ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдореЗрдВ, рд╣рдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХреИрдкреНрдЪрд╛ рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ:public function __construct() {
...
$this->captcha = new \App\Libraries\Captcha();
...
}
public function some_function() {
...
$data['captcha'] = $this->captcha->img_code( $this->captcha->generate_code() );
return view('page/template', $data);
}
public function recaptcha(){
return $this->captcha->img_code( $this->captcha->generate_code() );
}
рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ, рдЪрд┐рддреНрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЛрдХрди рдФрд░ рдПрдХ рдмрдЯрди рдмрдирд╛рдПрдВ:...
<input type="hidden" name="<?= csrf_token() ?>" value="<?= csrf_hash() ?>" id="csrf"/>
...
<img src="data:image/png;base64,<?= $captcha ?>" id="cap" width="220" height="120"/>
<div id="ref" onclick="recaptcha()">теБ</div>
...
рд╣рдо ajax рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рд░реНрдЧ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред$routes->post('/recap', 'AuthController::recaptcha');
рдФрд░ рд╕реНрд╡рдпрдВ рдЕрдЬрд╛рдХреНрд╕редvar numlog = 0;
function recaptcha() {
if(numlog <= 5){
$.ajax({
type: 'post',
url: '/recap',
data: {csrf_token: $('#csrf').val()},
success: function (result) {
numlog++;
$('#cap').attr('src', "data:image/png;base64," + result + '');
}
});
}else{
$('#ref').css('display', 'none');
}
}
рд╕рдВрдкреВрд░реНрдг
рдПрдХ рд╢реЛрд░ рд░рдВрдЧ рдкреИрд▓реЗрдЯ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рдХреГрддрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдХреИрдкреНрдЪрд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЛ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рдХрд░рддрд╛ рд╣реИред рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВредрдореИрдВрдиреЗ рдПрдХ рдЪрд┐рддреНрд░рдордп рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рд╕рднреА рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдЪрд┐рддреНрд░реЛрдВ рдкрд░ рдПрдХ рд╕реАрдорд╛ рд╕реЗ рдлреЗрдВрдХрдХрд░ рдЬрд╛рдБрдЪ рдХреА, рдЬрд┐рд╕рд╕реЗ рдЙрди рдкрд╛рддреНрд░реЛрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдЬрд┐рдиреНрд╣реЗрдВ рдорд╛рдиреНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╢реЛрд░ рдФрд░ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд▓рд╛рдЗрдиреЗрдВ, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдЬрдЯрд┐рд▓рддрд╛ рдмрдврд╝рд╛рддреА рд╣реИрдВред рд▓реЗрдХрд┐рди рдореИрдВ рдЬреЛ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реВрдВ рд╡рд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИ: рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдФрд░ рд╡рд╛рдВрдЫрд┐рдд рд╣реЛ, рддреЛ рдпрд╣ рд╕рдорд╛рдзрд╛рди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдмреЙрдЯреНрд╕ рд╕реЗ рдмрдЪрд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИредрдкреВрд░рд╛ рдХреЛрдб рдЬреАрдердм рдкрд░ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рд╕рд┐рдлрд╛рд░рд┐рд╢реЛрдВ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рд╕реБрдирдХрд░ рдореБрдЭреЗ рдЦреБрд╢реА рд╣реЛрдЧреАред