Đăng ký vps giá rẻ, tên miềndomain. Việc kiểm tra và mua tên miền giá rẻ, domain giá rẻ, hosting giá rẻ, máy chủ ảo giá rẻserver giá rẻ chỉ với 2 bước đơn giản. Giúp bạn tiên phong trong kinh doanh Online

Asp.net
 9ecva.com - 9e Chu Van An Forever : Asp.net
Tiêu đề Chủ đề: CAPTCHA Image Trả lời bài viếtGửi bài viết mới
Tác giả
Nội dung << Chủ đề trước | Chủ đề kế tiếp >>
DUCVINH83
Administrator
Administrator
Avatar
Không ngừng học hỏi !

Ngày gia nhập: 01/11/2005
Giới tính:
Đến từ: Vietnam
Trạng thái:
Bài viết: 365
Tiền: 738$
Địa chỉ e-mail: Gửi mail
Yahoo! IM: Yahoo! IM
Sinh nhật: 17/02/1983
Cảnh cáo: (0%)
Minus 1 warningCurrent warnlevel: 0%Add 1 warning
Ngày gửi: 13/11/2009 lúc 2:57 chiều | Đã khóa IP Trích dẫn DUCVINH83

Một CAPTCHA (ˈkæptʃə, đọc giống như "capture") là một loại kiểm thử dạng hỏi đáp được dùng trong máy tính để xác định xem người dùng có phải là con người hay không. "CAPTCHA" là một dạng sắp đặt chữ đầu của "Completely Automated...

Một CAPTCHA (ˈkæptʃə, đọc giống như "capture") là một loại kiểm thử dạng hỏi đáp được dùng trong máy tính để xác định xem người dùng có phải là con người hay không. "CAPTCHA" là một dạng sắp đặt chữ đầu của "Completely Automated Public Turing test to tell Computers and Humans Apart" (Phép thử Turing công cộng hoàn toàn tự động để phân biệt máy tính với người), được trường Đại học Carnegie Mellon giữ thương hiệu. Đây là một quá trình một máy tính (máy chủ) yêu cầu một người dùng hoàn tất một kiểm tra đơn giản mà máy tính có thể dễ dàng tạo ra và đánh giá, nhưng không thể tự giải nó được. Vì máy tính không thể giải quyết CAPTCHA, bất kỳ người dùng nào nhập vào lời giải đúng sẽ được xem là con người.

 

Bạn có thể bắt gặp những việc kiểm tra này khi đăng kí một email trực tuyến hoặc một tài khoản diễn đàn. Biểu mẫu đăng kí có thể có một ảnh chứa dòng chữ ngoằn nghèo như bạn thấy ở trên đây, và nó yêu cầu bạn phải gõ đúng vào ô nhập xác nhận.

Ý tưởng của việc làm này là nhằm ngăn ngừa các spammer sử dụng các web bot để tự động post dữ liệu vào form để tạo các tài khoản email (cho mục đích gửi spam). hoặc để đưa các feedback comment hay các bài viết mang mục đích spam. Dòng văn bản bên trong ảnh thường thường là nghuệch ngoạc để ngăn việc sử dụng các phần mềm OCR (chương trình đọc kí tự quang học) để hủy bỏ việc xử lý này. Hotmail, PayPal, Yahoo và nhiều các site đều sử dụng kỹ thuật này.

Bài viết này sẽ chỉ cho các bạn cách tạo những hình ảnh này và vận dụng nó vào trong trang web ASPX.

Cơ sở lý thuyết:

Khi bạn sử dụng kỹ thuật này vào trong trang web của mình thì hãy cân nhắc xem những đối tượng trong trang web của bạn có phù hợp với những người thị giác kém hoặc mù không. Điều này có thể gây ảnh hưởng đến khả năng sử dụng việc đưa CAPTCHA của bạn. PayPal cố gắng đã giải quyết vấn đề này bằng cách đưa thêm vào một link trỏ đên đoạn audio để đánh vần các dòng chữ trong ảnh đó.

Đoạn code ở đây chỉ sinh ra một hình ảnh. Nhưng nếu bạn có code để sinh ra một file audio thì bạn cũng có thể ghép lại vào một cách dễ dàng.

Viết mã:

Bạn tạo một ứng dụng web và thêm các file sau:
   - CaptchaImage.cs -  đối tượng này sẽ tạo ra các hình ảnh.
   - Default.aspx, Default.aspx.cs - a sample web form.
   - JpegImage.aspx, JpegImage.aspx.cs - trang web xuất ra file ảnh JPEG.

