احسان
4 سال پیش توسط احسان مطرح شد
11 پاسخ

محدود کردن دسترسی مستقیم به فایل‌هایی مانند تصاویر روی هاست

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


ثبت پرسش جدید
احسان
تخصص : توسعه دهنده وب
@ehsan99 4 سال پیش مطرح شد
1

چون بعد از چند روز جوابی نگرفتم، خواستم پُست رو آپدیت کنم شاید شخصی دید و پاسخ داد.
با سپاس


mmj-sys
تخصص : داش متخصص چیه من پروفسورم .
@mmj.sys 4 سال پیش مطرح شد
0

وقتی فایل htaccess را باز کردید کد زیر را درون آن قرار دهید

Options -Indexes

احسان
تخصص : توسعه دهنده وب
@ehsan99 4 سال پیش مطرح شد
0

@mmj.sys
متأسفانه این روش عمل نکرد و همچنان تصاویر قابل دسترسند.


آرش تقوی
تخصص : برنامه نویس فول استک
@arash.taghavi69 4 سال پیش مطرح شد
0

دوست عزیز منظورتون از اینکه نوشتین دسترسی فقط در صفحات وجود داشته باشه چیه؟


mmj-sys
تخصص : داش متخصص چیه من پروفسورم .
@mmj.sys 4 سال پیش مطرح شد
0

دوست عزیز این برای بستن دایرکتوری ها هست
و فکر نکنم بتونید فایل ها رو ببندید اگه بخواید این کار رو با شل هم انجام بدید بعد تو سایتتون هم نمایش داده نمی شن
اگه میشه یه کم بیشتر توظیح بدید تا بتونم کمکتون کنم
@ehsan99


احسان
تخصص : توسعه دهنده وب
@ehsan99 4 سال پیش مطرح شد
0

@arash.taghavi69 @mmj.sys
دوستان، فرض بگیرید افرادی پس از ثبت نام در سایت من، دارای پنل کاربری خواهند شد که متناظر با هر کاربر یک فولدر(پوشه) در قسمت پابلیک براش ایجاد می‌شه و تصاویری (اسنادی) که آپلود می‌کنه در فولدر متناظری، به فرض به ترتیب شماره گذاری می‌شوند.
مثلاً کاربر اول اسم فولدرش میشه1 و کاربر دوم میشه 2 و تصاویر درونشون هم به ترتیب بر اساس 1 و 2 و 3 شماره می‌خورند. پس یه چیز قابل حدس خواهد بود. به عنوان نمونه

کاربر اول با نام پوشه 1
1.jpg
2.jpg
.
.
کاربر دوم با نام پوشه 2
1.jpg
2.jpg
3.jpg
.
.
کاربر سوم با نام پوشه 3
1.jpg
2.jpg
.
.

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

http://site.com/images/2/1.jpg

اما همین تصویر در پنل کاربر از طریق کدهای php قابل مشاهده باشه:

<?php echo "<img src=\"images/2.1.jpg\""; ?>

سوال دوم:
راهکارهای اصولی برای جلوگیری از این موارد جهت حفاظت از تصاویر چیه؟

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

RewriteEngine on 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?example.com [NC] 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?example.com.*$ [NC] 
RewriteRule \.(pdf|jpg)$ - [F]

امیدوارم تونسته باشم منظورم رو واضح بیان کنم


آرش تقوی
تخصص : برنامه نویس فول استک
@arash.taghavi69 4 سال پیش مطرح شد
0

منظورتون رو متوجه شدم. تا جایی که من اطلاع دارم تفاوتی بین اجرا شدن عکس توسط تگ img و فراخوانیش توسط آدرسش توی مرورگر وجود نداره. یعنی شما اگر بخواین توی تگ img عکس رو لود کنید; طبیعتا توسط روش قبل هم قابل دسترسی هست. اگر دسترسی اجرا شدن فایل رو ببندید; تگ img هم دیگه نمیتونه عکس رو باز کنه.

یه سوال: این عکس ها کجا قرار هست نمایش داده بشن؟ داخل پنل کابر؟ یا بصورت عمومی توی سایت؟


