sorry_i_noob
@sorry_i_noob

RECAPTCHA, AJAX и MVC — Чтобы не генерировать новую капчу при каждом обращении к контроллеру, сохраняем ее в сессию. А как быть, если время истекло?

Здравствуйте! У меня стоит капча в изменении статьи.
Чтобы изменения сохранились, нужно разгадать капчу. Если капча не разгадана, то сервер через 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);
		}
	}
  • Вопрос задан
  • 253 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы