Я внедряю CAPTCHA в форму представления согласно книге Сандерсона Pro ASP.NET MVC Framework .
Поля просмотра генерируются с:
<%= Html.Captcha("testCaptcha")%>
<%= Html.TextBox("attemptCaptcha")%>
Помощник VerifyAndExpireSolution не работает, поскольку его решение реализовано.
Я добавляю проверку, и когда она не срабатывает, я добавляю сообщение об ошибке ModelState и отправляю пользователя обратно в представление, как указано в книге:
return ModelState.IsValid ? View("Completed", appt) : View();
Но при этом генерируется новый GUID, который генерирует новый текст CAPTCHA.
Однако проблема заключается в том, что значение скрытого поля CAPTCHA и URL-адрес изображения CAPTCHA сохраняют оригинальный GUID. Таким образом, вы никогда не сможете ввести правильное значение. У вас есть только один выстрел, чтобы сделать это правильно.
Я новичок во всем этом, но это как-то связано с видом, сохраняющим значения из первой загрузки страницы.
Captcha генерируется с:
public static string Captcha(this HtmlHelper html, string name)
{
// Pick a GUID to represent this challenge
string challengeGuid = Guid.NewGuid().ToString();
// Generate and store a random solution text
var session = html.ViewContext.HttpContext.Session;
session[SessionKeyPrefix + challengeGuid] = MakeRandomSolution();
// Render an <IMG> tag for the distorted text,
// plus a hidden field to contain the challenge GUID
var urlHelper = new UrlHelper(html.ViewContext.RequestContext);
string url = urlHelper.Action("Render", "CaptchaImage", new{challengeGuid});
return string.Format(ImgFormat, url) + html.Hidden(name, challengeGuid);
}
А потом я пытаюсь проверить это с помощью:
public static bool VerifyAndExpireSolution(HttpContextBase context,
string challengeGuid,
string attemptedSolution)
{
// Immediately remove the solution from Session to prevent replay attacks
string solution = (string)context.Session[SessionKeyPrefix + challengeGuid];
context.Session.Remove(SessionKeyPrefix + challengeGuid);
return ((solution != null) && (attemptedSolution == solution));
}
А как насчет воссоздания имен целевых полей с помощью guid? Тогда каждое поле уникально и не сохранит значения предыдущих поколений форм?
Или мне просто нужна другая реализация CAPTCHA?