احسان
تخصص : توسعه دهنده وب
@ehsan99 4 سال پیش مطرح شد
0

@arash.taghavi69
منطقاً هم همین موردی که شما فرمودید باید باشه. ولی باز با این وجود جست و جو کردم، دیدم مواردی گفته شده، برای همین کنجکاو شدم و روش‌هایی رو به کار بردم که جواب ندادند.
در مورد سوالاتون: قرار نیست عمومی باشه و کاربرها یا مدیر سایت باید بتونن این تصاویر رو ببینند.
حالا راهکارهای معمول برای هندل کردن چنین مشکلی چه مواردی‌اند؟
مثلاً قرار دادن در پوشه‌ی قبل از پابلیک که حالا در فریم ورکی مثل لاراول در storage میشه ذخیره کرد. لطفاً روش‌هایی که استفاده میشن یا خودتون استفاده می‌کنید رو بفرمایید تا هم من و شاید بقیه افرادی که در این زمینه اطلاعات کمتری دارند به کارشون بیاد.
با سپاس


آرش تقوی
تخصص : برنامه نویس فول استک
@arash.taghavi69 4 سال پیش مطرح شد
0

ببینید اینکه توی پوشه ی storage بگذارید هم فرقی نداره. درنهایت شما بازم باید یه سیمبلیک لینک (شورتکات) از storage به public بزنید تا عکس ها لود شه.
ببینید موضوعی که هست اینه که فرض کنید شما دسترسی مستقیم رو ببندید. بازم دردی دوا نمیشه. چون من لینک رو برمیدارم میبرم دستی میزارم توی یک تگ img و عکس رو لود میکنم و سیوش میکنم. به همین راحتی
من سرچ میکنم ببینم چه سولوشنی میشه پیدا کرد.


محمدحسن یگانه
تخصص : Full-Stack Web Developer Freel...
@mhyeganeh 4 سال پیش مطرح شد
1

دوست عزیز. در خصوص بعضی از asset ها مثل تصاویر و فونت ها و فایل های css و js و ... اگر خواسته باشید قابلیت لود شدن در مرورگر داشته باشه هیچ چاره ای نیست جز اینکه قابلیت دسترسی عمومی بهش وجود داشته باشه. هیچ راهی نیست. این فکت اول.

حالا برای جلوگیری از مشکلاتی که اشاره کردید چند تا کار معمولا انجام میدن:

اول اینکه نام گذاری فایل ها رو بصورت عبارات بی معنا و رندوم می‌گذارند که قابل پیش بینی نباشه. ولی باز هم اگر اسمشون رو داشته باشیم همچنان در دسترس هستند.

دوم روشی هست که در خصوص فایل هایی که کاربرد داره که قصد لود کردنشون رو نداریم و فقط می‌خواهیم که بعد از اعتبارسنجی بشه مستقیما دانلودشون کرد. برای اینکار باید فایل ها در یک پوشه قبل از پوشه public قرار داشته باشند. در لاراول هم باید در مسیر storage/app قرار بگیرند و نه storage/app/public و بعد مثلا در لاراول از دستور زیر استفاده کنیم:

return response()->download("path_to_file");

با این روش هیچ جوره نمیشه به خود فایل دسترسی مستقیم پیدا کرد.

یک روش خیلی دشوار دیگه هم به نظرم می‌رسه که اگر واقعا توجیه منطقی براش وجود داشته باشه میشه اصل فایل ها رو در پوشه قبل از public داشته باشیم و هر زمان ریکوئستی برای لود یک فایل خاص اومد بصورت موقتی (temporarily) یک کپی از اون فایل داخل پوشه public قرار بدیم و از اونجا لودش کنیم. یک اسکریپتی هم داشته باشیم که در فواصل زمانی مشخص چک کنه و فایل های موقتی قدیمی رو دوباره حذف کنه.


ایلیا غلامی
تخصص : برنامه نویس
@IliyaGholami 3 سال پیش مطرح شد
-3

سلام خب اگر پوشه assets تو public_html هست فکر کنم یه روش بشه انجام داد براش
پوشه assets رو به /home هاست انتقال بدید بعدش ادرس عکس و فایل هارو به صورت زیر بدید ../1.png


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام