2009. 9. 7. 18:00
그 동안 프로젝트 때문에 너무 바빠서 블로그에 신경을 많이 쓰지 못했습니다. 아직 프로젝트가 한창 진행 중이지만 잠시 틈을 내서 개발관련 포스트를 작성합니다.
Captcha란 텍스트를 자동으로 인식하기 어려운 이미지로 만들어서 봇에 의한 자동가입을 방지하기 위한 기술 입니다.
이미지로 보면 손쉽게 이해가 될것 같네요. 네이버 가입화면에 적용되어 있는 Captcha예제 화면입니다.
스팸을 보내기 위한 목적으로 봇을 이용한 사용자 가입을 방지하기 위해 고안된 기술입니다. 이미지 인식 기술이 발전하면서 상당부분은 무용지물이라는 여론도 있지만 아직까지 효과는 있는 기술 입니다. C#을 이용해서 이 Captcha 이미지를 생성하는 소스입니다. 활용하는 방법이 다양하기 때문에 기본적인 코드만 소개를 합니다.
using System;
using System.Text;
namespace wiz.pe.kr.AF.Web
{
public class Captchar
{
public Captchar() { }
/* 폰트 색상을 설정한다. */
private System.Drawing.Color [] rcolor =
{
System.Drawing.Color.Black, System.Drawing.Color.Green
, System.Drawing.Color.Lime, System.Drawing.Color.Teal
, System.Drawing.Color.Aqua, System.Drawing.Color.Navy
, System.Drawing.Color.Blue, System.Drawing.Color.Purple
, System.Drawing.Color.Fuchsia, System.Drawing.Color.Maroon
, System.Drawing.Color.Red, System.Drawing.Color.Olive
, System.Drawing.Color.HotPink
};
/// Capchar이미지 생성
/// 생성 텍스트
/// 배경 이미지 경로
/// 이미지 저장 경로
/// 저장 경로
public String GenerateCaptcharImage(string txt, string bgPath, string savePath)
{
/* 배경 이미지 생성 */
using(System.Drawing.Image imgo = System.Drawing.Image.FromFile(bgPath))
{
/* 비트맵생성 생성 */
using(System.Drawing.Bitmap bmo = new System.Drawing.Bitmap(imgo))
{
/* 폰트 처리를 위한 그래픽 객체 생성 */
using(System.Drawing.Graphics gpo = System.Drawing.Graphics.FromImage(bmo))
{
System.Drawing.Font ifont;
System.Drawing.SolidBrush ibrush;
System.Random rnd = new Random();
txt = txt.ToUpper();
char [] chs = txt.ToCharArray();
float x = rnd.Next(-25, 0); ;
float y = 0;
for(int tmpi=0;tmpi<=chs.Length-1;tmpi++)
{
/* 랜덤 폰트크기 설정 */
ifont = new System.Drawing.Font("Consolas", rnd.Next(30, 40), System.Drawing.FontStyle.Bold);
/* 랜덤 폰트색상 설정 */
ibrush = new System.Drawing.SolidBrush(rcolor[rnd.Next(0, rcolor.Length-1)]);
/* 폰트위치 설정 */
x += (ifont.Size*8/10);
y = rnd.Next(-20, 40);
if(y>(imgo.Height-ifont.Size) || y <=0) { y=imgo.Height/3; }
gpo.DrawString(chs[tmpi].ToString(), ifont, ibrush, x, y);
gpo.Flush();
}
// 암호화한 파일을 저장해서 사용 하는 예제
// 그 밖에 파일 스트림으로 전송해서 사용할 수도 있다.
string fn = (Maps.AF.Util.MD5.Encript(txt) + ".gif");
bmo.Save(savePath + fn, System.Drawing.Imaging.ImageFormat.Gif);
return fn;
}
}
}
}
}
}
배경이미지를 임의로 생성해서 해당 배경파일과 텍스트를 조합해서 Captchar 이미지를 생성하는 소스입니다.
예제 소스에서는 바로 파일로 저장해서 사용하는 형식이지만 aspx 파일로 구성해서 해당 이미지를 인스턴트로 생성해서 사용도 가능합니다.
프로젝트에 따라 적절하게 수정해서 사용하시면 됩니다.
2009.09.07 추가 : 샘플파일