private bool IsCaptchaValidate(string captchaText, string captchaToken) { string token = captchaProtectionProvider.Decrypt(captchaToken); int number; if (!int.TryParse(captchaText, out number)) { return(false); } string text = humanReadableIntegerProvider.NumberToText(number, DNTCaptcha.Core.Providers.Language.English); return(text == token); }
/// <summary> /// Process the taghelper and generate the output. /// </summary> public void Process(TagHelperContext context, TagHelperOutput output) { context.CheckArgumentNull(nameof(context)); output.CheckArgumentNull(nameof(output)); setUrlHelper(); output.TagName = "div"; output.Attributes.Add("class", "dntCaptcha"); var captchaDivId = $"dntCaptcha{context.UniqueId}{_randomNumberProvider.Next(Min, Max)}"; output.Attributes.Add("id", captchaDivId); output.TagMode = TagMode.StartTagAndEndTag; var number = _randomNumberProvider.Next(Min, Max); var randomText = _humanReadableIntegerProvider.NumberToText(number, Language); var encryptedText = _captchaProtectionProvider.Encrypt(randomText); var captchaImage = getCaptchaImageTagBuilder(encryptedText); output.Content.AppendHtml(captchaImage); var cookieToken = $".{captchaDivId}"; var refreshButton = getRefreshButtonTagBuilder(captchaDivId, cookieToken); output.Content.AppendHtml(refreshButton); var hiddenInput = getHiddenInputTagBuilder(encryptedText); output.Content.AppendHtml(hiddenInput); var textInput = getTextInputTagBuilder(); output.Content.AppendHtml($"{string.Format(TextBoxTemplate, textInput.GetString())}"); var validationMessage = getValidationMessageTagBuilder(); output.Content.AppendHtml(validationMessage); var hiddenInputToken = getHiddenInputTokenTagBuilder(_captchaProtectionProvider.Encrypt(cookieToken)); output.Content.AppendHtml(hiddenInputToken); var dataAjaxBeginScript = getOnRefreshButtonDataAjaxBegin(); output.Content.AppendHtml(dataAjaxBeginScript); _captchaStorageProvider.Add(ViewContext.HttpContext, cookieToken, randomText); }
public IActionResult CreateDNTCaptcha([FromBody] DNTCaptchaTagHelperHtmlAttributes captchaAttributes) { var number = _randomNumberProvider.Next(captchaAttributes.Min, captchaAttributes.Max); var randomText = _humanReadableIntegerProvider.NumberToText(number, captchaAttributes.Language); var encryptedText = _captchaProtectionProvider.Encrypt(randomText); var captchaImageUrl = getCaptchaImageUrl(captchaAttributes, encryptedText); var captchaDivId = $"dntCaptcha{Guid.NewGuid().ToString("N")}{_randomNumberProvider.Next(captchaAttributes.Min, captchaAttributes.Max)}"; var cookieToken = $".{captchaDivId}"; var hiddenInputToken = _captchaProtectionProvider.Encrypt(cookieToken); _captchaStorageProvider.Add(HttpContext, cookieToken, randomText); return(Json(new { dntCaptchaImgUrl = captchaImageUrl, dntCaptchaId = captchaDivId, dntCaptchaTextValue = encryptedText, dntCaptchaTokenValue = hiddenInputToken })); }
/// <summary> /// /// </summary> /// <returns></returns> public DNTCaptchaValidatorResult Validate( HttpContext httpContext, string captchaText, string inputText, string cookieToken, Language captchaGeneratorLanguage, string errorMessage, string isNumericErrorMessage) { if (!shouldValidate(httpContext)) { _logger.LogInformation($"Ignoring ValidateDNTCaptcha during `{httpContext.Request.Method}`."); return(new DNTCaptchaValidatorResult { IsValid = true }); } if (string.IsNullOrEmpty(captchaText)) { _logger.LogInformation("CaptchaHiddenInput is empty."); return(new DNTCaptchaValidatorResult { IsValid = false, ErrorMessage = errorMessage }); } if (string.IsNullOrEmpty(inputText)) { _logger.LogInformation("CaptchaInput is empty."); return(new DNTCaptchaValidatorResult { IsValid = false, ErrorMessage = errorMessage }); } inputText = inputText.ToEnglishNumbers(); long inputNumber; if (!long.TryParse(inputText, out inputNumber)) { _logger.LogInformation("inputText is not a number."); return(new DNTCaptchaValidatorResult { IsValid = false, ErrorMessage = isNumericErrorMessage }); } var decryptedText = _captchaProtectionProvider.Decrypt(captchaText); var numberToText = _humanReadableIntegerProvider.NumberToText(inputNumber, captchaGeneratorLanguage); if (decryptedText == null || !decryptedText.Equals(numberToText)) { _logger.LogInformation($"{decryptedText} != {numberToText}"); return(new DNTCaptchaValidatorResult { IsValid = false, ErrorMessage = errorMessage }); } if (!isValidCookie(httpContext, decryptedText, cookieToken)) { return(new DNTCaptchaValidatorResult { IsValid = false, ErrorMessage = errorMessage }); } return(new DNTCaptchaValidatorResult { IsValid = true }); }
/// <summary> /// Process the taghelper and generate the output. /// </summary> public void Process(TagHelperContext context, TagHelperOutput output) { context.CheckArgumentNull(nameof(context)); output.CheckArgumentNull(nameof(output)); output.TagName = "div"; output.Attributes.Add("class", "captcha"); var captchaDivId = $"captcha{context.UniqueId}{_randomNumberProvider.Next(Min, Max)}"; output.Attributes.Add("id", captchaDivId); output.TagMode = TagMode.StartTagAndEndTag; var number = _randomNumberProvider.Next(Min, Max); var randomText = ""; randomText = OutputType == OutputType.InDigits ? DNTPersianUtils.Core.PersianNumbersUtils.ToPersianNumbers(number) : _humanReadableIntegerProvider.NumberToText(number, Language); var encryptedText = _captchaProtectionProvider.Encrypt(randomText); var captchaImage = GetCaptchaImageTagBuilder(encryptedText); output.Content.AppendHtml(captchaImage); var cookieToken = $".{captchaDivId}"; var refreshButton = GetRefreshButtonTagBuilder(captchaDivId, cookieToken); output.Content.AppendHtml(refreshButton); var hiddenInput = GetHiddenInputTagBuilder(encryptedText); output.Content.AppendHtml(hiddenInput); if (!ImageOnly) { var textInput = GetTextInputTagBuilder(); output.Content.AppendHtml($"{string.Format(TextBoxTemplate, textInput.GetString())}"); } var validationMessage = GetValidationMessageTagBuilder(); output.Content.AppendHtml(validationMessage); var hiddenInputToken = GetHiddenInputTokenTagBuilder(_captchaProtectionProvider.Encrypt(cookieToken)); output.Content.AppendHtml(hiddenInputToken); _captchaStorageProvider.Add(ViewContext.HttpContext, cookieToken, randomText); }