Generico

Un semplice CAPTCHA per Asp.Net

Per proteggere un form asp.net in modo che possa essere inviato solo se c’è un “umano” e blocchi così gli script automatici si usano delle tecniche chiamate di “CAPTCHA” termine difficile per dire che deve essere inserita un’informazione che richiede un minimo di “comprensione”. Questa “domanda”, per complicare un po’ la vita ad uno script, dovrebbe essere mostrata nella pagina come immagine e non come testo.

Alla ricerca della soluzione più sem plice possibile ho trovato questa semplice strategia:

1-nel Page_Load se non è un postback creo una qualche “scritta” e salvo nel ViewState il “risultato previsto” (verificate che sia abilitata la cifratura del ViewState)

string _domanda = "testo da mostrare";
ViewState["risultato"] = _risultato;

2-ovviamente dop il PostBack recupero il valore

if (ViewState["risultato"] != null)
 _risultato = (string)ViewState["risultato"];

3-alla fine del Page_Load devo mostrare nella pagina la “domanda”, non volenod generar eun’immaigne e salvarla su disco o creare un httphandler, scelgo di usare il formato “base64” embedded per il src dell’immagine:

Bitmap oBitmap = new Bitmap(80, 22);
Graphics oGraphics = Graphics.FromImage(oBitmap);
Brush oBrush = new SolidBrush(Color.White);
oGraphics.FillRectangle(oBrush, 0, 0, 100, 40);

Brush oBrush2 = new SolidBrush(Color.Black);
oGraphics.DrawString(
 _risultato,
 new Font("Arial", 13, FontStyle.Italic),
 oBrush2,
 new Point(5, 1));

/*BASE64*/
string base64String = string.Empty;
MemoryStream memoryStream = new MemoryStream();
oBitmap.Save(memoryStream,
 System.Drawing.Imaging.ImageFormat.Jpeg);
memoryStream.Position = 0;
byte[] byteBuffer = memoryStream.ToArray();
memoryStream.Close();

base64String = Convert.ToBase64String(byteBuffer);
byteBuffer = null;

imgCaptcha.Attributes["src"] =
 "data:image/jpeg;base64," + base64String;

e alla fine nell’evento “Click” del pulsante verificare che il “risultato” sia proprio quello previsto:

if (txtRisultato.Text) == _risultato)
Annunci

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

w

Connessione a %s...