
рдХрд╛рдо рдкрд░, рд╕реНрдкреИрдо рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдкреБрд░рд╛рдиреЗ рдХреИрдкреНрдЪрд╛ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реНрдкреИрдордмреЙрдЯреНрд╕ рджреНрд╡рд╛рд░рд╛ рдмрд╛рдИрдкрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЧреБрдЧреНрд▓рд┐рдВрдЧ рдФрд░ рд╕рд╣реА рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рдвреВрдВрдврдиреЗ рдкрд░, рдореИрдВрдиреЗ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдФрд░ рдореИрдВ рдмрд╣реБрдд рд╕рдордп рд╕реЗ рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдФрд░ рдЗрд╕рд▓рд┐рдП, рдХреИрдкреНрдЪрд╛ рдХрд╛ рд╕рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрдИ рдЖрдЗрдХрди рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЙрд╕ рдПрдХ рдХреЛ рдЪреБрдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдкрдВрдХреНрддрд┐ рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрдВрдЯрд░рдиреЗрдЯ рдХреЗ рдкрд╛рд╕ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдРрд╕рд╛ рд╕рдореБрджреНрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдорд┐рд▓рд╛ (рдареАрдХ рд╣реИ, рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдирд╛, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреА рддрд▓рд╛рд╢ рдирд╣реАрдВ рдХрд░рдирд╛)ред
рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ
рдСрдкрд░реЗрд╢рди рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ: рдорд╛рдЙрд╕ рдХреЗ рджреЛ рд╕рдореВрд╣ рдЗрдХрдЯреНрдареЗ рд╣реЛрддреЗ рд╣реИрдВ, рдПрдХ рд╕рд╣реА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рд╣реИ, рджреВрд╕рд░рд╛ рдЧрд▓рдд рдПрдХ рдХреЗ рд╕рд╛рде рд╣реИред рдЗрд╕реЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рд░рдгреА рдореЗрдВ рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдЧрд▓рдд рдЪрд┐рддреНрд░ рдХреА рдХреБрдВрдЬреА (рд╕рд░рдгреА рддрддреНрд╡ рдХреА рдХреНрд░рдо рд╕рдВрдЦреНрдпрд╛) рдХреЛ рд╕рддреНрд░ рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рднреА рдЖрдЗрдХрди рд╕реЗ рд╣рдо рдПрдХ рдЫрд╡рд┐ рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдо рдкреГрд╖реНрдарднреВрдорд┐-рд╕реНрдерд┐рддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рдЯ рд▓реЗрдВрдЧреЗред
рдлреЙрд░реНрдо рдПрдХ рд░реЗрдбрд┐рдпреЛ рдмрдЯрди рд╣реИ рдЬрд┐рд╕рдореЗрдВ 1 рд╕реЗ рд▓реЗрдХрд░ рдЖрдЗрдХрди рддрдХ рдХреА рд╡реИрд▓реНрдпреВ рд╣реИред рд╣рдо POST рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджрдмрд╛рдП рдЧрдП рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдлрд╝реЙрд░реНрдо рднреЗрдЬрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЙрд╕ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рд╕рддреНрд░ рдореЗрдВ рд░рдЦрд╛ рд╣реИ, рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред
рдФрд░ рдЗрд╕рд▓рд┐рдП, рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдорд╛рдЙрд╕ рдХреЗ рд╕рдореВрд╣ рдЭреВрда рдмреЛрд▓рддреЗ рд╣реИрдВ:

