PDA

View Full Version : آموزش ساخت تصاویر امنیتی



manager
شنبه 19 اسفند 1385, 01:58 صبح
آموزش ساخت تصاویر امنیتی


تصویر امنیتی چیست ؟
احتمالا شما در هنگام دانلود فایل یا هنگام ثبت نام در برخی از سایت ها درگیر پر کردن فرم های کوچک و بزرگی شده اید. در این فرم ها احتمالا با یک تصویری که در آن چند کاراکتر و یا عدد به شکلی سوال انگیز در کنار هم قرار گرفته است برخورد کرده اید.در کنار این تصاویر از شما خواسته شده است تا کاراکترهائی را که در تصویر مشاهده می کنید را در یک TextBox وارد کنید. اما این تصاویر به چه دردی می خورند ؟

کاربرد تصاویر امنیتی ؟
تصور کنید در سایت شما بخش نظرسنجی وجود دارد و در آن هر فرد مراجعه کننده به سایت (Anonymous) می تواند نظر خود را در آن وارد کند. شما چند راه برای این کار دارید یا تعداد نظراتی را که هر فرد می تواند ثبت کند را محدود سازید و یا اینکه هیچ محدودیتی وجود نداشته باشد. در صورتی که قصد محدود سازی کاربر را داشته باشید احتمالا به سراغ متغیر Session می روید و با الگوریتم خاص خود این مهم را انجام می دهید. مثلا کاربر را مجبور می کنید تا فقط در بازه های زمانی 10 دقیقه ای امکان ثبت را داشته باشد ! سناریو ای را در نظر بگیرید که چند کاربر که از یک PC استفاده می کنند و یا کاربری قصد ارسال دو نظر را دارد، احتمالا با خواندن سناریوهائی از این دست به شما عذاب وجدان دست خواهد داد. حال فرض کنیم شما راه حل دوم را انتخاب کنید و هیچ محدودیتی برای ورود اطلاعات در نظر نگیرید. سناریوای را در نظر بگیرید که در آن هکری با نوشتن یک برنامه ساده سعی می کند به سرعت در وب سایت شما مدام نظر ثبت کند. اگر هر رکورد جدول نظر شما 2092 بایت اشغال کند (2048 بایت برای نظر) و در هر 3 ثانبه (بهترین حالت برای شما و بدترین حالت برای هکر) بتواند یک رکورد ثبت کند. اگر بانک اطلاعاتی سایت شما 10mb فضای آزاد داشته باشد در عرض 4 ساعت بانک اطلاعاتی شما پر از اطلاعات هرزه می شود. احتمالا در بهترین حالت بین 3 تا 4 روز بانک شما پر است و تا آن زمان هیچ چیزی نمی تواند در بانک اطلاعاتی شما درج شود و چندین ساعت از وقت شما صرف پاک کردن اطلاعات هرزه می شود.

نحوه ساخت تصاویر امنیتی
روشی که در این مقاله برای ساخت تصاویر امنیتی استفاده شده است بدین شرح است که از طریق ایجاد یک لینک به HttpHandler تصویر امنیتی را نمایش می دهیم.
http://i18.tinypic.com/2usbygi.jpg
همان طور که در تصویر مشاهده می شود از طریق پسوند ashx به HttpHandler تولید کننده تصویر امنیتی متصل شده و تصویر امنیتی را دریافت می کنیم. این تصویر امنیتی بر اساس مشخصات مورد نظر ما ایجاد می شوند. این مشخصات در ادامه ی پسوند ashx به عنوان Query و به صورت کاملا رمزنگاری شده تولید شده اند.


http://i15.tinypic.com/3yzewix.jpg

کلاس SecurityImage

این کلاس وظیفه تولید آدرس یک تصویر امنیتی را دارا می باشد. در حقیقت ما فقط از این کلاس استفاده می کنیم و خود را از درگیری با سایر مسائل رها می سازیم. به مثال زیر توجه فرمائید :



if (!this.IsPostBack)
{
SecurityImage simg = new SecurityImage(SecurityLevel.Low, 300, 50);
simg.Generate();
Session["simg_code"] = simg.Code;
iLow.ImageUrl = simg.SecurityImageUri;
}

پارامترهای ورودی سازنده کلاس Security Image سطح امنیتی کد و اندازه تصویر خروجی را تعیین می کنند. متد Generate با هر بار فراخوانی یک کد جدید تولید می کند و به طبع آن SecurityImageUri و Code نیز تغییر می کند.
این کد را در هنگام Load شدن صفحه به کار گرفته و کد امنیتی ایجاد شده را در Session نگه داری می کنیم. بعد از اینکه کاربر فرم مورد نظر را پر کرده و پست می کند. می توان مقدار تایپ شده توسط کاربر را با اصل کد امنیتی موجود در Session چک کرده و در صورت صحت آن اطلاعات را ثبت کنیم.

مهمترین متد کلاس SecurityImage به شرح زیر است :



private string GenerateCode()
{
Random r = new Random((int)DateTime.Now.Millisecond);
int maxNumber = 0;
int numberCodeQuantity = 0, alphabeticCodeQuantity = 0;
string code = String.Empty;

maxNumber = r.Next(6, 7);
numberCodeQuantity = 1;
if (SecurityLevel == SecurityLevel.Low)
numberCodeQuantity = 5;
else
alphabeticCodeQuantity = maxNumber - numberCodeQuantity;

for (int i = 1; i <= numberCodeQuantity; ++i)
{
code += ((char)r.Next(48, 57)).ToString();
}
for (int i = 1; i <= alphabeticCodeQuantity; ++i)
{
code += ((char)r.Next(65, 90)).ToString();
}
return code;
}

این متد عمل تولید کد امنیتی متناسب با سطح امنیتی تعیین شده انجام می دهد. پس از تولید کد باید اطلاعات شامل اندازه تصویر، سطح امنیتی تصویر و کد مورد نظر کد شده و به صورت یک Query درآیند.



