using System; using System.Configuration; using System.IO; using System.Net; using System.Text; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace Validators { public class ReCaptchaValidator : BaseValidator { #region Fields protected TextBox dummy = new TextBox(); #endregion Fields #region Properties /// /// Gets the Public Key generated by reCaptcha /// private static string PublicKey { get { return ConfigurationManager.AppSettings["publicKey"]; } } /// /// Gets the Private Key generated by reCaptcha /// private static string PrivateKey { get { return ConfigurationManager.AppSettings["privateKey"]; } } #endregion Properties #region Private /// /// Obtains the value of the passed key in the http form /// /// /// private static string GetFormValue( string value ) { return HttpContext.Current.Request.Form[value]; } /// /// Gathers the parameters for reCaptchaValidator /// /// private static string ReCaptchaParameters() { string response = GetFormValue("recaptcha_response_field"); string challenge = GetFormValue("recaptcha_challenge_field"); string IP = HttpContext.Current.Request.UserHostName; StringBuilder builder = new StringBuilder(); builder.AppendFormat( "privatekey={0}&", PrivateKey ); builder.AppendFormat( "remoteip={0}&", IP ); builder.AppendFormat( "challenge={0}&", challenge ); builder.AppendFormat( "response={0}", response ); return builder.ToString(); } /// /// Validates the capcha inserted by the user /// /// parameters to verify /// response of the capcth private static string ValidateCaptcha( string parameters ) { try { WebRequest request = WebRequest.Create( "http://api-verify.recaptcha.net/verify" ); request.ContentType = "application/x-www-form-urlencoded"; request.Method = "POST"; StreamWriter writer = new StreamWriter( request.GetRequestStream() ); writer.Write( parameters ); writer.Close(); //Response HttpWebResponse webResponse = (HttpWebResponse)request.GetResponse(); StreamReader myReader = new StreamReader( webResponse.GetResponseStream() ); string response = myReader.ReadToEnd(); myReader.Close(); webResponse.Close(); return response; }catch( WebException ) { return string.Empty; } } #endregion Private #region Public protected override bool EvaluateIsValid() { string parameters = ReCaptchaParameters(); string result = ValidateCaptcha(parameters); bool isValid = result.Equals("true\nsuccess"); if( !isValid ) { ErrorMessage = "Your are not a human!"; Controls.Add( new LiteralControl(ErrorMessage)); } return isValid; } #endregion Public #region Control Events protected override void OnInit(EventArgs e) { dummy.ID = "aaa"; Controls.Add(dummy); ControlToValidate = "aaa"; base.OnInit(e); } /// /// Writes the to show the validation Captcha /// /// protected override void Render(HtmlTextWriter writer) { writer.Write( @" ", PublicKey ); dummy.Visible = false; base.Render(writer); } #endregion Constructor } }