Chúng ta hãy xem xét mỗi thành phần và mục đích của nó:

CaptchaImage.cs

Đối tượng này tạo ra một hình ảnh với các tham số cho đoạn text hiển thị như kích thước(tùy chọn), font chữ. Phần mã quan trọng nhất trong đối tượng này là phương thức GenerateImage() sẽ chỉ ra dưới đây, nó sẽ tạo ra một ảnh dạng bitmap với độ rộng và chiều dài được chỉ ra. Phương thức này được gọi ra từ hàm khởi tạo CaptchaImage, để ảnh được sẵn sàng ngay khi bạn tạo ra một instance của đối tượng.

Để tạo ảnh, đầu tiên chúng ta fill cho background bằng cách chải cho nó thật tối (ảnh xuất hiện càng "bẩn" thì chương trình OCR càng khó đọc được nó).

Để tạo ra đoạn text vừa vặn trong ảnh, chúng ta bắt đầu với kích thước font ban đầu dựa trên kích thước chiều cao ảnh và sử dụng phương thức Graphics.MeasureString() để tìm ra được kích thước phù hợp để vẽ đoạn text. Nếu như đoạn text vượt quá các kích thước của ảnh thì chúng ta phải giảm font chữ xuống và thử đi thử lại cho đến khi phù hợp với kích thước có thể nhận ra được.

  1. // ==================================================== ================  
  2.     // Creates the bitmap image.  
  3.      // ==================================================== ================  
  4.     private void GenerateImage()  
  5.     {  
  6.        // Create a new 32-bit bitmap  image.  
  7.       Bitmap bitmap  = new Bitmap(  
  8.         this.width,  
  9.         this.height,  
  10.         PixelFormat. Format32bppArgb);  
  11.        // Create a graphics object for&nbs p;drawing.  
  12.       Graphics g =&n bsp;Graphics.FromImage(bitmap);  
  13.       g.SmoothingMode =&n bsp;SmoothingMode.AntiAlias;  
  14.       Rectangle rect  ;= new Rectangle(0, 0, this.width, this.height);  
  15.       // Fill in the background.  
  16.       HatchBrush hatchBru sh = new HatchBrush(  
  17.         HatchStyle.S mallConfetti,  
  18.         Color.LightG ray,  
  19.         Color.White) ;  
  20.       g.FillRectangle(hatchBru sh, rect);  
  21.       // Set up the text font.  
  22.       SizeF size; &n bsp;
  23.       float  fontSize = rect.Height + 1; & nbsp;
  24.       Font font; &nb sp;
  25.        // Adjust the font size until  the text fits within the image.   
  26.       do  
  27.       {  
  28.         fontSize--;& nbsp; 
  29.         font =& nbsp;new Font(  
  30.           this.familyName,  
  31.            fontSize,  
  32.            FontStyle.Bold);  
  33.         size =& nbsp;g.MeasureString(this.text, font);  
  34.       } while (size.Width > rect.Width);  
  35.       // Set up the text format.  
  36.       StringFormat format  = new StringFormat();  
  37.       format.Alignment =& nbsp;StringAlignment.Center;  
  38.       format.LineAlignment&nbs p;= StringAlignment.Center;  
  39.        // Create a path using the tex t and warp it randomly.   
  40.       GraphicsPath path&n bsp;= new GraphicsPath();  
  41.       path.AddString( &nb sp;
  42.         this.text,  
  43.         font.FontFam ily,  
  44.         (int) font.Style,  
  45.         font.Size,&n bsp;rect,  
  46.         format);&nbs p; 
  47.       float v = 4F;  
  48.       PointF[] points =  
  49.       {  
  50.         new PointF(  
  51.           this.random.Next(rect.Width) / v,  
  52.           this.random.Next(rect.Height) / v),  
  53.         new PointF(  
  54.            rect.Width - this.random.Next(rect.Width) / v,  
  55.           this.random.Next(rect.Height) / v),  
  56.         new PointF(  
  57.           this.random.Next(rect.Width) / v,  
  58.            rect.Height - this.random.Next(rect.Height) / v),  
  59.         new PointF(  
  60.            rect.Width - this.random.Next(rect.Width) / v,  
  61.            rect.Height - this.random.Next(rect.Height) / v)  
  62.       };  
  63.       Matrix matrix  = new Matrix();  
  64.       matrix.Translate(0F,&nbs p;0F);  
  65.       path.Warp(points, r ect, matrix, WarpMode.Perspective, 0F);   
  66.       // Draw the text.  
  67.       hatchBrush = new HatchBrush(  
  68.         HatchStyle.L argeConfetti,  
  69.         Color.LightG ray,  
  70.         Color.DarkGr ay);  
  71.       g.FillPath(hatchBrush,&n bsp;path);  
  72.       // Add some random noise.  
  73.       int  m = Math.Max(rect.Width, rect.Height);& nbsp; 
  74.       for (int i = 0; i < (int ) (rect.Width * rect.Height / 30F);  i++)  
  75.       {  
  76.         int x = this.random.Next(rect.Width);  
  77.         int y = this.random.Next(rect.Height);  
  78.         int w = this.random.Next(m / 50);  
  79.         int h = this.random.Next(m / 50);  
  80.         g.FillEllips e(hatchBrush, x, y, w, h);  
  81.       }  
  82.       // Clean up.  
  83.       font.Dispose(); &nb sp;
  84.       hatchBrush.Dispose();&nb sp; 
  85.       g.Dispose();  
  86.       // Set the image.  
  87.       this.image = bitmap;  
  88.     }  
