Je suis en train d'implémenter CAPTCHA dans ma soumission de formulaire selon le livre de Sanderson Pro ASP.NET MVC Framework.Validation du Captcha après l'aller-retour du serveur et la nouvelle génération du captcha
Les champs d'affichage sont générés avec:
<%= Html.Captcha("testCaptcha")%>
<%= Html.TextBox("attemptCaptcha")%>
L'aide VerifyAndExpireSolution ne fonctionne pas comme sa solution est mise en œuvre.
J'ajoute la validation et quand il échoue j'ajouter un message d'erreur de ModelState et envoyer l'utilisateur à la vue comme indiqué dans le livre:
return ModelState.IsValid ? View("Completed", appt) : View();
Mais, ce faisant, génère un nouveau GUID qui génère un nouveau texte CAPTCHA.
Le problème est cependant que la valeur du champ masqué CAPTCHA et l'URL de l'image CAPTCHA conservent tous les deux le original GUID. Ainsi, vous ne serez jamais capable d'entrer la valeur correcte. Vous n'avez essentiellement qu'un seul coup pour bien faire les choses. Je suis nouveau dans tout cela, mais cela a quelque chose à voir avec la vue qui retient les valeurs du chargement de la première page.
Captcha est généré avec:
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);
}
Et puis je tente de le valider avec:
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));
}
Qu'en est re-construire les noms de champ cible avec le guid? Ensuite, chaque champ est unique et ne conservera pas la valeur des générations précédentes. Ou ai-je juste besoin d'une implémentation CAPTCHA différente? J'ai donc décidé d'implémenter reCaptcha.
Le nom de champ unique n'a pas fonctionné. J'ai vécu la même chose. Le champ cible n'est créé que la première fois et ensuite, il est mis en cache et non régénéré à nouveau. – Scott
C'est probablement pourquoi une implémentation basée sur javascript, comme reCaptcha est probablement meilleure. – Scott