بستن دسترسی به فایل های سرور در ASP.NET MVC
سلام به همه ی itpro ها
دوستان من یه برنامه ی تحت وب (asp.net mvc) نوشتم که داخلش یه سری عکس و فایل های دیگه آپلود میشه و تنها با لاگین کردن دسترسی به اون فایل ها توی سایت برقرار میشه اما خب این همیشه هست که اگر کسی آدرس فایل رو پیدا بکنه میتونه دانلودش کنه!
حالا سوال من اینه که چجوری میتونم این دسترسی هارو ببندم که تنها درگاه ورود و خروج فایل هام خود برنامم باشه.
اگر راهکارتون با رمزگذاری فایل هاست لطفا بگین دقیقا چجوری باید انجام بدم.
پیشاپیش ممنون از کمک شما
25 پاسخ
الان این لینک آواتار من:
https://web.tosinso.com/Avatars/c7d9b0f14eea4be89a80d0b11470e405-200-200.png
شما چطور میتونی به این لینک حق دسترسی بدی؟؟؟ نمیشه دیگه! باید از روی هاست، دسترسی به این پوشه رو قطع کنی، بعد یه اکشن یا هندلر بنویسی که عکس رو بیاره.
سلام ممنون از پاسختون
ولی فکر می کنم از داخل برنامه باید راه های بهتری برای این کار باشه
دوست من rezaya2938 عزيز
مورد اولي كه فرموديد من متوجه نميشم كه منظور شما چيه ؟! اگر اسم فايل قابل حدس زدن نباشه و محتويات داخل پوشه رو هم كه نشه ديد از كجا ميشه لينك مستقيم توليد كرد ؟! لطفا جواب بديد .
مورد دومي هم كه فرموديد هم اگر كمي توجه كنيد دو عبارت ضد و نقيض رو مطرح كرديد . آخر ميخوان دسترسي بدن يا نميخوان ؟ (به فايل مشخص)
آخر ميخوان طرف عكس رو ببينه يا نميخواد ؟
دوست من ، من تو دو تا پست قبلي مطرح كردم اگر موضوع دانلود فايل و قرار دادن لينك دانلود هست كه كلا موضوع از Action ها و Attribute ها قابل كنترل هست .
موفق باشيد .
دوست من توي MVC آدرس هايي كه از بيرون ميان مثل عكسي كه فرستادم همشون همونطوري كه گفتم تفسير ميشن و لا غير .
اين تمام .
حالا شما ميگي چطور ميخواهي به لينك مستقيم عكس دسترسي داشته باشي جواب اينه :
آدرس ها از داخل اكشن اگه ارسال بشن ديگه تفسير نميشن يعني اگر شما لينك عكس يا فايلي رو از داخل اكشن اي بفرستي همون ريسپانس ارسال ميشه براي كاربر . همن موضوع باعث امنيت بالا توي MVC هست .
اين هم براي روشن شدن موضوع :
[Authorize(Roles ="Admin")] [HttpGet] public ActionResult GetFile(string FileName) { //some code for check file is exist ...? return Redirect("http:/site.com/" + FileName); }
ضمن اينكه بسيار توصيه ميشه براي اينكه كاربر مسير و ساختار فايل و پوشه هاي شما رو نبينه و براي امنيت بيشتر ، اسم فايل رو براي دانلود تفسير كني . يعني زماني كه درخواست از سمت كاربر اومد شما در صورت وجود دسترسي كاربر و وجود اون فايل بيايي و يه كپي از اون فايل تو يه مسير fake اي بسازي و اون لينك دانلود رو در اختيارش قرار بدي .
موفق باشي.
دوست من parsasi عزيز ، خوب روش شما اشتباهه . روشت رو اصلاح كن .
تو اين روش چك كردن دستي لاگين اگر كسي آدرسي از وب شما رو بدونه (كه با پويشگرهاي آنلاين و آفلاين به سادگي يه آب خوردن در مياد) كه نياز به سطح دسترسي مثلا ادمين باشه شما چطوري ميتوني دسترسي اونو محدود كني ؟
اين تازه مورد پيش پا افتادش هست . امنيت تو اين روش زير صفره .
موفق باشيد .
ehsaniyaser عزیز منم دقیقا همین سوالی که rezaya2938 دارند رو دارم و متوجه نشدم من چجوری میتونم این کارو بکنم ببنید من که عکس رو از یه Action به کاربر نمیدم کاربر داره آدرس واقعیه عکس رو توی سرور من پیدا می کنه پس چجوری من میتونم با اون روش جلوش رو بگیرم ؟
خوب این آدرسی که شما دادید آدرس اکشن هست!
شما میخواید به یه عکس دسترسی داشته باشید، از اکشن اقدام میکنید؟؟ یا لینک مستقیم؟؟
site.com/folder1/image.png
این لینک مستقیمه، چطور میخواید با اکشن کنترلش کنید؟؟؟؟؟؟؟
براي مورد اول دو تا كار بايد انجام بديد :
1- براي اسامي فايلها از GUID استفاده كنيد كه هم تكراري نيست و هم قابل حدس زدن نيست . (مثل ITPro ) به اين ترتيب دسترسي به باقي فايلهاي داخل پوشه منتفي هست چون اسامي مشخص نيست و هيچ وقت نميشه محتواي كل پوشه رو مشاهده كرد چون MVC اين مجوز رو نميده .
2- براي محدود كردن دسترسي غير مجاز به پوشه از web.config با محتوا زير، در داخل همان پوشه كه قرار هست محافظت بشه استفاده كنيد : (البته اين مورد بيشتر تو وب فرم مرسوم هست )
<?xml version="1.0" encoding="utf-8"?> <configuration> <system.web> <authorization> <allow roles="admin" /> <deny users ="*" /> </authorization> </system.web> </configuration>
موفق باشيد .
"ضمن اينكه بسيار توصيه ميشه براي اينكه كاربر مسير و ساختار فايل و پوشه هاي شما رو نبينه و براي امنيت بيشتر ، اسم فايل رو براي دانلود تفسير كني . يعني زماني كه درخواست از سمت كاربر اومد شما در صورت وجود دسترسي كاربر و وجود اون فايل بيايي و يه كپي از اون فايل تو يه مسير fake اي بسازي و اون لينك دانلود رو در اختيارش قرار بدي . "
خوب این گفتار شما یعنی چی؟؟؟ یعنی اینکه اگه کاربر لینک مستقیم فایل رو داشته باشه میتونه خودش دانلود کنه دیگه!!
اگه توی این قطعه کد:
return Redirect("http:/site.com/" + FileName);
من کاربر، filename رو داشته باشم، خوب میشه لینک مستقیم دیگه!
شما خودت میگی باید آدرس رو مخفی کنی.(" براي اينكه كاربر مسير و ساختار فايل و پوشه هاي شما رو نبينه ")
بحث ما هم سر همینه. فرض اول بر اینه که کاربر ساختار پوشه های ما رو نمیدونه
اما اگه کاربر دونست چی؟؟؟
چطوری باید دسترسی به اون پوشه رو حذف کرد بصورت مستقیم؟؟؟
الان شما فرض کنید که فایل ها توی پوشه content/Folder ذخیره شده. چطور میخواید با کنترلر دسترسی کاربر رو چک کنید؟
مثلا اگه من این آدرس رو وارد کنم:
http://site.com/content/Folder/file.zip
شما اصلا چطور از کنترلر چنین چیزی رو میفهمید؟؟
تصویری که شما ارسال کردید برای درخواست صفحه از سرور هست. که موقع درخواست یه صفحه که اکشن هم داره، میشه توی کنترلر چک کرد دسترسی رو.
ولی لینک دانلود مسقیم رو چطور با کنترلر چک می کنید؟
باید دسترسی read از توی سرور برای اون پوشه برداشته بشه، بعد یه اکشن داشته باشید که با توجه به دسترسی کاربر، فایل رو برای دانلود ارسال کنه.
دوست من اصلا نيازي به مجوز فايلها و پوشه ها نداريد . اينجا وب هست ، شما هر لحظه مي خواهيد دسترسي ها رو تغيير بديد . مثلا به كسي دسترسي بديد يا ازش بگيريد .
روش كار همون چيزيه كه ارسال كردم . اگر سوالي هست بفرماييد .
موفق باشيد .
فکر نمیکنم از طریق خود برنامه بشه کاری کرد. شما که از طریق برنامه دسترسی برای مجوزهای پوشه ها و فایل ها ندارید. باید از طریق IIS یا httaccess باشه.
اگه هم روشی باشه من اطلاع ندارم. ولی من خودم زیاد دنبال روشی برای این کار گشتم سالهای قبل. بهترین روش همین بود که گفتم.
لطفا اگه روشی بهتر پیداکردید همینجا اطلاع بدید
سلام دوست عزيز
تو MVC مثل وب فرم نيست كه آدرس فايل رو بزنيد و اون آدرس لود بشه و فايل رو براي دانلود بياره . البته بايد دو تا نكته رو رعايت كرده باشيد .
1- فايلهاتون رو داخل پوشه Content ذخيره كرده باشيد . (ميتونيد داخل پوشه Content پوشه هايي رو جهت دسته بندي فايلها بسازيد ولي دسترسي به پوشه كانتنت از بيرون براي كاربر ها به سادگي فراهم نيست . )
2- توي MVC به اين صورت هست كه درخواست ها (Requests) بايد از فيلتر Control ها عبور كنند . شما به راحتي مي تونيد با گذاشتن Attribute مناسب بالاي كنترل يا Action مورد نظرتون كه به فايلها اجازه دانلود و دسترسي ميده درخواستهاي رسيده رو كنترل كني . مثل اين :
[Authorize(Roles = "Admin")] public ActionResult DownloadFile() { // Your Code return View(); }
به اين اكشن فقط كاربراني دسترسي دارند كه لاگين كرده باشند و رول اونها Admin باشه .
انشالله به زودي يه دوره آموزشي براي ASP.NET MVC توي ITPro قرار ميدم كه همه اينها رو تو قالب انجام پروژه تو خودش داره .
و حتي شما ميتوني يك Attribute اختصاصي براي خودت پياده سازي كني .
موفق باشي
اوکی بذارید ببینم شاید دوستان دیگه هم توی بحث وارد شدند. اونا هم نظر بدن.
من 4 ساله دارم یه سیستم که کارش همینه رو توسعه میدم، نظر من همیناست که گفتم.
من این کار رو کردم، نمیدونم تا چه حد درسته یا چقدر امنیت داره:
به پشتیبانی هاست بگید که تغییر زیر رو انجام بدن:
برای عدم دسترسی مستقیم به فایل های موجود در پوشه firstFolder/Myfiles:
۱- از تمظيمات IIS قسمت مربوط به تنظيمات برنامه
۲- قسمت request filtering
3- تب hidden segment
۴- add hidden segment
۵- توي ديالوگ باز شده نام Myfiles رو وارد کنيد
کی گفته توی mvc به پوشه content نمیشه دسترسی داشت؟؟ الان همین سایت که فکر میکنم mvc باشه:
https://tosinso.com/webContentstyles.css
پاسخ شما در صورتی درسته که دسترسی مستقیم به اون پوشه رو غیرفعال کرده باشیم، و بخوایم با یه اکشن برای کاربر دانلود بفرستیم. اینطوری میشه با فیلتر حق دسترسی داد.
دوست من دسترسي به فايل با دسترسي به css و js متفاوته چون شما (به عنوان كاربر سايت ) ساختار ذخيره سازي و محل اون رو نميدوني .
البته اگر بخواهي يه سايت دانلود داشته باشي كه كاربرا پول بدن و بعد دسترسي به فايل داشته باشن حتما و حتما بايد از روشي كه گفتم دسترسي رو فراهم كني . Attribute ها .
سلام دوست ItPro اي من
ببينيد اينجا دو تا مسئله كاملا متفاوت مطرح هستش :
1- شما ميخواهيد دسترسي به يك عكس رو تو يه پوشه محدود كنيد كه اون عكس توي وب شما آدرس دهي شده .
<img src="/Avatars/9eb616d4ffde42b8a45e4ee021187c83-200-200.png" class="img-responsive avatar avatar-md" alt="">
2- شما ميخواهيد كاربر بر روي لينكي كليك كند و در صورت داشتن مجوز امكان دانلود را داشته باشد.
شما دوستان عزيز كدوم مورد رو مد نظرتون هست 1 يا 2 ؟
دوست من سلام مجدد
آدرس ها توي MVC اينجوري تفسير ميشن :
http://site.com/someController/someAction/someParameters
اين چيزي كه شما نوشتي و تفسير كردي مال وب فرم هست نه MVC .
راجع به مورد اول که GUI بود اون رو من استفاده کرده بودم ولی rezaya2938 درست میگن در ضمن من rule تعریف نکردم و لاگین و اینارو دستی چک می کنم برای همین از این روش شما نمیتونم استفاده کنم.
با تشکر از پیگیری و پاسخ هاتون
سلام.
شما یه جورایی صورت مسئله رو پاک کردید.
مورد 1 که اسم فایل ها قابل حدس نباشه اوکی. ولی همچنان اگه لینک مستقیم باشه امکان دانلود هست. صورت مسئله پا برجاست.
مورد 2 هم، توی سناریو ای که دوستمون گفتن، میخوان فایل رو به افراد عادی یا حتی کاربر بدن، که رول همشون یکیه، پس به این صورت دسترسی دارن همشون به اون پوشه.
در جريان باش كه هر پاسخي بر اساس درخواستي از سمت كلاينت شكل ميگيره و مدل ارسال درخواست به سمت سرور همون عكسي هست كه ارسال كردم .
اگر مجوز داشته باشي دسترسي پيدا ميكني وگرنه نه .
دوست من اين آدرس از سمت سرور داره ارسال ميشه من هم اينو گفتم تو پست قبلي اگر دقت كرده باشي .
اگر بخواد ميتونه دسترسي به همين لينك از شما بگيره . لطفا يه سرچي تويه google بكن .
ehsaniyaser عزیز مورد اول منظورمه