< style="display: none;" name="code" ="c#">// ============================================================ ========     // Creates the bitmap image.     // ============================================================ ========     private void GenerateImage()     {       // Create a new 32-bit bitmap image.       Bitmap bitmap = new Bitmap(         this.width,         this.height,         PixelFormat.Format32bppArgb);       ; // Create a graphics object for drawing.       Graphics g = Graphics.FromImage(bitmap);       g.SmoothingMode = SmoothingMode.AntiAlias;       Rectangle rect = new Rectangle(0, 0, this.width, this.height);       // Fill in the background.       HatchBrush hatchBrush = new HatchBrush(         HatchStyle.SmallConfetti,      &nb sp;  Color.LightGray,         Color.White);       g.FillRectangle(hatchBrush, rect);       // Set up the text font.       SizeF size;       float fontSize = rect.Height + 1;       Font font;       // Adjust the font size until the text fits within the image.       do       {         fontSize--;         font = new Font(           ; this.familyName,            fontSize,         & nbsp; FontStyle.Bold);         size = g.MeasureString(this.text, font);       } while (size.Width > rect.Width);       // Set up the text format.       StringFormat format = new StringFormat();       format.Alignment = StringAlignment.Center;       format.LineAlignment = StringAlignment.Center;       // Create a path using the text and warp it randomly.       GraphicsPath path = new GraphicsPath();       path.AddString(         this.text,         font.FontFamily,         (int) font.Style,         font.Size, rect,         format);       float v = 4F;       PointF[] points =       {         new PointF(         &nb sp; this.random.Next(rect.Width) / v,           this.random.Next(rect.Height) / v),         new PointF(         &nb sp; rect.Width - this.random.Next(rect.Width) / v,           this.random.Next(rect.Height) / v),         new PointF(         &nb sp; this.random.Next(rect.Width) / v,           rect.Height - this.random.Next(rect.Height) / v),         new PointF(         &nb sp; rect.Width - this.random.Next(rect.Width) / v,           rect.Height - this.random.Next(rect.Height) / v)       };       Matrix matrix = new Matrix();       matrix.Translate(0F, 0F);       path.Warp(points, rect, matrix, WarpMode.Perspective, 0F);       // Draw the text.       hatchBrush = new HatchBrush(         HatchStyle.LargeConfetti,      &nb sp;  Color.LightGray,         Color.DarkGray);       g.FillPath(hatchBrush, path);       // Add some random noise.       int m = Math.Max(rect.Width, rect.Height);       for (int i = 0; i < (int) (rect.Width * rect.Height / 30F); i++)       {         int x = this.random.Next(rect.Width);       ;   int y = this.random.Next(rect.Height);     &nbs p;   int w = this.random.Next(m / 50);         int h = this.random.Next(m / 50);         g.FillEllipse(hatchBrush, x, y, w, h);       }       // Clean up.       font.Dispose();       hatchBrush.Dispose();       g.Dispose();       // Set the image.       this.image = bitmap;     }


