Anti robots en ASP.NET

Your ads will be inserted here by

Easy Plugin for AdSense.

Please go to the plugin admin page to
Paste your ad code OR
Suppress this ad slot.

Con este truco podrás crear rápidamente un sistema de código de seguridad para tu página web.

Para crear un código de seguridad seguiremos los siguientes pasos:

Tenemos que agregar en el formulario que deseamos insertar el código de seguridad los siguientes controles:

  • Una imagen (dónde su scr será /AntiRobots.aspx)
  • Un input de tipo texto, con un id= type= frm_Codigo_Seguridad

En el código VB de la página del registro declararemos una variable llamada bAntiBots

#Region «Members»
Dim bAntiBots As Boolean = False
#End Region

En el Page_Load:

If Not IsPostBack Then
Session(«AntiBots») = GenerateRandomCode()
Else
‘Comprobamos el código antibots
If frm_Codigo_Seguridad.Value = Session(«AntiBots»).ToString() Then
bAntiBots = True
Else
bAntiBots = False
Me.Session(«AntiBots») = GenerateRandomCode()
End If
End If

Tenemos que crear la función GenerateRandomCode para generar un código de seguridad al azar

#Region «GenerateRandomCode»

Private Function GenerateRandomCode() As String
Dim random As New Random
Dim s As String = «»
Dim i As Int32 = 0
Dim iChr As Int32

While (i <; 6)
iChr = random.Next(48, 90)
While iChr >; 57 And iChr <; 65
iChr = random.Next(48, 90)
End While
s = String.Concat(s, Chr(iChr).ToString())
i = i + 1
End While
Return s
End Function
#End Region

Para seguir, nos faltará crear la clase encargada de crear, manipular y deformar el código de seguridad generado en imagen

Imports System
Imports System.Drawing
Imports System.Drawing.Drawing2D
Imports System.Drawing.Imaging
Imports System.Drawing.Text

Public Class ImagenAntiBots

Dim m_text As String
Dim m_width As Int32
Dim m_height As Int32
Dim m_familyName As String
Dim m_image As Bitmap
Dim m_random As New Random
#Region «Propiedades de lectura»

Public ReadOnly Property Text() As String
Get
Return m_text
End Get
End Property

Public ReadOnly Property Width() As Int32
Get
Return m_width
End Get
End Property

Public ReadOnly Property Height() As Int32
Get
Return m_height
End Get
End Property

Public ReadOnly Property Image() As Bitmap
Get
Return m_image
End Get
End Property

#End Region

Public Sub New(ByVal s As String, ByVal width As Int32, ByVal height As Int32)
Me.m_text = s
Me.SetDimensions(width, height)
Me.GenerateImage()
End Sub

Public Sub New(ByVal s As String, ByVal width As Int32, ByVal height As Int32, ByVal familyName As String)

Me.m_text = s
Me.SetDimensions(width, height)
Me.SetFamilyName(familyName)
Me.GenerateImage()
End Sub

Private Sub SetDimensions(ByVal width As Int32, ByVal height As Int32)
If width <;= 0 Then
Throw New ArgumentOutOfRangeException(«width», width, «Argument out of range, must be greater than zero.»)
End If
If (height <;= 0) Then
Throw New ArgumentOutOfRangeException(«height», height, «Argument out of range, must be greater than zero.»)
End If

Me.m_width = width
Me.m_height = height

Your ads will be inserted here by

Easy Plugin for AdSense.

Please go to the plugin admin page to
Paste your ad code OR
Suppress this ad slot.

End Sub

Private Sub SetFamilyName(ByVal familyName As String)
Try
Dim font As Font = New Font(familyName, 12.0F)
Me.m_familyName = familyName
font.Dispose()

Catch ex As Exception
Me.m_familyName = System.Drawing.FontFamily.GenericSerif.Name
End Try
End Sub

Private Sub GenerateImage()
Dim bitmap As New Bitmap(Me.m_width, Me.m_height, PixelFormat.Format32bppArgb)