public string Generate()
{
byte[] IV = new byte[8] { 120, 34, 63, 127, 93, 240, 23, 232 };
string cryptoKey = "GalaxyRoad2004@yahoo.com";

_code = GenerateCode();
byte[] codebytes = System.Text.Encoding.ASCII.GetBytes(_code);
TripleDESCryptoServiceProvider tripleDES = new TripleDESCryptoServiceProvider();
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
tripleDES.Key = md5.ComputeHash(System.Text.Encoding.ASCII.GetByte s(cryptoKey));
tripleDES.IV = IV;
byte[] codeBuffer = tripleDES.CreateEncryptor().TransformFinalBlock(co debytes, 0, codebytes.Length);
string secretCode = Convert.ToBase64String(codeBuffer, 0, codeBuffer.Length);
secretCode = HttpContext.Current.Server.UrlEncode(secretCode);
string query = secretCode + "&" + Width.ToString() + "&" + Height.ToString() + "&" + SecurityLevel.ToString();
byte[] queryBytes = System.Text.Encoding.ASCII.GetBytes(query);
Random r = new Random((int)DateTime.Now.Millisecond);
_simgUri = r.Next().ToString() + ".ashx?" + HttpContext.Current.Server.UrlEncode(Convert.ToBas e64String(queryBytes, 0, queryBytes.Length));
return _simgUri;
}

متد فوق این کار را برای ما انجام می دهد و اطلاعات مورد نظر را به صورت یک Query، رمز می کند و آن را در قالب یک Uri فایل تصویری jpg باز می گرداند.

در سمت سرور ما کلاس SecurityImageHandler را داریم که وظیفه ی Handler کردن درخواست های تصاویر امنیتی را بر عهده دارد. مهمترین متد این کلاس به شرح زیر است :



public void ProcessRequest(HttpContext context)
{
string secretString;
string code;
try
{
secretString = context.Request.Url.Query.Substring(1);
code = Decode(secretString);
}
catch (Exception)
{
return;
}
Size size = new Size(300, 50);
Bitmap bmp = new Bitmap(size.Width, size.Height);
Bitmap result = new Bitmap(imageWidth, imageHeight);
Graphics g = Graphics.FromImage(bmp);
...
result.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
}
برای اختصار از آوردن کدهای تولید تصویر خودداری کردم. قبل از تولید تصویر کد امنیتی باید Query ارسال شده Decode گردد که این عمل توسط متد زیر صورت می گیرد :

private string Decode(string secretCode)
{
byte[] queryBytes = Convert.FromBase64String(HttpContext.Current.Serve r.UrlDecode(secretCode));
string query = System.Text.Encoding.ASCII.GetString(queryBytes, 0, queryBytes.Length);
string[] parameters = query.Split('&');
imageWidth = int.Parse(parameters[1]);
imageHeight = int.Parse(parameters[2]);
ParseSecurityLevel(parameters[3]);
byte[] codeBuffer = Convert.FromBase64String(HttpContext.Current.Serve r.UrlDecode(parameters[0]));
byte[] IV = new byte[8] { 120, 34, 63, 127, 93, 240, 23, 232 };
string cryptoKey = "GalaxyRoad2004@yahoo.com";
TripleDESCryptoServiceProvider tripleDES = new TripleDESCryptoServiceProvider();
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();

tripleDES.Key = md5.ComputeHash(System.Text.Encoding.ASCII.GetByte s(cryptoKey));
tripleDES.IV = IV;
byte[] codebytes = tripleDES.CreateDecryptor().TransformFinalBlock(co deBuffer, 0, codeBuffer.Length);
return System.Text.Encoding.ASCII.GetString(codebytes, 0, codebytes.Length);
}

نحوه استفاده از SecurityImage تهیه شده در این بخش :

کد زیر را در PageLoad قرار دهید :


if (!this.IsPostBack)
{
SecurityImage simg = new SecurityImage(SecurityLevel.Low, 300, 50);
simg.Generate();
Session["simg_code"] = simg.Code;
iLow.ImageUrl = simg.SecurityImageUri;
}

کد زیر را در هم برای چک کردن اینکه آیا کاربر کد را صحیح وارد کرده است یا خیر استفاده نمائید :



protected void Check_Click(object sender, EventArgs e)
{
bool correct = false;
if (Session["simg_code "].ToString().ToLower().Equals(tbCode.Text.ToLower() ))
correct = true;

if (correct) // Success
Do some thing
Else // Failed
Response.Write("Failed.");
}

در فایل web.config مابین تگ های <system.web> کد زیر را درج نمائید :


<httpHandlers>
<add path="*.ashx" verb="*" type="Farahy.Security.SecurityImageHttpHandler, SecurityImage"/>
</httpHandlers>

و در نهایت مطمئن شوید که فایل securityimage.dll را در شاخه bin وب اپلیکیشن کپی کرده اید.

http://www.opera.com/img/features/transfmanager.png دانلود (http://mfarahy.persiangig.com/Components/Security/SecurityImage/)

موفق باشید
سید محمد رضا فراحی (manager)

Behrouz_Rad
شنبه 19 اسفند 1385, 08:57 صبح
البته بهتره که کد در ViewState ذخیره بشه.

مرسی از مقاله خوبت.

manager
شنبه 19 اسفند 1385, 09:15 صبح
البته بهتره که کد در ViewState ذخیره بشه.

مرسی از مقاله خوبت.اتفاقا به فکر خودم هم رسید ولی محتویات ViewState در صورتی که Code نشده باشند می تونه در سمت کلاینت Decode بشه ! مثلا از الگوریتم TripleDES برای کد کردن ViewState استفاده کنید :


<machineKey validation=’3Des’ />

و یا آن را Hash کنید :


<%@ Page EnableViewStateMac="true"%>

فکر کردم Session هم سریع تره و هم اینکه برای کاربران تازه کار این روش بهتره ..

موفق باشید

Behrouz_Rad
شنبه 19 اسفند 1385, 10:59 صبح
محتویات ViewState به طور پیش فرض کد میشن! دلیلی برای کد نشدنش وجود نداره.
در یک مقاله بهتره که پیشنهادات و راهکارهای مناسب نیز در نظر گرفته بشه.


