สวัสดีครับ

วันนี้ผมได้มานำเสนอเทคนิคเล็กๆน้อยๆเกี่ยวกับการ render ข้อมูลลงเว็บเพจ asp.net โดยข้อมูลจะถูกแยก ออกเป็นสองส่วน โดยอิงทฤษฎีของ MVC นั่นคือ ส่วนของ View และ Controller ที่ควบคุมการ render ลงบน view โดยที่ ผมจะแปลงแนวคิดนี้ลงบน asp.net ซึ่งไม่ใช่ asp.net mvc อย่างง่ายดังนี้ครับ

  • สร้างไฟล์ตัวอย่างสำหรับการ render ขึ้นมาชื่อ Default.aspx โดยที่มีไฟล์ Default.aspx.cs เป็น ไฟล์ code-behind ของหน้า aspx โดยที่ Default.aspx.cs ควบคุมข้อมูลที่จะสำหรับ render ขึ้นบนหน้าเว็บเพจ โดยที่ข้อมูลสมมุตินี้ ผมได้สร้างเป็น List ของ string แสดงรายชื่อบุคคลต่างๆ ดัง code ครับ


   1:  public partial class _Default : System.Web.UI.Page 
   2:  { 
   3:      public List<string> LstData { get; set; } // Property สำหรับการ render หน้า view
   4:   
   5:      // กำหนดค่าต่างๆ บน method OnInit สำหรับการ เรียกหน้าเพจครั้งแรก
   6:      protected override void OnInit(EventArgs e)
   7:      {
   8:          base.OnInit(e);
   9:   
  10:         this.LstData = new List<string>() // สร้างข้อมูลสมมุติ 4 รายชื่อ
  11:         {
  12:             "Mr. A",
  13:             "Mr. B",
  14:             "Mr. C",
  15:             "Mr. D"
  16:         };
  17:      }
  18:      protected void Page_Load(object sender, EventArgs e)
  19:      {
  20:   
  21:      }
  22:  }


  • ที่หน้า Default.aspx ที่เป็น view สำหรับ render ทำการวนลูบดึงข้อมูลจาก Property LstData


   1:  <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
   2:   
   3:  DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   4:   
   5:  <html xmlns="http://www.w3.org/1999/xhtml">
   6:  <head runat="server">
   7:      <title>title>
   8:  head>
   9:  <body>
  10:      <form id="form1" runat="server">
  11:      <div>       
  12:          
  13:          <h2>List Of Data is hereh2>
  14:          
  15:          <ul>
  16:          <% foreach (var item in this.LstData)
  17:             { %>
  18:                    <li><%=item %>li>
  19:          <%} %>
  20:          ul>
  21:                 
  22:          
  23:          div>
  24:      form>
  25:  body>
  26:  html>


  • เมื่อรันบน browser จะได้หน้าตาดังรูปครับ




การ ทำ Image Verifier ใน ASP.NET MVC

posted on 06 Apr 2010 12:22 by thepok  in Programming

พอดีวันนี้ไปเจอ code Image Verifier หรือ CAPTCHA ที่เว็บ codeproject.com ซึ่งมีประโยชน์มากในการทดสอบผู้ที่กรอกแบบฟอร์มต่างๆ ในเว็บไซต์ว่าเป็นมนุษย์หรือไม่ เพื่อที่สำหรับกัน bot หรือ โปรแกรมอัตโนมัติต่างๆมา bomb หรือ ยิง เว็บไซต์เรานะครับ

ใน codeproject.com ได้อธิบายขั้นตอนการทำเกี่ยวกับ CAPTCHA หรือ Image Verifier นี้ ในรูปแบบของเว็บไซต์ีที่ถูกเขียนขึ้นจาก ASP.NET ธรรมดานะครับ หรือเขียนจากเว็บฟอร์ม ซึ่ง จะเขียนในลักษณะของ user control สามารถเข้าไปดูได้ที่ http://www.codeproject.com/KB/aspnet/ImageVerifier.aspx ซึ่งวันนี้ ผมจะแนะนำไอเดียในการประยุกต์ใช้งานกับเพื่อนๆที่กำลังเล่น ASP.NET MVC อยู่เพื่อที่จะได้ไอเดียใหม่ๆในการประยุกต์ใช้งานมากยิ่งขึ้นครับ