рд╕рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдПрдХ рд╡рд░реНрдЧ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИрдВред рд╣рдо рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ:
1. рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдирд┐рдЬреА рдЪрд░ред
private $icon_dir;
2. рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдЦреБрдж, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП 4 рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
function __construct($icons_count, $icon_dir, $icon_size, $address) { $this->icon_dir = $icon_dir; $this->icon_size = $icon_size; $this->group_count = scandir($this->icon_dir); $this->group_count = count($this->group_count) - 2; $this->first_group_num = rand(1, $this->group_count); $this->second_group_num = rand(1, $this->group_count); $this->icon_count = $icons_count; while ($this->first_group_num == $this->second_group_num) { $this->second_group_num = rand(1, $this->group_count); } $this->address = $address; }
3. рд╕рд╣реА рдФрд░ рдЧрд▓рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ, рдирд┐рдпрдорд┐рдд рд╕реНрдХреИрдВрдбрд┐рд░ () рдФрд░ рдПрдХ рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рд▓реЗрдЦрди, рдЬрдм рддрдХ рдХрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рддреНрд░ рдореЗрдВ рд▓рд┐рдЦрдирд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реЛрддрд╛ рд╣реИ:
$_SESSION['iconcaptcha'] = array_search($true_icon, $array_of_icons) + 1;
рдЬрд╣рд╛рдВ $ true_icon рд╡рд╣ рдЖрдЗрдХрди рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдвреВрдВрдв рд░рд╣реЗ рд╣реИрдВ, рдФрд░ $ array_of_icons рдЕрдВрддрд┐рдо рдЖрдЗрдХрди рд╕рд░рдгреА рд╣реИред
4. рдЖрдЗрдХрди рд╕реЗ рдЕрдВрддрд┐рдо рдЫрд╡рд┐ рдмрдирд╛рдПрдВред
private function makeSprite() {
5. рд╣рдореЗрдВ рд╡рд╣ рдкрддрд╛ рдорд┐рд▓рддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рд╣рдо рдПрдХ рдкреВрд░реНрдг рдЪрд┐рддреНрд░ рдмрдирд╛рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдиреЗрдВрдЧреЗред
private function getCaptchaAddress($address) {
6. рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЕрдВрддрд┐рдо рд╡рд┐рдзрд┐, рдлреЙрд░реНрдо рдХреЛ рд╕реНрд╡рдпрдВ рдФрд░ рд╕рднреА рдЪреАрдЬреЛрдВ рдХреЛ рд╕рдорд░реНрдкрд┐рдд рдХрд░рддреЗ рд╣реБрдПред рдмреЗрд╢рдХ, рд╣рдореЗрдВ рдпрд╣рд╛рдВ рд╢реИрд▓рд┐рдпреЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдпрд╣рд╛рдВ рдкреГрд╖реНрдарднреВрдорд┐-рдЫрд╡рд┐ рд╕реЗрдЯ рдХреА рдЧрдИ рд╣реИ, рдЬреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдХрд╕рд╛рддреА рд╣реИSSprite () рдФрд░ рдХреИрдкреНрдЪрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ (рд╕рд╛рде рд╣реА рдПрдХ рд╣реА рдХреБрдЯрд┐рд▓ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдХреИрд╢рд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╣реБрдП), рдореИрдВрдиреЗ рдЗрд╕реЗ рдЫреЛрдбрд╝рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
function getCaptchaForm() { $this->getCaptchaAddress($this->address); $captcha_form = '<style> #icon_captcha label div { background-image: url(/'.$this->address.'?'.rand().'); width: '.$this->icon_size.'px; height: '.$this->icon_size.'px; } #icon_captcha { margin-bottom: 20px !important; display: table !important; } #icon_captcha div { width: '.$this->icon_size.'px; display: inline-block; margin-right: 20px; } #icon_captcha div input { width: '.$this->icon_size.'px; margin-left: 0; float: left; border: none; } #icon_captcha div label img { border: none; } </style> <div id="icon_captcha">'; for ($i = 1; $i <= $this->icon_count; ++$i) { $captcha_form .= '<div> <label for="val_'.$i.'"> <div class="i'.$i.'" style="background-position: ' .(($i - 1)*(-$this->icon_size)). 'px 0;"></div> </label> <input type="radio" name="radio_val" id="val_'.$i.'" value="'.$i.'" /> </div>'; } $captcha_form .= '</div>'; return $captcha_form; }
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреЙрд▓ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рдпрд╣ рдмрд╛рдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣реЛрддреА рд╣реИ:
require(INC_DIR.'libs/IconCaptcha.class.php'); $icon_dir = $_SERVER['DOCUMENT_ROOT']."/design/site/images/captcha/"; $icon_captcha = new IconCaptcha(4, $icon_dir, 32, 'iconcaptcha'); $captcha_form = $icon_captcha->getCaptchaForm(); define('ICONCAPTCHA', $captcha_form);
рдЕрдЧрд▓рд╛, рд╣рдо рдмрд╕ ICONCAPTCHA рдХреЛ рдЙрд╕ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдПрдХ рддреБрдЪреНрдЫ рддреБрд▓рдирд╛ рдХреЗ рд╕рд╛рде рдЬрд╛рдВрдЪреЗрдВ: $ _POST ['radio_val'] == $ _SESSION ['iconcaptcha']ред
рдпрд╣рд╛рдВ рдЖрдк рдбреЗрдореЛ:
iconcaptcha.hut4.ru рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдпрд╣рд╛рдВ рдЖрдк рдкреВрд░реА рдХрдХреНрд╖рд╛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
github.com/L1Qu0R/iconcaptcha/blob/master/IconCaptcha.class.php