PDA

View Full Version : ایمن کردن استفاده از Hidden field در فرم های master-detail



sasansara
دوشنبه 22 مهر 1392, 08:09 صبح
من برای پیاده سازی فرم های master-detail، مقدار id مربوط به فرم master رو توی یه hidden field در فرم detail نگهداری می کنم.
می دونیم که کاربر می تونه با استفاده از ابزاری مثل Developer tools در مرورگر کروم، مقدار این hidden filed رو تغییر بده. مساله اونجاست که کاربر به این ترتیب امکان ویرایش ردیف داده ای رو به دست میاره که مجوز دسترسی به اون رو نداره.
مثلا من داده با id های 8 و 6 رو بهش نشون میدم ، ولی 7 رو نشون نمی دم چون دسترسی نداره، حالا موقع ویرایش 8، میاد مقدار hidden field رو 7 می کنه و در واقع اطلاعات داده 7 رو به طور غیر مجاز تغییر میده.

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

1- بررسی اجازه دسترسی کاربر به داده در حال ویرایش، قبل از انجام ویرایش
2- کد کردن مقدار id در هنگام قرار دادن در hidden field و دیکد کردنش در هنگام استفاده

دوستان اگه روش بهتری دارن یا فکر می کنن غیر از استفاده از hidden field روش های بهتری هست لطفا مطرح کنن.

متشکرم

saeed_sho
دوشنبه 22 مهر 1392, 16:33 عصر
یه متغیر private رو در کد بیهایند بصورت share یا در سی شارپ استاتیک تعریف کنید

sasansara
سه شنبه 23 مهر 1392, 00:50 صبح
یه متغیر private رو در کد بیهایند بصورت share یا در سی شارپ استاتیک تعریف کنید

متشکر دوست عزیز.

ولی استفاده از متغیرهای static در برنامه های asp.net صحیح نیست. چون این نوع متغیرها بین تمام کاربرانی که فرم موردنظر رو باز می کنن مشترک خواهد بود و فقط مقداری که آخرین کاربر در آن قرار می دهد، برای تمام کاربران در دسترس خواهد بود.

saeed_sho
جمعه 26 مهر 1392, 10:57 صبح
بهترین راه همون encrypt و decrypt کردن id در hidden field

mohammad973
جمعه 26 مهر 1392, 13:19 عصر
1- بررسی اجازه دسترسی کاربر به داده در حال ویرایش، قبل از انجام ویرایش
2- کد کردن مقدار id در هنگام قرار دادن در hidden field و دیکد کردنش در هنگام استفاده


میشه توضیح بدید چطوری کد و دیکد میشه کرد ؟

fakhravari
جمعه 26 مهر 1392, 13:43 عصر
از سشن استفاده کن.

mohammad973
جمعه 26 مهر 1392, 17:48 عصر
از سشن استفاده کن.

سلام آقای فخرآوری؛ سربازی چه ها که به سر آدم نمیاره ! پیر شدی ها پسر!!!

میشه بیشتر درباره این موضوع توضیح بدی برادر ؟

fakhravari
جمعه 26 مهر 1392, 19:34 عصر
فرم های master-detail که با تغیر query string انجام میشه.
حالا این وسط میخواهید یک سری id ها را داشته باشید میتونید اونو یا تو کوکی یا سشن بزارید.
شما میتونید یک لیست داشته باشید که کل id مطالب با سطح دسترسی داشته باشید و اونو در شسن بزارید و بخونید.................کار با لیست که بلدین که.........

آرام جان گل
جمعه 26 مهر 1392, 19:35 عصر
با سلام به شما دوست عزیز
با اجازه از دوستانی که در این بحث شرکت کردند
شما اگر تنها با همین صفحه کارمیکنید یعنی ارسال و دریافت هایتان در همین صفحه است می توانید از ViewState استفاده کنید که مقادیر شما را با وجود Request و response در خود نگه می دارد و طریقه استفاده از آن به روش زیر است :





