Суть метода защиты в том, что большинство автоматизированных спам-роботов распознает проверочный код, и вводит его в одно поле ввода, а мы создаем второе поле ввода с любым именем, и визуально оформляем поля так, что человеку будет понятно что надо ввести код в два поля, а роботу нет, и он пытается ввести код в одно поле. Чтобы упростить задачу распознавания кода для людей, капча теперь состоит только из цифр., (*1)
Такой метод защиты подойдет для мелких и средних сайтов, для которых никто не будет персонально разрабатывать спам-роботов. Из-за смены букв на цифры, криптостойкость проверочного кода относительно штатной капчи получается ниже, и если кто-то решит написать робота специально для вашего сайта, то ему это может будет даже проще, чем с обычной капчей., (*2)
, (*3)
composer require denis909/yii2-captcha
В форме выведите капчу:, (*4)
field($model, 'verifyCode')->widget(Captcha::className(), [ 'captchaAction' => '/site/captcha', 'options' => [ 'class' => 'form-control' ], 'attribute2' => 'verifyCode2', 'attribute2Options' => [ 'class' => $model->hasErrors('verifyCode') ? 'form-control ' . $form->errorCssClass : 'form-control' ], 'containerTag' => 'div', 'containerOptions' => [ 'class' => 'row gutters-xs' ], 'imageContainerTag' => 'div', 'imageContainerOptions' => [ 'class' => 'col-xs-3', 'style' => 'min-width: 164px;' ], 'attributeContainerTag' => 'div', 'attributeContainerOptions' => [ 'class' => 'col-xs-2', 'style' => 'padding-right: 0px;' ], 'devider' => '—', 'deviderTag' => 'div', 'deviderOptions' => [ 'class' => 'col-xs-1', 'style' => 'padding-top: 15px; text-align: center;' ], 'attribute2ContainerTag' => 'div', 'attribute2ContainerOptions' => [ 'class' => 'col-xs-2', 'style' => 'padding-left: 0px;' ] ]);?>
Настройте капчу в контроллере:, (*5)
public function actions() { return [ 'captcha' => [ 'class' => 'denis909\yii\captcha\CaptchaAction', 'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null, 'testLimit' => 10, 'width' => 150, 'height' => 49, 'offset' => 10, 'minLength' => 5, 'maxLength' => 5, 'padding' => 0, 'foreColor' => 0x4a4949, //'resetValidCaptcha' => false ] ]; }
Если включить resetValidCaptcha в false то надо вручную обнулять в контроллере после сабмита формы., (*6)
$captcha = $this->createAction('captcha'); $captcha->reset();
Настройте поля в модели:, (*7)
public $verifyCode; public $verifyCode2; public function rules() { return [ [ 'verifyCode', \denis909\yii\captcha\CaptchaValidator::className(), 'attribute2' => 'verifyCode2', 'captchaAction' => '/site/captcha' ] ]; }
Здравствуйте, меня зовут Денис. Я занимаюсь разработкой веб-приложений на PHP около 10 лет. Работаю на Yii 2 фреймворке. Владею PHP, MySQL, JavaScript(jQuery), HTML5(bootstrap)., (*8)
Мой сайт: denis909.spb.ru, (*9)
Пишите в форме обратной связи на сайте, или на denis909@mail.ru, если у вас есть для меня предложения по работе., (*10)