PDA

View Full Version : امنیت داده های Hidden در Viewها



mmbguide
دوشنبه 15 فروردین 1401, 20:00 عصر
سلام

در View نمایش داده شده به کاربر یک جدول از اطلاعات دارم. حالا برحسب نیاز یا Id را نمایش میدم و یا بصورت Hidden نگهداری میکنم. مشابه همین موضوع برای دکمه های CRUD که مقدار Id را در یکی از پارامترها جهت استفاده نگهداری میکنم. حالا چطور میشه مطمئن بود که کاربر از طریق ابزار Inspect و یا هر ابزاری که محتویات صفحه وب را نمایش میدهد این مقدار را دستکاری نمی کند؟ آیا راهی برای تضمین نگهداری مقادیر مهم در Viewها وجود دارد؟ یکی از واردی که به ذهنم میشه اینه که برای هر جدول ضمن تعیین ستون Key یک ستون Unique هم ایجاد کنم که هیچ Relationی هم با جداول دیگر نداره و قبل از هر عملیاتی در بانک اطلاعاتی ابتدا همسانی بودن مقدار Id و Uniuq رو چک کنم اگر با اطلاعات ردیف متناظر همسان بودند پس مقدار Id صحیح است و عملیات انجام خواهد شد. ممنون اگر راهنمایی کنید

تشکر

mmbguide
دوشنبه 22 فروردین 1401, 23:35 عصر
سلام. دوستان کسی راه حلی برای این کار پیشنهاد نمیکنه؟ آیا راه حل پیشنهادی قابل استفاده است؟

mmbguide
یک شنبه 28 فروردین 1401, 09:30 صبح
اساتید لطفا کمک برسونید

