PDA

View Full Version : کنترل اینکه کاربر از یک صفحه خاص امده یا خیر؟



hessam12
چهارشنبه 17 خرداد 1391, 17:04 عصر
با سلام خدمت اساتید محترم فاروم برنامه نویس
یک سوال دارم:
آیا در زبان c# و برنامه نویسی تحت وب ممکن هست کدی بنویسم تا سیستم چک کند کاربر از کدام صفحه وارد یک بخش خاصی مثلا مدریت شده و درصورت ورود غیرقانونی او را به صفحه مورد نظرم -مثل لاگین- ریدایرکت کند؟
با تشکر

m.akar
چهارشنبه 17 خرداد 1391, 21:11 عصر
من به خوبی متوجه سوال شما نشدم. شما می خواهید بدانید که یک کاربر از کدام صفحه به صفحه اکنونی آمده است؟ یا می خواهید بدانید کاربر مجوز و دسترسی مشاهده صفحه را دارد یا خیر؟ این دو مقوله کاملا متفاوت هستند و ترکیب این دو مشکلات امنیتی زیادی ایجاد خواهد کرد.
اگر منظور سوال شما سوال اولی باشد Request.UrlReferrer آدرس ارجاع کننده به صفحه را در اختیار شما قرار می دهد. دقت کنید اگر شخص در آدرس بار آدرسی را وارد کرده باشد مقدار آن Null است.
اگر منظور شما سوال دومی باشد ابتدا باید درباره سیاست و نحوه مدیریت دسترسی های خود تصمیم بگیرید و آن را پیاده سازی کنید. البته خود مایکروسافت قابلیت خوب Forms Authentication قرار داده که می توانید در پروژه خود به خوبی از ان استفاده نمایید. اطلاعات بیشتر را در این مورد می توانید از اینجا (http://msdn.microsoft.com/en-us/library/ff647070.aspx)و اینجا (http://weblogs.asp.net/scottgu/archive/2006/02/24/ASP.NET-2.0-Membership_2C00_-Roles_2C00_-Forms-Authentication_2C00_-and-Security-Resources-.aspx)مشاهده نمایید

hessam12
چهارشنبه 17 خرداد 1391, 23:13 عصر
تقریبا در هر دو بخشی که گفتید اشکال دارم، البته سوالم مربوط به آدرس ارجاع کننده بودکه تا این حد متوجه شدم کد Request.UrlReferrer آدرس رو در اختیارم قرار میده

در باره منابع دقیقا ترتیب کدها رو متوجه نمیشم، یعنی هر کد رو باید کجا قرار بدم میشه در این مورد هم راهنمایی بکنید؟

و وقتی کد authentication رو تو web.config کپی کردم ارور داد و اجرا نشد نسخه ویژوال بیسیکم می تونه باعث اجرا نشدن یک کد خاص باشه؟

aminghaderi
چهارشنبه 17 خرداد 1391, 23:44 عصر
در ساده ترین حالت همین کد Request.UrlReferrer رو در Pageload صفحه استفاده کنید و تمام.
برای مثال اگر کاربر از صفحه غیر از x امده بود برگردونه به صفحه اول سایت .
مشکل امنیتی که m.akar (http://barnamenevis.org/member.php?257043-m.akar) می فرمایند رو من نمی فهمم ؟! لطفا توضیح بدید چطوری باعث مشکل امنیتی می شود؟

m.akar
پنج شنبه 18 خرداد 1391, 12:12 عصر
1- منظور من از مشکل امنیتی زمانی است که شما این دو مقوله را با هم ترکیب می کنید و به جمله ای شبیه به این جمله می رسید: کاربرانی مجوز استفاده از این صفحه را دارند که از صفحه فلان آمده باشند. این صفحه می تواند صفحه لاگین باشد و تمامی امنیت سیستم خود را بر مبنای این جمله قرار می دهید. مشکل امنیتی اینجا است که اگر کاربر در صفحه لاگین یک لینک بوسیله ابزار هایی مثل firebug قرار دهد و بعد بر روی آن کلیک کند بدون لاگین کردن به سیستم با همان شرایطی که شما گفتید به صفحه نهایی می رسد. یعنی به عنوان کاربری شناخته می شود که از صفحه لاگین به این صفحه آمده است و خوب این یعنی فاجعه.
2- لینک هایی که قرار دادم برای دریافت اطلاعات بیشتر درباره نحوه مدیریت و پیاده سازی دسترسی ها بود. نه برای استفاده کد آن ها. این ها در اصل ساختار هایی هستند که من برای جنبه آموزشی آن ها آن ها را قرار دادم. Forms Authentication یک قابلیت بر پایه یک معماری امنیتی است. شما باید بیشتر درباره اش مطالعه نمایید.

آقای Scott Mitchell در مجموعه مقالاتی در اینجا (http://aspnet.4guysfromrolla.com/articles/120705-1.aspx)به صورت کامل معماری و نحوه استفاده از این قابلیت را بیان کرده است. امیدوارم برای شما کمک کننده باشد.

hessam12
جمعه 19 خرداد 1391, 20:05 عصر
در ساده ترین حالت همین کد Request.UrlReferrer رو در Pageload صفحه استفاده کنید و تمام.

در صفحه pageload این کد رو می نویسم و خطا میده:


string a = Request.UrlReferrer.ToString();
if (a != "vorod.aspx")
{
Response.Redirect("vorod.aspx");
}
else
{
Label1.Text = "welcom";
}

اشکالش رو میشه تصحیح کنید...

sasansara
شنبه 20 خرداد 1391, 08:58 صبح
1- البته باید متن خطا رو بگید که بشه به نتیجه درست رسید. ولی اینطور که از متن کد میشه فهمید، اگه کاربر به فرض url صفحه رو از address bar به طور دستی وارد کنه، چون Request.UrlReferrer برابر null میشه، Request.UrlReferrer.ToString میتونه باعث خطا بشه.

2- تا جایی که من میدونم افزونه هایی برای بعضی از مرورگرها وجود داره که امکان مقداردهی UrlReferrer رو برای کاربر فراهم میکنه. بنابراین نمیشه به طور 100% به این روش اعتماد کرد.

hessam12
شنبه 20 خرداد 1391, 11:00 صبح
1- البته باید متن خطا رو بگید که بشه به نتیجه درست رسید. ولی اینطور که از متن کد میشه فهمید، اگه کاربر به فرض url صفحه رو از address bar به طور دستی وارد کنه، چون Request.UrlReferrer برابر null میشه، Request.UrlReferrer.ToString میتونه باعث خطا بشه.

2- تا جایی که من میدونم افزونه هایی برای بعضی از مرورگرها وجود داره که امکان مقداردهی UrlReferrer رو برای کاربر فراهم میکنه. بنابراین نمیشه به طور 100% به این روش اعتماد کرد.

وقتی پروژه را در صفحه ایی که کد urlrwferrer نوشته شده ران می کنیم چون مقدار اولیه null خطا میده، اما با کلیک روی لینک به صفحه منتقل بشیم کار می کنه.

بله انگار میشه تو اینجور برنامه ها امنیت رو دور زد ! اما چون تو پروژه ام امنیت به آنصورت ملاک نیست ازش استفاده کردم

aminghaderi
شنبه 20 خرداد 1391, 11:26 صبح
اشکالش رو میشه تصحیح کنید...
سلام.
تصیح نمی شه ، چون اصلا مکانیز عمل مشکل داره ، چون در رویداد PageLoad برسی می شه یا بهتر بگم چون توی سرور بررسی می شه و Redirect میشه ، اصلا صفحه ای درست نمی شه که url داشته باشه که در صفحه بعد بشه به اون استناد کرد.
این جوری که دوستان می فرمایند درسته ولی همه چیز دست برنامه نویس هست ، برنامه نویس هست که باید امنیت رو حفظ کنه ، نه کد های Asp.net .
-----------------------
اون راه حل که منتفی هست ، راه حل ساده ای که به ذهنم می یاد استفاده از session هست ، در صفحه اول در سشن یه مقداری قرار بدید و در صفحه دوم اون رو بررسی کنید اگر نبود بفرسید صفحه اول .
اگر از سشن نمی خواهید استفاده کنید از فیلد مخفی هم می شه در صفحه استفاده کرد.
با رشته تقاضا هم می شه ولی تشریفات داره ؟! یعنی باید کد منحصر به فرد داشته باشه ، از اون ور هم دی کد کنه و .... داستانی می شه برای خودش.

hessam12
شنبه 20 خرداد 1391, 22:36 عصر
سلام.
تصیح نمی شه ، چون اصلا مکانیز عمل مشکل داره ، چون در رویداد PageLoad برسی می شه یا بهتر بگم چون توی سرور بررسی می شه و Redirect میشه ، اصلا صفحه ای درست نمی شه که url داشته باشه که در صفحه بعد بشه به اون استناد کرد.
این جوری که دوستان می فرمایند درسته ولی همه چیز دست برنامه نویس هست ، برنامه نویس هست که باید امنیت رو حفظ کنه ، نه کد های Asp.net .
-----------------------
اون راه حل که منتفی هست ، راه حل ساده ای که به ذهنم می یاد استفاده از session هست ، در صفحه اول در سشن یه مقداری قرار بدید و در صفحه دوم اون رو بررسی کنید اگر نبود بفرسید صفحه اول .
اگر از سشن نمی خواهید استفاده کنید از فیلد مخفی هم می شه در صفحه استفاده کرد.
با رشته تقاضا هم می شه ولی تشریفات داره ؟! یعنی باید کد منحصر به فرد داشته باشه ، از اون ور هم دی کد کنه و .... داستانی می شه برای خودش.

سلام..
administrator و login پروژه را با authentication کار کردم فقط بخش هایی هم تو پروژه هست که با session نمیشه و باید با urlreferrer کار بشه!