‘Creamos objeto grafico
Dim g As Graphics = Graphics.FromImage(bitmap)
g.SmoothingMode = SmoothingMode.AntiAlias
Dim rect As New RectangleF(0, 0, Me.m_width, Me.m_height)

‘Rellenamos el fondo
Dim hatchBrush As New HatchBrush(HatchStyle.SmallConfetti, Color.LightGray, Color.White)
g.FillRectangle(hatchBrush, rect)

‘Establecemos la fuente
Dim size As SizeF
Dim fontSize As Single = rect.Height + 1
Dim font As Font
‘Ajusta el tamaño de la fuente

Do
fontSize = fontSize – 1
font = New Font(Me.m_familyName, fontSize, FontStyle.Bold)
size = g.MeasureString(Me.m_text, font)
Loop While (size.Width >; rect.Width)

‘Establece el formato de texto
Dim format As New StringFormat
format.Alignment = StringAlignment.Center
format.LineAlignment = StringAlignment.Center

Dim path As New GraphicsPath
path.AddString(Me.m_text, font.FontFamily, CType(font.Style, Int32), font.Size, rect, format)
Dim v As Single = 4.0F

Dim points As System.Drawing.PointF() = { _
New System.Drawing.PointF(m_random.Next(CType(rect.Width, Integer)) / v, m_random.Next(CType(rect.Height, Integer)) / v), _
New System.Drawing.PointF(rect.Width – m_random.Next(CType(rect.Width, Integer)) / v, m_random.Next(CType(rect.Height, Integer)) / v), _
New System.Drawing.PointF(m_random.Next(CType(rect.Width, Integer)) / v, rect.Height – m_random.Next(CType(rect.Height, Integer)) / v), _
New System.Drawing.PointF(rect.Width – m_random.Next(CType(rect.Width, Integer)) / v, rect.Height – m_random.Next(CType(rect.Height, Integer)) / v)}

Dim matrix As New Matrix
matrix.Translate(1, 3)

‘Deformamos la imagen
path.Warp(points, rect, matrix, 0)

‘Dibuja el texto
hatchBrush = New HatchBrush(HatchStyle.OutlinedDiamond, Color.Orange, Color.BlueViolet)
g.FillPath(hatchBrush, path)
‘Añade efectos
Dim m As Int32 = Math.Max(CType(rect.Width, Integer), CType(rect.Height, Integer))
Dim i As Int32 = 0
While i <; CType((rect.Width * rect.Height / 30.0F), Int32)
Dim x As Int32 = m_random.Next(CType(rect.Width, Integer))
Dim y As Int32 = m_random.Next(CType(rect.Height, Integer))
Dim w As Int32 = m_random.Next(CType(m / 50, Integer))
Dim h As Int32 = m_random.Next(CType(m / 50, Integer))
g.FillEllipse(hatchBrush, x, y, w, h)
i = i + 1
End While

font.Dispose()
hatchBrush.Dispose()
g.Dispose()

‘Establece la imagen
Me.m_image = bitmap

End Sub

End Class

Ahora en el proyecto crearemos la página que apunta nuestra imagen (el primer control que hemos agregado en el proyecto, y en el Page_Load pondremos este código:

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
‘Creamos una imagen creando el texto guardado en la sesion
Dim ab As New ImagenAntiBots(Session(«AntiBots»).ToString(), 200, 50, «Arial»)

‘Cambiamos la respuesta al cliente a tipo «imagen/jpeg»
Me.Response.Clear()
Me.Response.ContentType = «image/jpeg»

‘Salvamos la imagen en el Response
ab.Image.Save(Me.Response.OutputStream, ImageFormat.Jpeg)
End Sub

Y para terminar, en el formulario del registro, dónde hemos agregado los controles, en el botón del submit, utilizar esta condición:

If bAntiBots Then
‘ Creamos el registro
Else
‘ El código de seguridad no está bien colocado
End if

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.

ACEPTAR
Aviso de cookies