Khi font được thiết lập, chúng ta định nghĩa phương thức GraphicsPath() để chuyển đổi đoạn text sang tập các đường thẳng và các đường cong. Đoạn text này có thể bị méo mó đi bằng cách dùng phương thức GraphicsPath.Warp() với một vài giá trị phát sinh ngẫu nhiên. Hiệu ứng giống như việc giữ tấm bìa cứng đánh dấu bởi các góc đối diện và làm no hơi bẻ xoắn đi một chút. Đường kẻ được vẽ ra trên tấm ảnh, rồi sử dụng bút chải cho nó xuất hiện "bẩn" đi chút.Để hoàn tất việc méo mó, vấy bẩn lên ảnh đó một số điểm ngẫu nhiên. Bạn có thể đã xem qua một số các hiệu ứng để cản trở các OCR, nhưng hãy nhớ rằng nên để nó có thể nhìn được, và một số người kém thị giác nữa.

Default.aspx.

Đây là một trang web mẫu đơn giản chỉ chứa một số các phần tử cơ bản, cụ thể là một thẻ <IMG> cho ảnh hiển thị, một textbox và một nút Submit.

  1. <form id="Default" method="post" runat="server">  
  2.      <img src="JpegImage.aspx"><br>  
  3.      <p>  
  4.        <strong>Enter the code shown above:</strong><br>  
  5.        <asp:TextBox id="CodeNumberTextBox" runat="server"></asp:TextBox>  
  6.        <asp:Button id="SubmitButton" runat="server" Text="Submit">  
  7.        </asp:Button><br>  
  8.      </p>  
  9.      <p>  
  10.        <em class="notice">  
  11.          (Note:  If you cannot read the number s in the above<br>  
  12.          image,  reload the page to generate a  new one.)</em>  
  13.      </p>  
  14.      <p><asp:Label id="MessageLabel" runat="server"></asp:Label></p>  
  15.    </form>  
< style="display: none;" name="code" =""> <form id="Default" method="post" runat="server">       <img src="JpegImage.aspx"><br>        <p>         <strong>Enter the code shown above:</strong><br>     &nb sp;   <asp:TextBox id="CodeNumberTextBox" runat="server"></asp:TextBox>    &n bsp;    <asp:Button id="SubmitButton" runat="server" Text="Submit">         ; </asp:Button><br>       ; </p>       <p>         <em class="notice">       &nbs p;   (Note: If you cannot read the numbers in the above<br>        & nbsp;  image, reload the page to generate a new one.)</em>       </p>       <p><asp:Label id="MessageLabel" runat="server"></asp:Label></p>      </form>


Để ý thuộc tính src của ảnh chỉ đến trang JpegImage.aspx.

Phần code cho trang Default.aspx đơn giản chỉ là việc sinh ra một chuỗi ngẫu nhiên cho ảnh và xác nhận tính hợp lệ của đoạn text này khi người dùng nhập vào ô text và nhấn vào nút Submit form. Khóa để lưu chuỗi text này là một đối tượng Session, bởi vì chúng ta còn phải truy cập đến trang JpegImage.aspx nữa.

  1. private void Page_Load(object sender, System.EventArgs e)  
  2.    {  
  3.      if (!this.IsPostBack)  
  4.         // Create a random code and st ore it in the Session object.   
  5.        this.Session["CaptchaImageText"] = GenerateRandomCode();  
  6.      else  
  7.      {  
  8.         // On a postback, check the us er input.  
  9.        if (this.CodeNumberTextBox.Text ==  
  10.          this.Session["CaptchaImageText"].ToString())  
  11.        {  
  12.          // Display an informational message.  
  13.          this.MessageLabel.CssClass = "info";  
  14.          this.MessageLabel.Text = "Correct!";  
  15.        }  
  16.        else  
  17.        {  
  18.          // Display an error message.  
  19.          this.MessageLabel.CssClass = "error";  
  20.          this.MessageLabel.Text = "ERROR: Incorrect, try again.";  
  21.           // Clear the input and create  a new random code.   
  22.          this.CodeNumberTextBox.Text = "";  
  23.          this.Session["CaptchaImageText"] = GenerateRandomCode();  
  24.        }  
  25.      }  
  26.    }  