مهدی کرامتی
یک شنبه 28 فروردین 1401, 12:42 عصر
آقای Sergey Akopov در یک مقاله در این آدرس (https://sergeyakopov.com/tamper-proof-hidden-fields-in-asp-net-mvc/) یک سری کلاس Html Helper و Attribute ساخته و ارائه کرده که در سمت View و بعنوان اتریبیوت روی فیلدهای مدل قابل استفاده است.
اگر هیدن فیلد خاصی رو در سمت ویو بخواهید رمزنگاری کنید از چنین دستوری بر اساس کلاس های ایشان استفاده خواهد شد:
@Html.SecureHiddenFor(model => model.SomeProperty)
در نتیجه، مقدار فیلد فوق در صورت Inspect کردن عنصر مورد نظر در صفحه این گونه دیده خواهد شد:
<input id="SomeProperty" name="SomeProperty" type="hidden" value="I love lamp">
<input name="__SomePropertyToken" type="hidden" value="zqb7MIL2Y5F3jL96ncdSZOmetL8g8RAWZP8Y/w/jUAKJ89GcUViRWOZ/XtQhtICMFZb4sQtZLOpqK/WyC0TFP0B6r+3nObFGDjb0U459yzQbadC4+DLIsTmhyYeT+ZT+ bnW1AEP2fgVyXXSduYIf5vns7g9nhRWTgJo8xF6NQyT6kNgyl5 puq+BYc8dfhMXn">

پس از اضافه کردن هلپر فوق در ویو، لازم است در بالای اکشن مورد نظر در کنترلر نیز اتریبیوت ValidateSecureHiddenInputs را به این صورت اضافه کنید:

[ValidateSecureHiddenInputs("SomeProperty")]
public ActionResult Index(MyViewModel model)
{
return View();
}
این اتریبیوت بررسی می کند آیا مقدار هیدن فیلد مورد نظر همانی هست که باید باشد و یا دستکاری شده است.

برای دریافت کلاسهای مورد استفاده در نمونه کدهای فوق به آدرس ذکر شده در ابتدای این مطلب مراجعه کنید.

mmbguide
یک شنبه 28 فروردین 1401, 15:46 عصر
جناب کرامتی عزیز ممنون از راهنمای شما

mmbguide
یک شنبه 28 فروردین 1401, 20:01 عصر
سلام.

مطابق راهنمای سایت کلاس ها را ایجاد کردم. در Edit View فیلد Id یک مقدار نامفهوم را نمایش میده ولی علاوه بر اون، مقدار اصلی هم نمایش داده میشه. با این حال در متد Edit با HttpPost صفت [ValidateSecureHiddenInputs("Id")] هم تعریف شده ولی اصلا کلاس Validation اجرا نمیشه. در حالت Debug اصلا ارجاعی به Validation داده نمیشه. اشتباه کار من کجاست؟ در واقع Helperهای جدید SecureHiddnFor را ایجاد میکنند ولی در زمان Post شدن اطلاعات فرم به متد Edit همچنان همان مقدار کلید اصلی ارسال میشه و چنانچه دستکاری هم بشه برنامه خطایی نمیگیره و اطلاعات ردیف دستکاری شده در بانک اصلاح میشه.

اینطور که متوجه شدم برنامه در View یک فیلد اضافه ایجاد میکنه که مقدار نامفهوم را تحت عنوان Token نگهداری میکنه و در زمان Post شدن اطلاعات فرم به متد مورد نظر، اطلاعات این فیلد به همراه نام فیلد جدید که در انتها عبارت Token داره را به سمت سرور ارسال میکنه و کلاس ValidateSecureHiddenInputsAttribute باید مقدار اصلی Id رو با Token دریافتی برمبانی الگوریتم تعریف شده بررسی کنه و اگر تطبیق نداشتند پیغام خطا صادر خواهد شد و در غیر اینصورت برنامه ادامه خواهد یافت.

:متفکر:

مهدی کرامتی
یک شنبه 28 فروردین 1401, 20:05 عصر
[ValidateSecureHiddenInputs("SomeProperty")]
public ActionResult Index(MyViewModel model)
{
return View();
}
اگر دقت کنید در بالای اکشن مورد نظر اتریبیوت ValidateSecureHiddenInputs رو بهمراه اسم فیلدی که میبایست توکن اش جهت جلوگیری ارزیابی بشه رو اضافه کرده.

mmbguide
یک شنبه 28 فروردین 1401, 20:29 عصر
اشتباه در using داشتم. کلاس ValidateSecureHiddenInputs از FilterAttribute ارث بری کرده که متعلق به فضای نام System.Web.Mvc هستش که من به اشتباه از System.Web.Http.Filters استفاده کرده بودم.

در ضمن در جایی از دستورات مربوط به HtmlExtensions یک تبدیل از نوع Binary انجام شده که متعلق به فضای نام System.Data.Linq می باشد.

mmbguide
چهارشنبه 11 خرداد 1401, 23:35 عصر
سلام

جناب کرامتی عزیز با توجه به راهنمایی که فرمودید تونستم مشکل را حل کنم. اگر بخوام این کار را برای تمام Viewها انجام بدم باید این صفت را که در آموزش قبلی اشاره کردید برای تمام متدها و فیلدهای مورد نظر اعمال کنم. صرفا یک سوال داشتم، آیا تنها راه همینه؟ منظورم این هستش که تمام برنامه های وب از این روش و یا روش های مشابه استفاده میکنند؟ علت سوالم این هستش که فکرم میکنم امنیت اطلاعات ارسال شده برای کاربر که می بایست مجددا پس از ویرایش به سمت سرور ارسال بشه خیلی مهمه و چرا این موضوع بصورت پیش فرض در تولید صفحات وب وجود نداره؟ جسارتا آیا خود شما از همین روش استفاده میکنید؟

تشکر

مهدی کرامتی
پنج شنبه 12 خرداد 1401, 18:11 عصر
آیا تنها راه همینه؟
تنها راه نه، منطقی ترین راه همینه.


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


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


آیا خود شما از همین روش استفاده میکنید؟
در سناریوهای مشابه فوق، بله.