เรา มาเริ่มกันเลยดีกว่า

 

  • สร้าง ImageResult สำหรับเก็บรูปภาพซึ่งถูก render จากตัว generater หรือตัว random รูปภาพสำหรับทดสอบมนุุษย์นั่นเอง (จะกล่าวในข้อต่อไป) 
   1:      public class ImageResult : ActionResult
   2:      {
   3:          public Image Image { get; set; }
   4:   
   5:          public override void ExecuteResult(ControllerContext context)
   6:          {
   7:              context.HttpContext.Response.Clear();
   8:              context.HttpContext.Response.ContentType = "image/Jpeg";
   9:              Image.Save(context.HttpContext.Response.OutputStream, ImageFormat.Jpeg);
  10:          }
  11:   
  12:      }

 

  • สร้าง ImageController สำหรับ generate รูปภาพ และบันทึก รหัสลับลงไปใน Cache โดยจะทำการตรวจเช็คอีกที โดยรหัสลับนี้จะมี index ประจำตัวของรหัสลับโดยสร้างจาก Guid (Globally Unique Identifier) ซึ่งเป็นชุดตัวเลขผสมตัวอักษรไม่ซ้ำกันขนาด16 bytes และโดย default ของ Controller แล้้วให้เรียกใช้งานที่ Action ชื่อ Index ครับ

   1:  public class ImageController : Controller
   2:   {  
   3:   
   4:       public ActionResult Index(string uid)
   5:       {
   6:           Bitmap bmp = new Bitmap(180, 40);
   7:           Graphics g = Graphics.FromImage(bmp);
   8:           string randString = GetRandomText(); // สร้างชุดรหัสลับขึ้นมาด้วยการ random
   9:        
  10:               this.HttpContext.Cache.Add(uid, randString, null, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(5), System.Web.Caching.CacheItemPriority.Normal, null); // เก็บลง Cache สำหรับการตรวจเช็คโดยการ submit form
  11:   
  12:           // สร้างลวดลายสำหรับกันโปรแกรมอัตโนมัติ
  13:           g.FillRectangle(Brushes.WhiteSmoke, 0, 0, 180, 40);
  14:           g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.Default;
  15:           g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
  16:   
  17:           Random rand = new Random();
  18:           for (int i = 0; i < randString.Length; i++)
  19:           {
  20:               Font drawFont = new Font("Arial", 18, FontStyle.Italic | (rand.Next() % 2 == 0 ? FontStyle.Bold : FontStyle.Regular));
  21:               g.DrawString(randString.Substring(i, 1), drawFont, Brushes.Black, i * 35 + 10, rand.Next() % 12);
  22:           }
  23:   
  24:           Point[] pt = new Point[15];
  25:           for (int i = 0; i < 15; i++)
  26:           {
  27:               pt[i] = new Point(rand.Next() % 180, rand.Next() % 35);
  28:               g.DrawEllipse(Pens.LightSteelBlue, pt[i].X, pt[i].Y, rand.Next() % 30 + 1, rand.Next() % 30 + 1);
  29:           }
  30:                  
  31:           // returm Result ออกมาเป็นชนิดข้อมูลแบบรูปภาพครับ
  32:           return new ImageResult { Image = bmp };
  33:       }
  34:   
  35:       // เป็น method สำหรับ random รหัสลับ
  36:       private string GetRandomText()
  37:       {
  38:           string uniqueID = Guid.NewGuid().ToString();
  39:           string randString = "";
  40:           for (int i = 0, j = 0; i < uniqueID.Length && j < 5; i++)
  41:           {
  42:               char l_ch = uniqueID.ToCharArray()[i];
  43:               if ((l_ch >= 'A' && l_ch <= 'Z') || (l_ch >= 'a' && l_ch <= 'z') || (l_ch >= '0' && l_ch <= '9'))
  44:               {
  45:                   randString += l_ch;
  46:                   j++;
  47:               }
  48:           }
  49:           return randString;
  50:       }
  51:   
  52:   }

 

 

วิธีใช้งาน

