Arsip Blog

Membuat Anti Spam di ASP.net — 2

Tentang anti spam ini, pernah saya tulis disini. Tulisan ini hanya merupakan modifikasi dari tulisan pertama. Di tulisan sebelumnya, captcha image di generate di file webpage (aspx). Setelah membaca berbagai literatur, menggunakan file aspx hanya untuk membuat image kecil sangatlah tidak efisien dan memerlukan resource yang besar. Seperti kita ketahui, file aspx menggunakan webcontrol untuk menampilkan suatu page, sedangkan untuk menampilkan image catcha, webcontrol ini tidak diperlukan. Karena itu,  saya merubah metode menampilkan image captcha menggunakan file handler.

Read the rest of this entry

Iklan

Membuat Anti Spam di ASP.NET

Internet memberikan kebebasan informasi, kemudahan akses dan mempengaruhi kehidupan manusia. Bersamaan dengan kebebasan aliran informasi muncullah berbagai SPAM, blog SPAM, newsgroups SPAM, email SPAM dan lainnya. Untuk menghadang laju spam ini diciptakanlah CAPTCHA. CAPTCHA merupakan program yang digunakan untuk memastikan bahwa jawaban diberikan oleh manusia bukan dari program komputer.

Tehnik captcha atau anti spam yang umum digunakan adalah menggunakan gambar. Dengan gambar maka spam tidak bisa membaca karakter yang ada pada gambar. Program berikut adalah contoh membuat anti spam menggunakan gambar. Program ini originalnya menggunakan bahasa C# dan dimuat di Code Project , dan aku modifikasi menjadi VB.NET
Secara garis besar, alur programnya adalah sebagai berikut.

  • Buat string acak dan simpan dalam session.
  • Ubah string acak ini dalam bentuk gambar.
  • Tampilkan gambar
  • Cek input yang dilakukan user.

Membuat String acak

Private Function GenerateRandomCode() As String
   Dim builder As New StringBuilder()
   Dim random As New Random()
   Dim ch As Char
   Dim i As Integer
   Dim kode As Char
   For i = 0 To 5
      kode = Convert.ToChar(Convert.ToInt32(3 * random.NextDouble() + 48))
      Select Case kode
         Case "0"
            ch = Convert.ToChar(Convert.ToInt32((25 * random.NextDouble() + 97)))
         Case "1"
            ch = Convert.ToChar(Convert.ToInt32((25 * random.NextDouble() + 65)))
         Case Else
            ch = Convert.ToChar(Convert.ToInt32((9 * random.NextDouble() + 48)))
      End Select
   builder.Append(ch)
   Next
   Return builder.ToString()
End Function

Mengubah String Menjadi Gambar

Private Sub GenerateImage()
   Dim bitmap As Bitmap = New Bitmap(Me.width, Me.height, _
   PixelFormat.Format32bppPArgb)

   'buat bingkai
   Dim g As Graphics = Graphics.FromImage(bitmap)
   g.SmoothingMode = SmoothingMode.AntiAlias
   Dim r As Rectangle = New Rectangle(0, 0, Me.width, Me.height)

   'buat background
   Dim hb As HatchBrush = New HatchBrush(HatchStyle.SmallConfetti, _
     Color.LightGray, Color.White)
   g.FillRectangle(hb, r)

   'set teks font
   Dim size As SizeF
   Dim ukuranFont As Single = r.Height + 1
   Dim nmFont As Font

   'atur ukuran font agar tepat sesuai dg box image
   Do
      ukuranFont -= 1
      nmFont = New Font(Me.fontName, ukuranFont, FontStyle.Bold)
      size = g.MeasureString(Me.text, nmFont)
   Loop While size.Width > r.Width

   'format teks
   Dim format As StringFormat = New StringFormat()
   format.Alignment = StringAlignment.Center
   format.LineAlignment = StringAlignment.Center

   Dim path As GraphicsPath = New GraphicsPath()
   path.AddString(Me.text, nmFont.FontFamily, CType(nmFont.Style, Integer), _
     nmFont.Size, r, format)
   Dim v As Single = 4.0F
   Dim poins() As PointF = {New PointF(Me.acak.Next(r.Width) / v, Me.acak.Next(r.Height) / v), _
     New PointF(r.Width - Me.acak.Next(r.Width) / v, Me.acak.Next(r.Height) / v), _
     New PointF(Me.acak.Next(r.Width) / v, r.Height - Me.acak.Next(r.Height) / v), _
     New PointF(r.Width - Me.acak.Next(r.Width) / v, r.Height - Me.acak.Next(r.Height) / v)}
   Dim matrik As Matrix = New Matrix()
   matrik.Translate(0, 0)
   path.Warp(poins, r, matrik, WarpMode.Perspective, 0)

   'gambar teks
   hb = New HatchBrush(HatchStyle.ZigZag, Color.LightGray, Color.Blue)
   g.FillPath(hb, path)

   'bintik2 acak
   Dim m As Integer = Math.Max(r.Width, r.Height)
   For i As Integer = 0 To (r.Width * r.Height / 30.0F)
      Dim x As Integer = Me.acak.Next(r.Width)
      Dim y As Integer = Me.acak.Next(r.Height)
      Dim w As Integer = Me.acak.Next(m / 50)
      Dim h As Integer = Me.acak.Next(m / 50)
      g.FillEllipse(hb, x, y, w, h)
   Next

   'bersih-bersih
   nmFont.Dispose()
   hb.Dispose()
   g.Dispose()
   Me.image = bitmap
End Sub

Menampilkan Gambar.

Buat 2 file aspx. Gambar yang terbentuk ditampilkan di file aspx kedua dengan menyisipkan kode berikut di method Page Load

Dim gbAs As AntiSpam = New AntiSpam(Session("KODESPAM").ToString(), 200, 50)
Me.Response.Clear()
Me.Response.ContentType = "image/jpeg"
gbAs.image.Save(Me.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg)
gbAs.Dispose()

Dari file aspx pertama, panggil file aspx kedua di ImageWebControl

Image1.ImageUrl = "default2.aspx"

Untuk contoh kode vb.NET selengkapnya dapat di download disini.
Kode original menggunakan C# dapat di download disini

Happy Coding…