PDA

View Full Version : آموزش: نمونه ای از کد امنیتی captcha به روشی ساده



mnoori
یک شنبه 09 آذر 1393, 18:32 عصر
در بسیاری از فرم ها برای آنکه مطمئن شویم اطلاعاتی که در سیستم ثبت یا از پایگاه داده واکشی می شوند توسط انسان انجام می شود یا ماشین؟ از captcha استفاده می کنیم. این روش رو که از session استفاده شده در مقاله ای در سایت hamdsoft.ir (http://hamdsoft.ir) منتشر کردم و برای استفاده بیشتر اینجا هم اون رو منتشر می کنم


یکی از روش های هک ارسال request های متعدد برای سرور می باشد، که ممکن است در ارسال درخواست ها برای سرور اطلاعاتی در پایگاه داده ذخیره شود که در این صورت با ارسال اطلاعات بیهوده توسط یک ربات سرور یا دیتابیس ما اصطلاحا down خواهد شد یا در یک صفحه ورود ممکن ربات یا نرم افزار آنقدر request ارسال نماید تا نام کاربری و رمز عبور مورد نظر را برای وورد به سیستم پیدا نماید
کد امنیتی یا هممون captcha مانع از ایجاد این مشکلات در فرم ها می شود و در نهایت باعث افزایش امنیت در برنامه شما خواهد شد.


1- فایل captcha.ashx را ایجاد نموده و کد های ذیل را در آن کپی نمایید


<%@ WebHandler Language="C#‎‎‎‎‎‎" Class="captcha" %>

using System;
using System.Web;
using System.Drawing.Text;
using System.Drawing;

public class captcha : IHttpHandler, System.Web.SessionState.IRequiresSessionState
{

public void ProcessRequest (HttpContext context) {
string cap = "";
Random rnd = new Random();
for (int i = 0; i < 5; i++)
{
cap += Convert.ToString(rnd.Next(0, 9));
}
context.Session["capt"] = cap;
CreateImage( Convert.ToString(context.Session["capt"]) ).Save(context.Response.OutputStream,
System.Drawing.Imaging.ImageFormat.Gif);

}

public bool IsReusable {
get {
return false;
}
}

private static Bitmap CreateImage(string sImageText)
{

Bitmap bmpImage = new Bitmap(1, 1);

int iWidth = 0;
int iHeight = 0;
Font MyFont = new Font("Segoe Print", 18 ,
System.Drawing.FontStyle.Bold,
System.Drawing.GraphicsUnit.Point);

Graphics MyGraphics = Graphics.FromImage(bmpImage);

iWidth = (int)MyGraphics.MeasureString(sImageText, MyFont).Width;
iHeight = (int)MyGraphics.MeasureString(sImageText, MyFont).Height;

bmpImage = new Bitmap(bmpImage, new Size(iWidth, iHeight));
MyGraphics = Graphics.FromImage(bmpImage);
MyGraphics.Clear(Color.WhiteSmoke);

Color c2 = Color.FromArgb(90, 90, 90);
MyGraphics.TextRenderingHint = TextRenderingHint.AntiAlias;
MyGraphics.DrawString(sImageText, MyFont,
new SolidBrush(c2), 0, 0);
MyGraphics.Flush();
return (bmpImage);
}


}



2- گام بعدی فراخوانی و نمایش captcha در صفحه aspx یا هر صفحه مورد نظر شما می باشد، برای این کار کافی است فایل ساخته شده را در یک تگ img فراخوانی کنیم



<img src="captcha.ashx" />
<br />
Captcha Code: <asp:TextBox ID="captcha" runat="server"></asp:TextBox>
<br />
<asp:Button ID="Button1" runat="server" Text="Check Captcha" OnClick="Button1_Click" />

126170

3- بررسی درستی کد امنیتی وارد شده


protected void Button1_Click(object sender, EventArgs e)
{
if(captcha.Text != Session["capt"])
Response.Write("کد امنیتی وارد شده اشتباه است");
}

منبع : http://hamdsoft.ir/content/178

korosh00
یک شنبه 09 آذر 1393, 19:15 عصر
الان هر چی تست می کنم میگه اشتباه است ؟

mnoori
دوشنبه 10 آذر 1393, 10:06 صبح
سلام
دوست عزیز من تست کردم و متن رو که کپی کردم تنها مشکلی که توی کپی پیش اومد
Language="C#"

در خط اول هست کلمه #c رو با اتوکامپلیت ویژوآل استادیو دوباره بزن
یه مطلب دیگه هم برای چک کردن session ، تبدیل به استرینگ فراموش شده اون رو هم اضافه کن
Session["capt"].ToString()

korosh00
دوشنبه 10 آذر 1393, 15:24 عصر
سلام
کجا اضافه کنم این رو دقیقا ؟
Session["capt"].ToString()

mnoori
سه شنبه 11 آذر 1393, 20:20 عصر
در گام سوم و در قظعه کد if(captcha.Text != Session["capt"])
بجای
Session["capt"]
این عبارت را جایگزین کنید
Session["capt"].ToString()

ahmad156
سه شنبه 11 آذر 1393, 20:35 عصر
متن ایجاد شده دارای روند قابل پیش بینی هست یعنی با یه شبیه سازی میتونن متن داخل عکس رو به String تبدیل کنن چون هم فونت تون یکی هست هم اینکه هیچ گونه نویزی (Noise) بر روی متن اصلی ایجاد نمیشه
------------------------------------------------------------

mnoori
سه شنبه 11 آذر 1393, 20:45 عصر
سلام
در رابطه با مورد اول تو عنوان هم ذکر شده " captcha ساده " دوستان اگر تمایل دارند خودشون می تونن پیچیدگی های لازم رو با رسم خط یا نقطه در تصویر ایجاد کنن و حتی می تونن حروف رو نیز در اون ادغام کنند
اما مورد دوم منظور چی هست؟ هیچ مقداری برای Handler ارسال نمی شه که بخواهد کد بشه و عدد رندم تولید شده در داخل خود Handler درون session قرار داده می شه

ahmad156
سه شنبه 11 آذر 1393, 21:07 عصر
ببخشید مورد دوم رو اشتباه دیدم:اشتباه: