Posts Tagged ‘ gdi+’

Un semplice CAPTCHA per Asp.Net

{ Inserito il 12 Set 2013 da maury }
Tags : , , , , ,
Categorie : Generico

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)
Leggi »