ในหัวข้อนี้จะเป็น วิธีการใช้งานนะครับ หลักการก็คือเราจะเขียน tag HTML เพื่อเรียกชื่อไฟล์รูปธรรมดาๆ แต่ไฟล์รูปนั้นจะเป็น url ของ ImageController ครับ เนื่องจาก ImageController จะ return ImageResult ออกมาซึ่งจะได้เป็นรูปที่ random รหัสลับออกมาแล้ว ลองมาดูตัวอย่างกันเลยครับ

  • อันดับแรก สร้าง Home Controller และ เขียน code สร้าง Guid กำกับ รูปที่ถูกสร้างขึ้น (สำหรับการตรวจเช็ค) ซึ่งในที่นี้ผมจะแสดงเฉพาะ action Index ของ Home Controller นะครับ
   1:  public ActionResult Index()
   2:        {
   3:            string guid = Guid.NewGuid().ToString(); // สร้าง Guid
   4:            ViewData["guidimageverify"] = guid; // เก็บ guid ลง ViewData สำหรับแสดงผลที่ View
   5:            return View();
   6:        }

  • ต่อไปเราจะเอา Guid จาก ViewData มาแสดงลงในรูปแบบของ image html tag เพื่อแสดงรูปครับ
   1:  <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
   2:  <asp:Content ID="indexTitle" ContentPlaceHolderID="TitleContent" runat="server">  Home Page</asp:Content>
   3:  <asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
   4:   
   5:  <%using (Html.BeginForm()){ %>
   6:   
   7:      <%=String.Format("<img alt=\"ImageVerifier\" src=\"Image?uid={0}\">", ViewData["guidimageverify"])%><br />
   8:      <%=Html.Hidden("uidImageVerify",ViewData["guidimageverify"]) %><br />
   9:      <%=Html.TextBox("txtImageVerify") %><br /><input type="submit" value="Submit"/>
  10:   
  11:  <%} %>
  12:   
  13:  </asp:Content
  • ทีนี้เราก็จะได้รูปที่ถูก random และเก็บลง Cache โดยมี Guid ดังรูปครับ

 

 

 

การเช็ครหัสลับ
การเช็ครหัสทำ ได้ง่ายมากครับโดยการสร้าง Action Index โดยกำกับ ด้วย [AcceptVerbs(HttpVerbs.Post)] คือ เป็น Action หลังจากการ Post Form จากหน้า View Index ครับ โดยมีการเช็คกับ Cache ด้วย guid และ ค่า จาก textbox ครับลองดูตัวอย่างตามนี้เลยครับ

   1:  [AcceptVerbs(HttpVerbs.Post)]
   2:          public ActionResult Index(string uidImageVerify, string txtImageVerify)
   3:          {
   4:              string value = string.Format("{0}", this.HttpContext.Cache[uidImageVerify]); // เรียกค่ารหัสลับจาก Cache มาเพื่อเช็คกับ textbox
   5:   
   6:              if (value == txtImageVerify)
   7:              {
   8:                  return View("Success"); // ถ้ารหัสถูกต้อง ไปที่ view ชื่อ Success
   9:              }
  10:              
  11:              return RedirectToAction("Index"); // รหัสลับไม่ถูกต้อง กลับไปที่หน้า index เพื่อกรอกรหัสใหม่
  12:          }

 

 

จบแล้วครับ เป็นไงบ้างครับ พอที่จะได้ไอเดียในการกันโปรแกรมอัตโนมัติต่างๆ หรือ bot แล้วนะครับ เพื่อนๆลองนำไอเดียนี้ไปใช้ได้หรืออาจจะมีวิธีอื่นๆ นอกจากเก็บรหัสลง Cache เช่นเพิ่ม Algorithm หรือการ encryption ต่างๆ เพื่อเพิ่มความปลอดภัยก็ได้นะครับ : ) 

edit @ 6 Apr 2010 15:02:57 by oPoKo

[Tag] ความจริง 30 ข้อ

posted on 05 Apr 2010 20:19 by thepok

