Здравствуйте! У меня стоит капча в изменении статьи.
Чтобы изменения сохранились, нужно разгадать капчу. Если капча не разгадана, то сервер через AJAX выдает сообщение - ошибку.
Представим, что пользователь разгадал капчу. Отправил изменения на сервер. Валидация пройдена, изменения сохранились. Все отлично.
Но тут пользователь увидел, что забыл поставить запятую кое-где. Он ее ставит и снова отправляет форму на сервер. В контроллере форма проходит валидацию и... КАПЧУ. Проблема в том, что капча при проверке создается новая:
$response = null;
$reCaptcha = new ReCaptcha(self::SECRET_KEY);
if ($value) {
$response = $reCaptcha->verifyResponse(
$_SERVER["REMOTE_ADDR"],
$value
);
}
if ($response != null && $response->success) {
return true;
}
Что же получается? Пользователь "проваливается" на валидации капчи, так как при втором обращении к серверу капча сгенерировалась новая. Однако нажать галочку на капче пользователь не может, так как она уже нажата.
Что делать? Было принято решение сохранять в сессии результат капчи. И сбрасывать сессию при загрузке контроллера обычным способом (не через AJAX). Это говорит о том, что я именно перезагрузил страницу или только что открыл ее (поэтому сессии с капчей быть не должно).
Все бы ничего, да вот у капчи есть срок действия, после которого она становится неактивной.
Собственно, сам вопрос. Как проверять неактивную капчу? У меня в сессии уже есть сохраненный результат проверки капчи. Можно проверять только лишь галочку - если value == true. Но это ведь не разгадка капчи? Иначе зачем весь следующий код?
Насколько я понял, засекать время жизни капчи бессмысленно, так как оно меняется в зависимости от активности пользователя.
Вот код проверки:
static public function captcha_is_true($value, $validation) {
// Заблоговременный результат
if (!$value) {
return $validation->error(self::FUNCTION_NAME, null);
}
$captcha_is_true = Session::instance()->get(self::SESSION_NAME);
if ($captcha_is_true) {
return true; // НО ЭТО ВЕДЬ НЕ РАЗГАДКА КАПЧИ?
}
// Вычисляемый результат
$response = null;
$reCaptcha = new ReCaptcha(self::SECRET_KEY);
if ($value) {
$response = $reCaptcha->verifyResponse(
$_SERVER["REMOTE_ADDR"],
$value
);
}
if ($response != null && $response->success) {
Session::instance()->set(self::SESSION_NAME, true);
return true;
} else {
return $validation->error(self::FUNCTION_NAME, null);
}
}