< style="display: none;" name="code" ="c#"> private void Page_Load(object sender, System.EventArgs e)     {       if (!this.IsPostBack)       &nbs p; // Create a random code and store it in the Session object.         this.Session["CaptchaImageText"] = GenerateRandomCode();       else       {         // On a postback, check the user input.         if (this.CodeNumberTextBox.Text ==           this.Session["CaptchaImageText"].ToString())         {           // Display an informational message.         &n bsp; this.MessageLabel.CssClass = "info";         &nb sp; this.MessageLabel.Text = "Correct!";         }         else         {           // Display an error message.         &n bsp; this.MessageLabel.CssClass = "error";         &n bsp; this.MessageLabel.Text = "ERROR: Incorrect, try again.";         &n bsp; // Clear the input and create a new random code.           ; this.CodeNumberTextBox.Text = "";           this.Session["CaptchaImageText"] = GenerateRandomCode();       & nbsp; }       }     }

JpegImage.aspx

Trong trang này, chúng ta không cần đến thẻ HTML nào cả (những gì cần làm ở đây chỉ là đoạn mã được sinh ra bởi Visual Studio khi file được tạo ra). Thay vì viết mã HTML, đoạn mã sẽ sinh ra một ảnh JPEG.

Trong phần mã , chúng ta đầu tiên tạo ra đối tượng Captcha, sử dụng ngay đoạn text lấy về từ đối tượng Session và tạo ra ảnh bitmap cho chúng ta.

  1. private void Page_Load(object sender, System.EventArgs e)  
  2.    {  
  3.       // Create a CAPTCHA image using&nbs p;the text stored in the Session&nb sp;object.  
  4.      CaptchaImage ci =&nb sp;new CaptchaImage(  
  5.        this.Session["CaptchaImageText"].ToString(),  
  6.        200, 50,  ;"Century Schoolbook");  
  7.       // Change the response headers to&n bsp;output a JPEG image.   
  8.      this.Response.Clear();  
  9.      this.Response.ContentType = "image/jpeg";  
  10.       // Write the image to the resp onse stream in JPEG format.   
  11.      ci.Image.Save(this.Response.OutputStream, ImageFormat.Jpeg);  
  12.       // Dispose of the CAPTCHA image&nbs p;object.  
  13.      ci.Dispose();  
  14.    }  
< style="display: none;" name="code" ="c#"> private void Page_Load(object sender, System.EventArgs e)     {       // Create a CAPTCHA image using the text stored in the Session object.       CaptchaImage ci = new CaptchaImage(         this.Session["CaptchaImageText"].ToString(),         200, 50, "Century Schoolbook");       // Change the response headers to output a JPEG image.       this.Response.Clear();       this.Response.ContentType = "image/jpeg";       // Write the image to the response stream in JPEG format.       ci.Image.Save(this.Response.OutputStream, ImageFormat.Jpeg);       // Dispose of the CAPTCHA image object.       ci.Dispose();     }


Tiếp đến chúng ta chỉnh sửa phần header của HTTP response để thiết lập Content-type thành "image/jpeg" để trình duyệt máy người dùng sẽ biết luồng file đưa đến là định dạng JPEG. May mắn là phương thức Save của đối tượng Bitmap làm cho điều này thật đơn giản. Bất kể là định dạng file ảnh được hỗ trợ khác cũng sử dụng cách thiết lập tương ứng trong phần Content-type header này.

Bước cuối cùng là để lấy ra hình ảnh bitmap từ  CaptchaImage.Image và ghi nó vào luồng ra HTTP response theo định dạng JPEG.

Bởi vì lớp CaptchaImage chứa đối tượng Bitmap, và các bitmap vận dụng mã không quản, nên phương thức Dispose được thực hiện. Điều này cho phép các mã nguồn không quản được giải phóng bất cứ khi nào CaptchaImage bị hủy.

 

[HaiPhong-Aptech]



__________________

YM: DUCVINH83
0912 822334


Lên trên Xem DUCVINH83's Thông tin cá nhân Tìm những bài viết khác của DUCVINH83 Ghé thăm DUCVINH83's Trang chủ
 

Nếu bạn muốn trả lời thì trước tiên bạn phải đăng nhập
Nếu chưa đăng ký thì bạn hãy đăng ký

  Trả lời bài viếtGửi bài viết mới
Xem trang in Xem trang in

Di chuyển nhanh
Bạn không thể tạo đề tài mới
Bạn không thể trả lời bài viết
Bạn không thể xoá bài viết bạn đã gưi
Bạn không thể sửa bài viết bạn đã gửi
Bạn không thể tạo bình chọn
Bạn không thể bình chọn



Trang này được tạo ra trong 0.3110 giây.
cheap jordans for salecheap jordans for salecheap jordans for salecheap jordans for salecheap jordans for salecheap jordans for salecheap jordans for salecheap jordans for salecheap jordans for salesac longchamp pas chergucci outlet

baomang.net  9ecva.com © 2007 - Phát triển bởi Trịnh Đức Vinh