หาเรื่องอัพบล็อคอีกแล้ว มาเริ่มกันเลยดีกว่า

 1. แสดงรูปประจำตัวเอง 1 รูปก่อนเลย (แค่ด้านข้างก็หล่อแล้ว - -")

 

มาเริ่มเปิดเผยตัวจริงกันดีกว่า

2. ผมเป็นคนขี้อาย แต่ถ้าได้แสดงความสามารถพิเศษของตัวเองอะไรซักอย่าง เช่น การเล่นดนตรี การ present งาน อะไรต่างๆ ความขี้อายนั้นจะหายไป

3. คนที่ไม่สนิท จะมองว่าผมเป็นคนเงียบๆ ดุๆ  แต่ถ้าได้รู้จักจะไม่ใช่แบบนั้นเลย

4. แต่ถ้าได้สนิท และรู้จักแล้ว จะเริ่มมองว่าเป็นคนกวนๆ  (ซะงั้น)

5. ขี้เกียจบ้างเป็นบางเวลา

6. ขยันบ้าง แล้วแต่อารมณ์

7. ง่ายๆ สบายๆ  ไม่เรื่องมาก  กินอะไรก็ได้ ง่ายๆ (ทำเสียงแบบโน๊ตอุดม)

8. เป็นคนขี้หนาว อย่าให้ได้เจอความหนาวเชียว ความขี้เกียจพุ่งขึ้น 50%

9. งานอดิเรกคือเล่นคอมพิวเตอร์ ดูนู่นดูนี่ ในเว็บไซต์ไปเรื่อย

10. เป็นคนเปิดเผย  ไม่ใช่คนที่มีความลับเยอะ  ถามมา ก็ตอบไป ถ้าไม่ถามก็ไม่รู้จะบอกทำไม 

11. เป็นคนติดแฟน  ติดหนึบด้วย

12.  ติดแฟนยังไม่พอ ขี้หึงขั้นเทพ(แก้ไงก็ไม่หาย-*-)

13. ข้อ 11+12       ไม่แคร์สื่อ ไม่แคร์ใคร  แคร์คนเดียวคือแฟน

14. เวลาว่างก็ฟังเพลงบ้างไรบ้าง แนวเบาๆบ้าง แหกปากบ้าง แล้วแต่อารมณ์

15. กางเกงยีนต์ ใส่มากกว่า 1 ครั้ง ก่อนที่จะเอาไปซัก

16. ชอบอ่านการ์ตูนเป็นชีวิตจิตใจ หลายเรื่องที่ติดตามมาตลอด จากสมัยเด็กจนถึงปัจจุบัน

17. จบวิศวะ คอมพิวเตอร์ เกรียนนิยม เอ๊ย เกียรตินิยมอันดับหนึ่ง จากมรังสิต

18. ปัจจุบันทำงานเป็นโปรแกรมเมอร์ เป็นอาชีพ ที่เขียนไว้ เมื่อตอนอยู่ประถมว่า โตขึ้นอยากเป็นอะไร

19. แต่ตอนนี้กำลังอยู่ในช่วงสอบปโท

20.  ถ้าสอบติด ก็ ไม่แน่ .... อาจจะเป็นคนที่สร้างโปรแกรมเมอร์ในอนาคตก็ได้ (อาจารย์มหาลัย)

21. สืบเนื่องมาจากข้อข้างบน  โดยนิสัย เป็นคนชอบสอนคนอื่่น ถ่ายทอดความรู้ที่ตัวเองมี โดยไม่หวังผลตอบแทน

22.  ถ้าเห็นคนอื่นมีความรู้ที่เหมือนเราที่มี หลังจากที่เราได้สอนได้ถ่ายทอดให้ จะมีความสุข

23. ลืมไป ! จากข้อ 11 และ 12 เป็นคนง้อแฟน และเกรงใจเป็นอย่างยิ่่ง (อะ ทำหน้าไม่เชื่ออีก)

24. บางทีก็เป็นคนคิดมากนะ

25. พอคิดมากก็จะจิตหลอน มาตามลำดับ  - -*

26. บางทีของราคาถูก จะมองว่าแพง แต่ของที่เราชอบ แต่มีราคาแพงๆ ดัน ไม่คิดว่ามันแพง และก็ซื้อมันมาใช้ซะงั้น

27. เป็นคนเข้ากับคนอื่นได้ดี เพื่อนเยอะแยะ สมัยมหาลัย เดินไปไหนที่ไหนมีแต่คนรู้จัก

28. เคยเป็นนักดนตรีมาก่อน แต่จบออกมาแล้ว ก็ไม่ได้ทำอาชีพนักดนตรี

29. เพิ่งมาสังเกต แต่เพลงส่วนใหญ่ที่ฟังบ่อยๆ คนร้องเป็นผู้ชายทั้งนั้นเลย

30. ข้อนี้ขอขอบคุณที่อ่านจนจบละกัน

edit @ 6 Apr 2010 09:34:56 by oPoKo

edit @ 6 Apr 2010 12:30:40 by oPoKo