فکر کردم Session هم سریع تره
خیر! از نظر سرعت دستیابی نمیشه تفاوتی قائل شد چون...
مراحل مختلفی برای دسترسی به Session و ViewState طی میشه.
دسترسی به ViewState سریع تر از دسترسی به Session است (چون مقدار ViewState بر روی کلاینت و همراه با خود صفحه نگهداری میشه) . اما پس از دستیابی به ViewState، باید الگوریتم Decoder بر روی اون اعمال بشه.
پس نمیشه تفاوت محسوسی رو برشمرد.

برای کاربران تازه کار این روش بهتره
تفاوتی وجود نداره.

موفق باشید.

manager
شنبه 19 اسفند 1385, 12:45 عصر
محتویات ViewState به طور پیش فرض کد میشن! دلیلی برای کد نشدنش وجود نداره.
اگر ViewState به صورت Hash شده و یا Code شده باشه مشکلی نیست و اتفاقا کار باهاش مناسب تره و من نیز پیشنهاد می کنم. ولی در صورتی که ViewState کد نشده باشه و Decode شدن آن قابل تصور باشه درحقیقت Security Image کاری از پیش نمی بره و می شه با یک برنامه ساده ViewSate را Decode کرده و همانند سناریوهای قبل ریسک حمله وجود داشته باشه.
ولی در صورتی که کسی مایل به استفاده از ViewState باشه هیچ مشکلی وجود نداره و می تواند پس از اطمینان از Code بودن آن از ViewState استفاده نماید. (recommented)

samanes
شنبه 19 اسفند 1385, 14:14 عصر
در تمام نمونه کدهایی که برای ساخت Security Image دیدم, هیچ جا از Validator برای چک
کردن آن استفاده نشده بود. آیا دلیلی برای‌ این وجود داره؟ آیا ایرادی داره که از یک Required field validator و یک compare validator استفاده کنیم؟
آیا ایرادی داره که اول کلاینتی چک کنیم؟ ممنون از همه دوستان...

MehranZand
شنبه 19 اسفند 1385, 14:22 عصر
در صورت امکان این آموزش را با کد vb هم بگذارید.

manager
شنبه 19 اسفند 1385, 14:35 عصر
از Required Field Validator مشکلی نداره که استفاده کنید ولی Compare Validator اصلا توصیه نمی شه !!!
> می تونید از یک CustomValidator استفاده کنید به این ترتیب که Code امنیتی را به صورت Hash از طریق MD5 یا SHA1 در یک Html Hidden Control قرار دهید و هنگام وارد کردن کد توسط کاربر فانکشن جاوااسکریپ CustomValidator شما مقدار وارد شده توسط کاربر را Hash کرده و با مقدار موجود در Html Hidden Control مقایسه کند و در صورت مساوی بودن عمل خاصی را انجام دهد. (کد جاوااسکریپت Hashکننده با سیستم های MD5 و SHA1 ضمیمه شده است.) فقط به این نکته توجه فرمائید که بعد از ارسال فرم نیز مجددا ;Code وارد شده توسط کاربر و Code موجود در Session یا ViewState را چک کنید.
ولی به نظر من چون احتمال اشتباه وارد کردن کد امنیتی کم می باشد، ارزش هزینه (زمانی، حجم صفحه و ..) را ندارد.

samanes
شنبه 19 اسفند 1385, 14:44 عصر
می شه توضیح بدید...
دلیلش چیه؟؟

manager
شنبه 19 اسفند 1385, 22:23 عصر
همان طور که قبلا اشاره کردم یکی از روش های تولید تصاویر امنیتی استفاده از HttpHandler است. روش دیگری که در اینجا قصد شرح آن را دارم استفاده از یک صفحه ی Aspx به جای HttpHandler می باشد. مزیت این روش نسبت به روش قبلی این است که دیگر لازم نیست که فایل web.config خود را ویرایش کنید و فقط کافی است صفحه ی aspx مخصوص تولید کد امنیتی و نیز SecurityImage.dll را به Web Application خود بیافزائید. من خودم شخصا روش قبلی را بیشتر دوست دارم زیرا در آن اصول شئ گرائی بیشتر رعایت شده است و مزیت های شئ گرائی را بیشتر با خود یدک می کشد.
در این روش به جای ایجاد لینک به یک HttpHandler که با پسوند ashx مشخص می شد از ایجاد لینک به یک فایل aspx استفاده می شود.

http://i17.tinypic.com/4bzo0mb.jpg

همان طور که مشاهده می شود یک لینک به یک فایل aspx و به دنبال آن یک Query همانند قبل به عنوان آدرس فایل تصویر ذکر شده است. Query الصاقی همانند روش قبل تولید شده است.
به علت استفاده از این روش من مجبور شدم ساختار کلاسی Security Image را برای تطبیق بیشتر با OOP تغییر بدم.

کلاس SecurityImageInfo

وظیفه این کلاس کپسوله کردن اطلاعات مربوط به یک تصویر امنیتی می باشد. سازنده این کلاس طوری تعریف شده است تا کابر امکان ایجاد نمونه از آن را به طور مستقیم نداشته باشد.(شبیه این تکنیک در DataRow و DataTable کلاس های موجود در System.Data دات نت استفاده شده است.)



protected internal SecurityImageInfo()
{
}
protected internal SecurityImageInfo(string code, int width, int height, SecurityLevel level, string filename)
{
_level = level;
_width = width;
_filename = filename;
_height = height;
}
protected string _filename;
protected SecurityLevel _level;
protected string _code;
protected string _simgUri;
protected int _width;
protected int _height;

