Close Menu
Código Simples .NETCódigo Simples .NET
    Facebook X (Twitter) Instagram
    Trending
    • NewSQL em 2025: O Estado Atual, Tendências e o Futuro dos Bancos de Dados Relacionais Escaláveis
    • 12 Regras Essenciais para Reduzir a Latência de Aplicações
    • Cache Hit Ratio: Como uma Simples Métrica Pode Revolucionar sua Arquitetura
    • Como a Uber calcula o tempo estimado de chegada
    • 30 APIs Gratuitas para desenvolvedores
    • Por que escalar escrita é tão mais difícil do que escalar leitura?
    • MongoDB Analyzer para .NET: Visualize e otimize suas consultas de forma simples
    • Cardinalidade: O Conceito que Transforma o Desempenho de Bancos de Dados SQL e NoSQL
    Facebook X (Twitter) Instagram
    Código Simples .NETCódigo Simples .NET
    Código Simples .NETCódigo Simples .NET
    Home»Front-End»Como criar captcha em Asp.NET C# utilizando MVC 4

    Como criar captcha em Asp.NET C# utilizando MVC 4

    Jhonathan SoaresBy Jhonathan Soares5 de abril de 20141 Min Read Front-End
    Share
    Facebook Twitter LinkedIn WhatsApp Copy Link

    Captcha são bastante utilizados atualmente no ambiente de desenvolvimento Web. Geralmente Captchas são utilizados para previnir entradas de robots em algum formulário do site.

    captcha
    captcha

    Vamos aprender de forma bastante simplificada um exemplo que você poderá utilizar em seus projetos MVC.
    Inicialmente vamos criar uma classe que ficará responsável por gerar uma imagem com dígitos aleatórios, veja:

      public class Captcha
        {
            #region Atributos
    
            Random rnd = new Random();
    
            System.Drawing.Brush _color;
    
            System.Drawing.Brush _backColor;
    
            int _height;
    
            int _width;
    
            int _totalCaracteres;
    
            bool _numeros;
    
            System.Drawing.Color _pointColor;
    
            #endregion
    
            #region Propriedades
    
            public int Width
            {
                get { return _width; }
                set { _width = value; }
            }
    
            public int Height
            {
                get { return _height; }
                set { _height = value; }
            }
    
            public System.Drawing.Brush BackColor
            {
                get { return _backColor; }
                set { _backColor = value; }
            }
    
            public System.Drawing.Brush Color
            {
                get { return _color; }
                set { _color = value; }
            }
    
            public int TotalCaracteres
            {
                get { return _totalCaracteres; }
                set { _totalCaracteres = value; }
            }
    
            public bool Numeros
            {
                get { return _numeros; }
                set { _numeros = value; }
            }
    
            public System.Drawing.Color PointColor
            {
                get { return _pointColor; }
                set { _pointColor = value; }
            }
    
            #endregion
    
            #region Métodos
    
            protected string ImageString()
            {
                String valor = "";
    
                for (int i = 0; i < _totalCaracteres; i++)
                {
                    if (rnd.Next(2) == 1 && _numeros)
                        valor += (char)rnd.Next(48, 56);
                    else
                        valor += (char)rnd.Next(65, 90);
                }
    
                return valor;
            }
    
            public string GeraImage(HttpContext pagina, string imgKey)
            {
                string strValida = imgKey;
    
                if (string.IsNullOrEmpty(strValida))
                    strValida = ImageString();
    
                pagina.Response.ContentType = "image/jpeg";
                pagina.Response.Clear();
                pagina.Response.BufferOutput = true;
    
                System.Drawing.Bitmap img = new System.Drawing.Bitmap(_width, _height);
                System.Drawing.Graphics dr = System.Drawing.Graphics.FromImage(img);
    
                dr.FillRectangle(_backColor, new System.Drawing.Rectangle(0, 0, img.Width, img.Height));
    
                System.Drawing.Font font = new System.Drawing.Font("Verdana", 18, System.Drawing.FontStyle.Bold);
                dr.DrawString(strValida, font, _color, rnd.Next(20), rnd.Next(_height - 24));
    
                dr.DrawLine(new System.Drawing.Pen(_color), new System.Drawing.Point(0, rnd.Next(_height)), new System.Drawing.Point(_width, rnd.Next(_height)));
                dr.DrawLine(new System.Drawing.Pen(_color), new System.Drawing.Point(0, rnd.Next(_height)), new System.Drawing.Point(_width, rnd.Next(_height)));
                dr.DrawLine(new System.Drawing.Pen(_color), new System.Drawing.Point(0, rnd.Next(_height)), new System.Drawing.Point(_width, rnd.Next(_height)));
                dr.DrawLine(new System.Drawing.Pen(_color), new System.Drawing.Point(0, rnd.Next(_height)), new System.Drawing.Point(_width, rnd.Next(_height)));
                dr.DrawLine(new System.Drawing.Pen(_color), new System.Drawing.Point(0, rnd.Next(_height)), new System.Drawing.Point(_width, rnd.Next(_height)));
                dr.DrawLine(new System.Drawing.Pen(_color), new System.Drawing.Point(rnd.Next(_width), 0), new System.Drawing.Point(_height, rnd.Next(_width)));
                dr.DrawLine(new System.Drawing.Pen(_color), new System.Drawing.Point(rnd.Next(_width), 0), new System.Drawing.Point(_height, rnd.Next(_width)));
                dr.DrawLine(new System.Drawing.Pen(_color), new System.Drawing.Point(rnd.Next(_width), 0), new System.Drawing.Point(_height, rnd.Next(_width)));
                dr.DrawLine(new System.Drawing.Pen(_color), new System.Drawing.Point(rnd.Next(_width), 0), new System.Drawing.Point(_height, rnd.Next(_width)));
                dr.DrawLine(new System.Drawing.Pen(_color), new System.Drawing.Point(rnd.Next(_width), 0), new System.Drawing.Point(_height, rnd.Next(_width)));
    
    
                for (int x = 0; x < img.Width; x++)
                    for (int y = 0; y < img.Height; y++)
                        if (rnd.Next(6) == 1)
                            img.SetPixel(x, y, _pointColor);
    
                font.Dispose();
                dr.Dispose();
    
                img.Save(pagina.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
                img.Dispose();
    
                pagina.Response.Write(strValida);
                return strValida;
            }
    
            public string GeraImage(Page pagina, string imgKey)
            {
                string strValida = imgKey;
    
                if (string.IsNullOrEmpty(strValida))
                    strValida = ImageString();
    
                pagina.Response.ContentType = "image/jpeg";
                pagina.Response.Clear();
                pagina.Response.BufferOutput = true;
    
                System.Drawing.Bitmap img = new System.Drawing.Bitmap(_width, _height);
                System.Drawing.Graphics dr = System.Drawing.Graphics.FromImage(img);
    
                dr.FillRectangle(_backColor, new System.Drawing.Rectangle(0, 0, img.Width, img.Height));
    
                System.Drawing.Font font = new System.Drawing.Font("Verdana", 18, System.Drawing.FontStyle.Bold);
                dr.DrawString(strValida, font, _color, rnd.Next(20), rnd.Next(_height - 24));
    
                dr.DrawLine(new System.Drawing.Pen(_color), new System.Drawing.Point(0, rnd.Next(_height)), new System.Drawing.Point(_width, rnd.Next(_height)));
                dr.DrawLine(new System.Drawing.Pen(_color), new System.Drawing.Point(0, rnd.Next(_height)), new System.Drawing.Point(_width, rnd.Next(_height)));
                dr.DrawLine(new System.Drawing.Pen(_color), new System.Drawing.Point(0, rnd.Next(_height)), new System.Drawing.Point(_width, rnd.Next(_height)));
                dr.DrawLine(new System.Drawing.Pen(_color), new System.Drawing.Point(0, rnd.Next(_height)), new System.Drawing.Point(_width, rnd.Next(_height)));
                dr.DrawLine(new System.Drawing.Pen(_color), new System.Drawing.Point(0, rnd.Next(_height)), new System.Drawing.Point(_width, rnd.Next(_height)));
                dr.DrawLine(new System.Drawing.Pen(_color), new System.Drawing.Point(rnd.Next(_width), 0), new System.Drawing.Point(_height, rnd.Next(_width)));
                dr.DrawLine(new System.Drawing.Pen(_color), new System.Drawing.Point(rnd.Next(_width), 0), new System.Drawing.Point(_height, rnd.Next(_width)));
                dr.DrawLine(new System.Drawing.Pen(_color), new System.Drawing.Point(rnd.Next(_width), 0), new System.Drawing.Point(_height, rnd.Next(_width)));
                dr.DrawLine(new System.Drawing.Pen(_color), new System.Drawing.Point(rnd.Next(_width), 0), new System.Drawing.Point(_height, rnd.Next(_width)));
                dr.DrawLine(new System.Drawing.Pen(_color), new System.Drawing.Point(rnd.Next(_width), 0), new System.Drawing.Point(_height, rnd.Next(_width)));
    
    
                for (int x = 0; x < img.Width; x++)
                    for (int y = 0; y < img.Height; y++)
                        if (rnd.Next(6) == 1)
                            img.SetPixel(x, y, _pointColor);
    
                font.Dispose();
                dr.Dispose();
    
                img.Save(pagina.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
                img.Dispose();
    
                return strValida;
            }
    
    
    
            #endregion
        }
        

    Após isto, vamos criar um Generic Handler que ficará responsável por criar uma sessão para o captcha e instanciar as propriedades da imagem.

     public class GerarCaptcha : IHttpHandler, IRequiresSessionState
        {
            private HttpContext _context;
            private Util.Captcha _img;
    
            public void ProcessRequest(HttpContext context)
            {
                _context = context;
                CriarImagemSafe();
            }
    
            public bool IsReusable
            {
                get
                {
                    return true;
                }
            }
    
            private bool possoSetarImagem()
            {
                return _context.Session["timeKey"] == null;
            }
    
            private void SetSessionImgKey(string valor)
            {
                _context.Session["imgKey"] = _img.GeraImage(_context, valor);
            }
    
            private string GetSessionImgKey()
            {
                return _context.Session["imgKey"] != null ? _context.Session["imgKey"].ToString() : string.Empty;
            }
    
            private void SetTimeKey()
            {
                _context.Session["timeKey"] = _context.Timestamp;
            }
    
            private void RemoveTimeKey()
            {
                _context.Session.Remove("timeKey");
            }
    
            private void CriarImagemSafe()
            {
                _img = new Util.Captcha();
                _img.BackColor = System.Drawing.Brushes.Chocolate;
                _img.Color = System.Drawing.Brushes.White;
                _img.PointColor = System.Drawing.Color.White;
    
                //Se é pra colocar números no captcha ou não
                _img.Numeros = false;
    
                _img.TotalCaracteres = 3;
                _img.Height = 61;
                _img.Width = 146;
    
                ExibirImagem();
            }
    
            private void ExibirImagem()
            {
                if (possoSetarImagem())
                {
                    SetSessionImgKey(string.Empty);
                    SetTimeKey();
                }
                else
                {
                    RemoveTimeKey();
                    SetSessionImgKey(GetSessionImgKey());
                }
            }
        }
        

     

    Agora ficou fácil, basta chamar o Handler na sua View !

    
    <img src="@Url.Content("~/GerarCaptcha.ashx")" alt="Image verification" />
    
    <br />
    Resultado :  @if (@Session["imgKey"] != null)
                 {
        @Session["imgKey"].ToString()
                 } 
                 

    Você poderá utilizar o valor da sessão em sua controller ou como melhor definir para validar a entrada do usuário na sua view.

    Você também pode fazer download do projeto aqui : GitHub

     

    Gostaria de agradecer também aos 1000 Fans do nosso Facebook que estão nos seguindo! Obrigado! 😀

     

    Share. Facebook Twitter LinkedIn Telegram WhatsApp Copy Link
    Jhonathan Soares
    • Website
    • Facebook
    • X (Twitter)
    • LinkedIn

    Criador do blog Código Simples e com mais 15 anos de experiência em TI, com títulos de MVP Microsoft na área de Visual Studio Development, Neo4j Top 50 Certificate, Scrum Master e MongoDB Evangelist.

    Posts Relacionados

    Happy Hour com Dados #17 – Azure vs AWS vs GCP

    Front-End 26 de maio de 20211 Min Read

    Blazor .NET – CRUD com MongoDB

    C# Front-End NoSql 2 de janeiro de 20195 Mins Read

    Introdução ao Blazor, o SPA da Microsoft

    C# Front-End 29 de dezembro de 20185 Mins Read
    Newsletter

    Digite seu endereço de e-mail para receber notificações de novas publicações por e-mail.

    Junte-se a 25mil outros assinantes
    Posts recentes
    • NewSQL em 2025: O Estado Atual, Tendências e o Futuro dos Bancos de Dados Relacionais Escaláveis
    • 12 Regras Essenciais para Reduzir a Latência de Aplicações
    • Cache Hit Ratio: Como uma Simples Métrica Pode Revolucionar sua Arquitetura
    • Como a Uber calcula o tempo estimado de chegada
    • 30 APIs Gratuitas para desenvolvedores
    Categorias
    • Arquitetura (14)
      • Testes (2)
    • Asp.net (120)
      • C# (89)
      • Mvc (13)
    • Banco de dados (90)
      • NoSql (58)
      • Sql (38)
    • Boas práticas (29)
      • Gestão & Produtividade (1)
      • Metodologias Ágeis (6)
    • Cursos (52)
    • Dicas (105)
    • Front-End (92)
    • IA (1)
    • Linux (6)
    • NodeJS (4)
    • Post do Leitor (9)
    • Python (5)
    • Seo (12)
    • Tecnologia (30)
      • ITIL (1)
      • Padrões de Projeto (4)
    • Testes (2)

    VEJA TAMBÉM

    Cursos
    12 de fevereiro de 20166 Mins Read

    1000 livros gratuitos sobre programação!

    Olha que dica bacana! A pagina só com livros sobre programação é mantida no GitHub…

    30 APIs Gratuitas para desenvolvedores

    Facebook X (Twitter) Instagram LinkedIn

    Type above and press Enter to search. Press Esc to cancel.

    Vá para versão mobile