private int xvOrderID

{



set

{



this.ViewState.Add("_xvOrderID", value);

}



get

{



if (this.ViewState["_xvOrderID"] != null)



return Convert.ToInt32(this.ViewState["_xvOrderID"]);



else



return 0;

}

}





دوست عزیز توجه کنید که شما مقدار xvOrderID را در یک فضای حافظه مانند به نام
_xvOrderID اضافه میکنید و هر بار مقدار موردنظرتون را در آن ذخیره می کنید و از آن می خوانید
برای مثال کد بالا را مثل تعریف داده ای در بالای کلاس فرم خود نوشته اید مثل :



private


int xvOrderID;


حالا به این حالت از آن استفاده می کنید :


xtblOrderDetail.vID = ++xvOrderID;

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


و اما اگر داده ای دارید که می خواهید در تمام سطح اپلیکیشن خود به آن دسترسی داشته باشید نیازی نیست از متغییر استاتیک استفاده کنید زیرا به همان دلیلی که خودتان گفتید مشکل ساز خواهد شد . متغییر استاتیک در سطح اپلیکیشن یکبار تعریف می شود و همه کاربران همان یک متغییر را خواهند دید
برای این منظور میتوانید از session استفاده کنید که مثل همان ViewState است یعنی یک حالت فضای حافظه ای دارد و همچنین توجه کنید که تایم اوت می شود مثلا بعد از 15 دقیقه مقدار درون ان reset می شود

برای استفاده از session به طریق زیر عمل کنید:



Session[

"UserCode"] = 12;

کد بالا برای این است که آنرا پر کنید و کد زیر برای استفاده از آِن



xtblOrderDetail.tblOrderDetailAdditionalServices.x Name = Session[

"UserCode"].ToString();


شما به هر تعداد که بخواهید می توانید از متغییر های session تعریف کنید
متغییر های session به حالتی هستند که برای هر کاربری که وارد اپلیکیشن شده یک فضا درنظرمیگیرد و تداخلی از این لحاظ برای کاربران به وجود نخواهد آمد

اگر درمورد این مطالب در اینترنت سرچ کنید احتمالا مطالب بهتری می یابیدو موفق باشید

sasansara
شنبه 27 مهر 1392, 08:15 صبح
با سلام

تشکر از دوستانی که در این بحث شرکت کردن

1- در جواب دوستی که سئوال کردن در مورد کد و دیکد کردن. منظور این هست که هنگام نمایش فرم detail، به جای خود id، کد شده اون رو در hidden field قرار بدیم تا کاربر نتونه مقدار اون رو به راحتی تغییر بده و در هنگام ثبت فرم هم id مورد نظر رو دیکد کرده و استفاده کنیم. اگه منظورتون نحوه کد و دیکد کردن هست که روش های مختلفی هست که تو اینترنت می تونین جستجو کنید.

2- دوستی که استفاده از viewstate رو پیشنهاد دادن، بنده از mvc استفاده می کنم.

3- در مورد استفاده از session باید بگم که درسته، این روش ساده ترین حالت ممکن هست، اما یه مقدار مدیریت قضیه دشوار میشه. چون اگه کاربر فرم ویرایش رو برای مثلا خبر با id شماره 10 باز کرده باشه و همون لحظه فرم ویرایش رو برای خبر با id شماره 11 باز کنه، مقدار session برای خبر اول از دست میره.

4- تو این چند روز با بررسی هایی که کردم فعلا به این نتیجه رسیدم که شاید روش بهتر همون بررسی سطح دسترسی هست. چون اصولا در وب درخواست ها به هر صورتی ممکنه ارسال بشن( با تغییر کلید داده ها، با فرم های جعلی و ...) و برنامه ما برای اینکه پاسخ ایمن و صحیحی بفرسته، باید بررسی کنه که آیا این درخواست از طرف کاربر مجاز و برای داده مجازی ارسال شده یا خیر