public int Width
{
get{ return _width;}
}
public int Height
{
get{return _height;{
}
public SecurityLevel SecurityLevel
{
get{return _level;}
}
public string Code
{
get{return _code;}
}
public string SecurityImageUri
{
get{return _simgUri;}
}

}

کلاس SecurityImageSupplier
این کلاس برای انجام کارهای پایه ای برای تولید تصاویر امنیتی می باشد. لزومی ندارد کاربر با این کلاس کار کند و کلاس SecurityImage جوابگوی نیازهای کاربر می باشد.



public class SecurityImageSupplier : SecurityImageInfo
{
public SecurityImageSupplier()
{
}
public SecurityImageSupplier(string code, int width, int height, SecurityLevel level)
{
_code = code;
_width = width;
_height = height;
_level = level;
}
public SecurityImageInfo QueryDecode(string secretCode)
{

... Decoding Query and parse private attributs

return this;
}

public string QueryEncode()
{
return QueryEncode(_code, _width, _height, _level);
}

public string QueryEncode(string code, int width, int height, SecurityLevel level)
{

... Create query and code it by parameters and initializing private attributes

}

public void WriteImageToStream(Stream output)
{

... Create and draw security image

result.Save(output, System.Drawing.Imaging.ImageFormat.Jpeg);
}
}

از این کلاس برای رسم تصویر در فایل SecurityImageGenerator.aspx استفاده شده است.



protected void Page_Load(object sender, EventArgs e)
{
string query = Request.Url.Query;
query = query.Substring(1);

SecurityImageSupplier supplier = new SecurityImageSupplier();
supplier.QueryDecode(query);
Response.Clear();
supplier.WriteImageToStream(Response.OutputStream) ;
}

کد فوق شامل تمام عملیات رسم و تولید تصویر امنیتی می باشد. متدهای QueryDecode و QueryEncode همان وظایف گذشته را بر عهده دارند و فقط نام آنها تغییر کرده است.

کلاس SecurityImage
کلاس SecurityImage همان کلاسی ست که کاربر با استفاده از آن همانند روش قبل عمل تولید تصاویر امنیتی را انجام می دهد. البته تغییرات جزئی را ناچارا بر این کلاس اعمال کردم.



public class SecurityImage : SecurityImageInfo
{

... Constructors

public string Generate(SecurityLevel newLevel)
{
_level = newLevel;
return Generate();
}

public string Generate()
{

... Generate Code

_code = code;
SecurityImageSupplier supplier = new SecurityImageSupplier(_code, _width, _height, _level);
_simgUri = "SecurityImageGenerator.aspx?" + supplier.QueryEncode();
return _simgUri;
}

}

نحوه ی استفاده سریع
در این قسمت قصد دارم علاوه بر شرح نحوه استفاده کلاس SecurityImage برای تولید تصاویر امنیتی، طریقه ی استفاده از یک CustomValidator را برای بررسی صحت کد وارد شده توسط کاربر را نیز ذکر کنم. به کدهای زیر توجه فرمائید :


if (!this.IsPostBack)
{
SecurityImage simg = new SecurityImage(SecurityLevel.VeryHigh);
simg.Generate();
ViewState["rbVeryHigh"] = simg.Code;
iVeryHigh.ImageUrl = simg.SecurityImageUri;

MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
byte[] securityCodeBytes = Encoding.ASCII.GetBytes(simg.Code.ToLower());
byte[] hashedBytes = md5.ComputeHash(securityCodeBytes,0,securityCodeBy tes.Length);
string b64str = Convert.ToBase64String(hashedBytes,0,hashedBytes.L ength);
hiHashedSecurityCode.Value = b64str.Substring(0, b64str.Length - 2);
}

برای تولید تصویر امنیتی همانند گذشته عمل کردیم با این تفاوت که به جای Session از ViewState برای نگاه داری کد امنیتی استفاده کرده ایم. در ادامه کد امنیتی تولید شده را توسط الگوریتم MD5 به صورت Hash در آورده و آن را درون یک HtmlInputHidden قرار دادیم. دقت کنید که اگر مقدار کد امنیتی را بدون تغییر درون این فیلد نگاه داریم آنگاه انگار که هیچ کار مفیدی تا کنون انجام نداده ایم.
فایل های SecurityImageGenerator.aspx، SecurityImage.dll و نیز md5.js (در صورت تمایل به استفاده از CustomValidator و نیز جهت کار با متدهای هش کننده md5 در سمت کلاینت) را به پروژه ی خود بیافزائید.
کدهای Javascript زیر را به صفحه اضافه می کنیم.



<script src="md5.js" language="javascript" type="text/javascript"></script>

<script language="javascript" type="text/javascript">
function SecurityImageValidator(sender,args)
{
if(b64_md5(args.Value.toLowerCase())==document.get ElementById("hiHashedSecurityCode").value)
args.IsValid=true;
else
args.IsValid=false;
return args.IsValid;
}
</script>

مجددا توجه شما را به این مطلب جلب می کنم که کدهای فوق و نیز بخش دوم کدهای Server Side قبلی برای اضافه کردن CustomValidator می باشد و در صورتی که شما مایل به استفاده از آن نیستید نباید این کدها را به صفحه ی aspx خود اضافه کنید.

یک RequiredFieldValidator و یک عدد CustomValidator را چاشنی وب فرم خود کنید و برای خصوصیت ClientValidationFunction کنترل CustomValidator مقدار SecurityImageValidator را وارد نمائید. این باعث می شود تا قبل از PostBack صفحه فانکشن جاوااسکریپت فوق اجرا شود و Validation آن از طریق این Function چک شود.

در نهایت فرم شما باید شکلی شبیه به شکل زیر باشد :

http://i16.tinypic.com/4hsakco.jpg


و در نهایت کدهای زیر را به عنوان آخرین کدهای آزمایش صحت Security Code در هنگام پست شدن صفحه و قبل از انجام هر عملیاتی قرار می دهیم :



protected void Check_Click(object sender, EventArgs e)
{
bool correct = false;
if (ViewState["rbVeryHigh"].ToString().ToLower().Equals(tbCode.Text.ToLower() ))
correct = true;
if (correct)
Response.Write("<h1>Success !!</h1>");
else
Response.Write("Failed.");

}

توجه : نباید فقط به قرار دادن یک CustomValidator اکتفا کرد و حتما می بایست مجددا آزمون برابر اصل بودن Security Code را درسمت سرور انجام داد.

http://www.opera.com/img/features/transfmanager.png دانلود (http://mfarahy.persiangig.com/Components/Security/AspxSecurityImage/)

موفق باشید
سید محمد رضا فراحی (manager)

manager
دوشنبه 21 اسفند 1385, 16:06 عصر
CAPTCHA مخفف Completely Automated Public Turing test to Tell Computers and Humans Apart و به هر ابزاری اطلاق می شود که توانائی تشخیص انسان را از ماشین داشته باشد. در حقیقت CAPTCHA می تواند آزمایش هائی ایجاد کند که انسان ها می توانند از آن عبور کنند ولی برنامه های کامپیوتری امروزی توان عبور از آن را ندارند. (اطلاعات بیشتر... (http://www.captcha.net/))
بسیار خوب، می توان با استفاده از تعریف CAPTCHA، آزمون های خاصی مثل Security Image را دور زد به این ترتیب که; فرض کنید قصد ایجاد Account در Yahoo را دارید، البته نه یکی دو تا بلکه صدها و یا هزاران Account. هنگام ایجاد Account سایت Yahoo از Security Image استفاده می کند. برای رد شدن از این آزمون کافیست شما دارای یک سایت پر بیننده باشید آنگاه می توانید برای هر عملی (مثل دانلود فایل، مشاهده بعضی صفحات و ..) از کاربران سایت خود کمک بگیرید و با نمایش Security Image سایت Yahoo به کاربران سایت خود Security Code تصویر را یافته و Account خود را ایجاد کنید. این عمل را می توانید هزاران بار تکرار کنید.
ولی راه های مقابله ای وجود دارد و همچنین روش هائی برای دور زدن آنها و مجددا از نو، و این چرخه ادامه دارد......

البته این مطلب دو نکته اخلاقی دارد :
1- هر وقت یک Security Image در جائی دیدید فکر نکنید صاحب سایت می خواهد به دیتابیس کسی attack کنه و شما هم در این گناه شریک هستید.
2- شما اگر صاحب یک سایت پر بیننده هستید سعی نکنید کاربران خود را برای همیشه از دست بدید.

manager
دوشنبه 21 اسفند 1385, 17:23 عصر
امروز افکت Water و Pattern رو به Security Image اضافه کردم...

http://i18.tinypic.com/4355aig.jpg

یک کتابخانه از Filterها شامل برنامه است که می توانید با استفاده از آن افکتهای گوناگونی بر روی تصویر اعمال کنید. این کتابخانه توسط آقای Christian Graus (http://www.codeproject.com/script/profile/whos_who.asp?id=6556) نوشته شده است.

دانلود (http://mfarahy.persiangig.com/Components/Security/SecurityImage/SecurityImage.dll.v1.0.0.0.rar)

AHMADABDALI
جمعه 03 فروردین 1386, 03:03 صبح
عالی بود بسیار سپاسگزارم

peymannaji
شنبه 04 فروردین 1386, 00:43 صبح
سلام دوست عزیز این فایل dll رو چگونه به پروژم اضافه کنم هرکاری میکنم ارور میده من از ورژن 2003 استفاده میکنم

manager
شنبه 04 فروردین 1386, 09:53 صبح
خوب من این Dll رو با .Net2.0 ساختم، برای اینکه شما بتونید در 2003 ازش استفاده کنید باید اون رو تبدیل کتید به .Net1.x که البته چون داخل این dll از dll های .Net2.0 استفاده ای نشده و تمام امکانات مورد نیاز در .Net1.x نیز وجود داره، امکان تبدیلش به راحتی وجود داره.
فقط کافیه یه پروژه جدید از نوع Library به Solutionتون اضافه کنید و فایل های cs موجود SecurityImage.cs و SecurityImageHandler.cs را به داخل این پروژه جدید کپی کرده، کامپایل نمائید و رفرنسی از پروژه وبتون به این پروژه ایجاد کنید (یا اینکه مقصد پروژه کتابخانتون رو به شاخه ی bin وب تون set کنید) و بعد کار تموم.

amir_pro
جمعه 01 تیر 1386, 02:15 صبح
ببخشید که با گذشت 4 ماه سوال می پرسم
جناب manager هر کاری کردم که تبدیلش کنم به 2003 نتونستم میشه بیشتر راهنمایی بفرمایید - ممنون میشم

manager
جمعه 01 تیر 1386, 23:36 عصر
ببخشید که با گذشت 4 ماه سوال می پرسم
جناب manager هر کاری کردم که تبدیلش کنم به 2003 نتونستم میشه بیشتر راهنمایی بفرمایید - ممنون میشم
من تو پست قبلی به وضوح براتون کامل شرح دادم، دقیقا کجا مشکل دارید ؟

amir_pro
شنبه 02 تیر 1386, 08:32 صبح
رفرنسی از پروژه وبتون به این پروژه ایجاد کنید (یا اینکه مقصد پروژه کتابخانتون رو به شاخه ی bin وب تون set کنید) و بعد کار تموم.

این قسمتشا نمیدونم چه طوریه؟ میشه کامل توضیح بدید؟ممنون میشم - واقعا نیاز دارم

manager
دوشنبه 04 تیر 1386, 00:18 صبح
ببخشید یکم دیر شد، فصل فصل امتحاناست.
خوب من VS2003 رو سیستمم ندارم که براتون دقیقا از روی شکل شرح بدم که چه کار کنید. شما باید Dll مربوط به وب سرویس SecurityImage رو در داخل شاخه ی Bin پروژتون کپی کنید و یا یک رفرنس به انو ایجاد کنید. پیشنهاد می کنم یک پروژه جدید برای وب سرویس ایجاد کنید و فایل های *.cs رو به داخل اون پروژه خالی کپی پیست کنید و سپس پروژه را کامپایل کنید، و یا اینکه چند روز صبر کنید که برم VS2003 تهیه کنم، ببینم مشکلتون کجاست.

amir_pro
دوشنبه 04 تیر 1386, 10:58 صبح
خواهش می کنم جناب فراحی - خودم میرم سعی میکنم ببینم میشه یا نه ولی ببخشید اگه نشدچند روز باید صبر کنم
ممنون از راهنماییتون

rainynight
یک شنبه 24 تیر 1386, 18:32 عصر
سلام رئیس جان من Nazaninam هستم فعلا آیدیم مشکل پیدا کرده
مسئله که من دیدم این بود


Session["simg_code"] = simg.Code;
simg.Generate();

شما ابتدا کدی که هنوز Generate نشده را داخل سشن میریزی بعد Generate می کنی و اتفاقی که میفته NullRefrence هستش . فقط کافیه جای این دو تا خط عوض بشه.

به نظرم رسید بگم
بازم ممنون از زحماتت

manager
یک شنبه 24 تیر 1386, 19:36 عصر
شما ابتدا کدی که هنوز Generate نشده را داخل سشن میریزی بعد Generate می کنی و اتفاقی که میفته NullRefrence هستش . فقط کافیه جای این دو تا خط عوض بشه.

این اشتباه در متن پست بود و تو برنامه مشکلی وجود نداشت. ممنون از نگاه دقیقتون..

rainynight
یک شنبه 24 تیر 1386, 21:40 عصر
محمد جان راستش با یک مشکل دیگه هم برخورد کردم ، و اون این بود که چون path="*.ashx" بکار برده شده روی سایر هندلر ها تاثیر میگذاشت ، البته من با یک کم تغییر در سورس ردیفش کردم.
بازم مرسی ار مقاله خوبت

manager
سه شنبه 26 تیر 1386, 09:04 صبح
بیشتر توضیح بدید، path="*.ashx" چه مشکلی رو به وجود می یاره ؟ و شما چه مشکلی رو چگونه حل کردید ؟

mehrdad201
پنج شنبه 01 شهریور 1386, 12:11 عصر
با سلام خدمت همه دوستان عزیزم

خوشحالم که این فروم رو پیدا کردم.

خدارو شکر همه دوستان اینجا از اساتید دانا و کارکشته هستند و مهمتر از همه اینکه در آموزش دوستان تازه کار مثل من بسیار سخاوتمند هستند.

من تازه کار روی دات نت رو شروع کردم و یه تازه کارم.

در مورد این قضیه ایمیج یه نکته ای رو میخواستم بگم و خواستم نظر دوستان رو هم بدونم.

من برای ساخت عکس از یه فایل aspx استفاده می کنم. نحوه ساختنم هم اینه که موقعی که صفحه ای که حاوی عکس امنیتی هست ساخته میشه یه کد میسازم (توسط الگوریتم رندوم) بعد اون کد رو در دیتابیس وارد می کنم.

موقعی هم که یوزر کد رو وارد می کنه من میام رو سرور کد رو چک می کنم.

اول به من بگید که آیا این شیوه ، راه مناسبی و معقولیه ؟!

در ضمن من تو اوت صفحه ای که عکس رو میسازه از یه عکس ساده میسازم. جایی هست که طریقه ساختن عکسهای فیلتر دار (مثل عکسهای سایت گوگل یا یاهو - منظورم به کج و کولگیشونه) رو هم یاد داده باشه ؟ یعنی خود دستورات دات نتیش رو بیان کرده باشه.

========================

یک سوال دیگه برای منیکه تازه کردم و با خیلی چیزهای دات نت آشنایی ندارم چه پیشنهادی دارید؟

کتاب خاصی هست ؟ آیا در فروم تاپیکی هست که آموزش رو از پایه انجام داده باشه ؟!!؟

از همه دوستان و اساتید عزیز سپاسگذارم.

manager
جمعه 02 شهریور 1386, 18:20 عصر
آقا/خانم mehrdad201 (http://barnamenevis.org/forum/member.php?u=41414) ورودتون رو به سایت برنامه نویس تبریک می گم. شما این تاپیک رو از ابتدا مطالعه بفرمائید جواب همه ی سوالاتتون رو می فهمید.

تنها موردی که اشاره نشده مورد دیتا بیس هست که اصلا اینجا لزومی به استفاده از دیتابیس نیست.

mehrdad201
پنج شنبه 29 شهریور 1386, 01:42 صبح
درسته مقاله رو کاملا مطالعه کردم و متوجه شدم.

از این عکسها میشه در کنترل لاگین و create user wizard هم استفاده کرد. درسته !؟!؟!؟!؟!

یه مقدار در مورد این برام توضیح میدید ؟!؟

shahab_ksh
شنبه 14 مهر 1386, 15:09 عصر
کد vb بخش اولتون رو گذاشتم




If Not Me.IsPostBack Then
Dim simg As New SecurityImage(SecurityLevel.Low, 300, 50)
simg.Generate()
Session("simg_code") = simg.Code
iLow.ImageUrl = simg.SecurityImageUri
End If
--------------------------------------------
Private Function GenerateCode() As String
Dim r As New Random(CInt(DateTime.Now.Millisecond))
Dim maxNumber As Integer = 0
Dim numberCodeQuantity As Integer = 0, alphabeticCodeQuantity As Integer = 0
Dim code As String = [String].Empty

maxNumber = r.[Next](6, 7)
numberCodeQuantity = 1
If SecurityLevel = SecurityLevel.Low Then
numberCodeQuantity = 5
Else
alphabeticCodeQuantity = maxNumber - numberCodeQuantity
End If
For i As Integer = 1 To numberCodeQuantity

code += CChar(r.[Next](48, 57)).ToString()
Next
For i As Integer = 1 To alphabeticCodeQuantity
code += CChar(r.[Next](65, 90)).ToString()
Next
Return code
End Function
----------------------------------------------
Public Function Generate() As String
Dim IV As Byte() = New Byte(7) {120, 34, 63, 127, 93, 240, _
23, 232}
Dim cryptoKey As String = "GalaxyRoad2004@yahoo.com"

_code = GenerateCode()
Dim codebytes As Byte() = System.Text.Encoding.ASCII.GetBytes(_code)
Dim tripleDES As New TripleDESCryptoServiceProvider()
Dim md5 As New MD5CryptoServiceProvider()
tripleDES.Key = md5.ComputeHash(System.Text.Encoding.ASCII.GetByte s(cryptoKey))
tripleDES.IV = IV
Dim codeBuffer As Byte() = tripleDES.CreateEncryptor().TransformFinalBlock(co debytes, 0, codebytes.Length)
Dim secretCode As String = Convert.ToBase64String(codeBuffer, 0, codeBuffer.Length)
secretCode = HttpContext.Current.Server.UrlEncode(secretCode)
Dim query As String = secretCode + "&" + Width.ToString() + "&" + Height.ToString() + "&" + SecurityLevel.ToString()
Dim queryBytes As Byte() = System.Text.Encoding.ASCII.GetBytes(query)
Dim r As New Random(CInt(DateTime.Now.Millisecond))
_simgUri = r.[Next]().ToString() + ".ashx?" + HttpContext.Current.Server.UrlEncode(Convert.ToBas e64String(queryBytes, 0, queryBytes.Length))
Return _simgUri
End Function
-----------------------------------------------
Public Sub ProcessRequest(ByVal context As HttpContext)
Dim secretString As String
Dim code As String
Try
secretString = context.Request.Url.Query.Substring(1)
code = Decode(secretString)
Catch generatedExceptionName As Exception
Return
End Try
Dim size As New Size(300, 50)
Dim bmp As New Bitmap(size.Width, size.Height)
Dim result As New Bitmap(imageWidth, imageHeight)
Dim g As Graphics = Graphics.FromImage(bmp)
result.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg)
End Sub
-------------------------------------------------------
If Not Me.IsPostBack Then
Dim simg As New SecurityImage(SecurityLevel.Low, 300, 50)
simg.Generate()
Session("simg_code") = simg.Code
iLow.ImageUrl = simg.SecurityImageUri
End If
--------------------------------------------------------
Protected Sub Check_Click()
Dim correct As Boolean = False
If Session("simg_code ").ToString().ToLower().Equals(tbCode.Text.ToLower( )) Then
correct = True
End If


End Sub

shahab_ksh
شنبه 14 مهر 1386, 15:12 عصر
جناب مدیر دو بار خواستم کد ها رو واسه دانلود بزارم هر بار ارور داد لطفا پاک کنید

shahab_ksh
شنبه 14 مهر 1386, 15:14 عصر
جناب مدیر دو بار خواستم کد ها رو واسه دانلود بزارم هر بار ارور داد لطفا پاک کنید

javad3151
پنج شنبه 10 آبان 1386, 08:36 صبح
سلام
ساخت تصاویر امنیتی با VB.Net ، البته با ساختاری کاملا متفاوت

mohsenebi
سه شنبه 14 اسفند 1386, 12:09 عصر
برنامه ی مورد نظر شما captcha نام داره یک نمونه از برنامه شما در ادرس زیر هست

http://barnamenevis.org/forum/showpost.php?p=296840&postcount=20

e-commerce
پنج شنبه 09 خرداد 1387, 00:21 صبح
سلام ...
لطفا نحوه ساخت کئ امنیتی با PHP رو هم توضیح بدید
ممنون

nooshin_k
دوشنبه 20 خرداد 1387, 15:17 عصر
سلام
اين فايل sesecurityimage.dll كه گفتين در bin برنامه كپي كنيم در asp.net 2005 كه وجود نداره چه كار كنم؟

joojoo
سه شنبه 09 مهر 1387, 12:35 عصر
سلام.
ممنون از توضیحات خیلی خوبتون.
فقط درزمان اجرا Error میده.میشه لطفاکمکم کنید؟
Error:Error 1 It is an error to use a section registered as allowDefinition='MachineToApplication' beyond application level. This error can be caused by a virtual directory not being configured as an application in IIS. D:\code amniati\Aspx\AspxSecurityImage\

Ehsan-MT
چهارشنبه 14 اسفند 1387, 12:47 عصر
آقا باعرض سلام
از مطالب مفيدتون متشکر و ممنونم.

مي خواستم بگم که من يک مشکل دارم و اون اينکه به صورت لوکال هاست تصوير امنيتي مورد نظر نمايش داده ميشه ولي وقتي رويه هاست آپ ميکنم و صفحه لود ميشه تصوير رو نشون نميده.

لطفا اگه ممکنه راهنمايي کنيد.

iman_ad
جمعه 23 اسفند 1387, 02:15 صبح
کتابخانه که گفتی قابل دانلود نیست می شه دوباره آپلود کنی؟

farn0osh
دوشنبه 25 آبان 1388, 21:46 عصر
سلام
من قسمت <assemblies>
<add assembly="System.Security, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
</assemblies> رو که توی وب کانفیگ میذارم خطای
http 500 internal server error


میده ولی روی لوکالم کار میکنه.دلیلش چیه؟

mehrdad201
سه شنبه 26 آبان 1388, 01:52 صبح
راحت ترین کار اینه که یه صفحه aspx اضافه کنید به برنامه

بعد توی اون صفحه برید تصویر امنیتی رو با استفاده از شی گرافیک و response.binarywrite ایجاد کنید

مقدار عبارت رو هم در سشن نگه دارید تا بتونید مقایسه کنید با ورودی کاربر

در صفحه اصلی هم که میخواید عکس نشون داده بشه یه فیلد asp:image بذارید و ادرس فایلش ImageURL رو مساوی قرار بدید با اون صفحه که عکس رو میسازه.

این راحت ترین کار هست به نظر من

farn0osh
چهارشنبه 27 آبان 1388, 18:50 عصر
من از روش دوم شما (تولید تصاویر امنیتی به وسیله صفحات aspx) رفتم.توی لوکال کار میکنه ولی روی سایت نه! تصویر رو نشون نمیده!اگه ممکنه راهنماییم کنین.ممنون

tempdoc
چهارشنبه 16 دی 1388, 23:15 عصر
سلام
من از کار خوبتون استفاده کردم، تشکر.
یک مشکل دارم، روی کامپیوتر خودم که اجرا میشه تصویر نمایش داده میشه ولی وقتی میبرمش روی سرور تصویر رو نمایش نمیده؟
از dll های دیگه ای هم استفاده کردم مثلا msCaptcha باز هم همین اتفاق می افته؟؟؟
چطور میتونم درستش کنم؟

tempdoc
چهارشنبه 16 دی 1388, 23:23 عصر
سلام
من از کار خوبتون استفاده کردم، تشکر.
یک مشکل دارم، روی کامپیوتر خودم که اجرا میشه تصویر نمایش داده میشه ولی وقتی میبرمش روی سرور تصویر رو نمایش نمیده؟
از dll های دیگه ای هم استفاده کردم مثلا msCaptcha باز هم همین اتفاق می افته؟؟؟
چطور میتونم درستش کنم؟

Saber_Fatholahi
پنج شنبه 17 دی 1388, 14:40 عصر
منم یه تصویر امنیتی دارم بدک نیست

hapkidoghf
یک شنبه 19 اردیبهشت 1389, 22:48 عصر
از ارسال اين مقاله كمال تشكر و قدر داني رو دارم مرسي

aleas2
یک شنبه 23 خرداد 1389, 13:53 عصر
سلام برهمگی خسته نباشید ببخشید تصاویر امنیتی قسمت نظرات بلاگفا کسی داره؟جایی پیدا میشه دانلود کنم؟

nafasak
شنبه 19 تیر 1389, 20:37 عصر
سلام
من از کار خوبتون استفاده کردم، تشکر.
یک مشکل دارم، روی کامپیوتر خودم که اجرا میشه تصویر نمایش داده میشه ولی وقتی میبرمش روی سرور تصویر رو نمایش نمیده؟
از dll های دیگه ای هم استفاده کردم مثلا msCaptcha باز هم همین اتفاق می افته؟؟؟
چطور میتونم درستش کنم؟

من هم دقیقا همین مشکل رو دارم.
راه حلش چیه؟

didaaa
سه شنبه 02 شهریور 1389, 09:20 صبح
من هم اين مشكلو داشتم كه رو سرور عكس نمايش داده نميشه!
به عنوان پيشنهاد ميگم ميتونيم از كاربراي سايتمون دعوت كنيم بيان پاي سيستم خودمون و بصورت لوكال استفاده كنند.:لبخند: :قهقهه:

Behrouz1985
یک شنبه 23 آبان 1389, 17:18 عصر
من از روش دوم شما (تولید تصاویر امنیتی به وسیله صفحات aspx) رفتم.توی لوکال کار میکنه ولی روی سایت نه! تصویر رو نشون نمیده!اگه ممکنه راهنماییم کنین.ممنون


سلام
من از کار خوبتون استفاده کردم، تشکر.
یک مشکل دارم، روی کامپیوتر خودم که اجرا میشه تصویر نمایش داده میشه ولی وقتی میبرمش روی سرور تصویر رو نمایش نمیده؟
از dll های دیگه ای هم استفاده کردم مثلا msCaptcha باز هم همین اتفاق می افته؟؟؟
چطور میتونم درستش کنم؟


من هم اين مشكلو داشتم كه رو سرور عكس نمايش داده نميشه!
به عنوان پيشنهاد ميگم ميتونيم از كاربراي سايتمون دعوت كنيم بيان پاي سيستم خودمون و بصورت لوكال استفاده كنند.:لبخند: :قهقهه:
کسی نمی تونه این مشکل رو حل کنه؟!

sherafatian
پنج شنبه 02 دی 1389, 17:27 عصر
اینجا هم مطلب جالبی هست که مطالعه اون ضرری نداره
http://www.codeproject.com/KB/custom-controls/CaptchaControl.aspx

ParsaNM
دوشنبه 12 اردیبهشت 1390, 12:57 عصر
مطالب بسيار جالبي بود دوستان ...
در نورد امنيت ديگه چه چيزهايي رو بايد رعايت کنيم ؟

majthr
چهارشنبه 10 خرداد 1391, 04:00 صبح
کسی نمی تونه این مشکل رو حل کنه؟!

فکر میکنم خیلی سال از وقت این تاپیک گذشته ولی منم این مشکلو داشتم که حل شد فایل کانفیگو درست باید دستکاری و سیو کنید من که مشکلم این بود و حل شد گفتم شاید بعد سالها یکی بخواد استفاده کنه !!!

mohammad87
یک شنبه 14 خرداد 1391, 16:28 عصر
باسلام،
وقتی از این کتابخانه توی وبسایت روی سرور استفاده می کنم ارور زیر رومیده؟ مشکل کجاست؟
کسی می دونه جریان چیه؟

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request. Please contact the server administrator to inform of the time the error occurred and of anything you might have done that may have caused the error.
More information about this error may be available in the server error log.

fakhravari
چهارشنبه 19 مهر 1391, 22:52 عصر
بسیار عالی .

fakhravari
یک شنبه 14 آبان 1391, 21:44 عصر
سلام
اگر ممکن تنظیمات برای IIS 7 هم بزارید

qadireh
یک شنبه 22 بهمن 1391, 23:22 عصر
عالی بودددددد

kohyar
چهارشنبه 14 فروردین 1392, 10:09 صبح
با سلام به دوستان گرامي
من از اين كامپوننت تو چند تا از وب سايت هام استفاده كردم و درست هم جواب گرفتم
ولي تو يكي از وب سايت هاي جديد كه هاستينگ سايت دسترسي ها رو روي فولدر هاي سايت بسته تصاوير امنيتي با استفاده از DLL آقاي فرهي جواب نميده
مي حوايتم بدونم كه آيا نيازه تا به فولدري براي توليد اين تصاوير امنيتي دسترسي فول اكسس بدم
ممنون ميشم كمكم كنيد

fakhravari
سه شنبه 20 فروردین 1392, 11:02 صبح
فولدر :متفکر:
فقط نیاز به دادن هندلر ها است در وب کانفیگ