aqbbqa
3 سال پیش توسط aqbbqa مطرح شد
8 پاسخ

استفاده از storage در لاراول

سلام خدمت همه دوستان کار درست راکت
آقا من یک سری تصویر دارم در وبسایتم که برام امنیتشون مهم هست. یعنی نمیخوام همه بهشون دسترسی داشته باشن. مثلا فقط اعضای ویژه بتونن ببینن
حالا اومدم اونها رو در storage در یک پوشه مثلا image ذخیره کردم
و پوشه storage رو به public لینک کردم
1- آیا پوشه storage دیگه امنیت نداره ؟ و آیا الان به همه تصاویری که من در مسیری که گفتم ، میتونن دسترسی داشته باشن؟
البته من گفتم که اگر کاربر وارد شده بود ، لینک رو نمایش بده ولی میخواستم بدونم با کاری که من کردم کاربر به همه فایل های storage هم مثل بقیه فایل های public دسترسی داره؟ یا اینکه چون در پوشه storage هستن ، فقط اونهایی که لود شدن فقط در دسترس هستند؟
میخواستم دوستان اگر راهی برای امنیت فایل های تصاویر بلدن لطفا راهنمایی کنن...
ممنون از عزیزان فعال راکت


ثبت پرسش جدید
محمدحسن یگانه
تخصص : Full-Stack Web Developer Freel...
@mhyeganeh 3 سال پیش آپدیت شد
0

کلا این قضیه چالش برانگیز هست ولی دو تا راهکار به نظرم می‌رسه:

1- شما تمامی تصاویرتون رو داخل همون public بگذارید. ولی نام گذاری هاشون به نحوی باشه که قابل حدس نباشه و مثلا از رشته های رندومی که اتومات تولید میشن استفاده کنید و بعد عنوان فایل رو داخل دیتابیس ذخیره کنید. حتی می‌تونید در فواصل زمانی معین این اسامی رو تغییر هم بدید. اینجوری احتمالش نزدیک به صفر هست کسی بتونه اسم فایل رو پیدا کنه و به تصویر دسترسی پیدا کنه. ولی اگر لینکش پخش بشه طبیعتا باز همون داستان خواهد بود.

2- راهکار دوم هم استفاده از response لاراول از نوع file به نحو زیر هست:

Route::get('/private-images/{file}', [ function ($file) {

    $path = storage_path('app/my_private_images/'.$file);

    if (file_exists($path)) {

        return response()->file($path, array('Content-Type' =>'image/jpeg'));

    }

    abort(404);

}]);
<img src="/private-images/1234.jpg" />

در کد بالا اول یک route برای بارگزاری تصاویر ایجاد کردیم. بعد اسم تصویر رو بصورت wildcard قرار دادیم. حالا اگر مسیر تعیین شده رو به المنت img بدیم مرورگر یک درخواست GET به اون آدرس ارسال می‌کنه و میاد داخل callback function که تعریف کردیم. تمامی اعتبار سنجی ها و ... رو میشه اونجا انجام داد و اگر همه چیز اوکی بود در پایان response()->file با مشخصات مورد نظر برمی‌گردونیم.


saman
@saman1111 3 سال پیش مطرح شد
0

سلام
وقتی توی قسمت پابلیک storage باشه و لینکش کرده باشین هر کسی میتونه با نوشتن آدرسش به اون فایل دسترسی داشته باشه

ولی قسمت پابلیکش فقط، یعنی فولدر app/public که داخلش هست

اگر خارج از این فولدر باشه از طریق آدرس قابل دستیابی نیست


سینا خاقانی
تخصص : توسعه دهنده بک‌اند
@sina.it91 3 سال پیش مطرح شد
0

@mahdicmptr
سلام
فایل storage در پوشه public کپی میشه و این ایرادی نداره
اگر میخواهید کسی به فایلهای ذخیره شده در storage دسترسی نداشته باشه باید فایلها رو به صورت زیر ذخیره کنید

Storage::disk('local')->putFile('./path', $request->file('image'));

اگر عبارت local رو در ذخیره سازی فایلها بکاربگیرید دیگه کسی نمیتونه به فایلها دسترسی داشته باشه


محمدحسن یگانه
تخصص : Full-Stack Web Developer Freel...
@mhyeganeh 3 سال پیش آپدیت شد
0

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

پس با این توضیح کلیه ی فایل هایی که خارج از این پوشه یعنی مثلا storage/app قرار داشته باشند قابلیت دسترسی عمومی و حتی دانلود مستقیم نخواهند داشت.

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


aqbbqa
تخصص : برنامه نویس
@mahdicmptr 3 سال پیش مطرح شد
0

ممنون از پاسخ دوستان
بله اگر من به صورت local تصاویر در storage ذخیره کنم کسی دسترسی نداره ولی در این صورت چطور باید برای نمایشش عمل کنم ؟ آخه فقط تصاویر داخل پوشه public رو میشه با تگ img نمایش داد.
راستش من میتونم الان اطلاعات رو در storage ذخیره کنم به طوری که کسی دسترسی نداشته باشه و کاری کنم کسی که شرط من رو داشت بتونه دانلودش کنه. بدون اینکه از پوشه پابلیک استفاده کنه. ولی مشکل من اینه که میخوام تصویر رو نمایش بدم بعد از اعتبار سنجی.
چطور میتونم تصاویری که در پوشه storage هستند رو بدون لینک کردن به public در تگ img نمایش بدم؟


aqbbqa
تخصص : برنامه نویس
@mahdicmptr 3 سال پیش آپدیت شد
0

@mhyeganeh ممنون از پاسخ کاملتون. راهی هست که تصویر رو دانلود کنیم و اون تصویر دانلود شده رو نمایش بدیم؟
مثل همین وبسایت راکت که ویدئو رو به کسی نمایش میده که خریداری کرده باشه
میشه برای عکس هم مثل ویدئو عمل کرد؟


محمدحسن یگانه
تخصص : Full-Stack Web Developer Freel...
@mhyeganeh 3 سال پیش آپدیت شد
0

کلا این قضیه چالش برانگیز هست ولی دو تا راهکار به نظرم می‌رسه:

1- شما تمامی تصاویرتون رو داخل همون public بگذارید. ولی نام گذاری هاشون به نحوی باشه که قابل حدس نباشه و مثلا از رشته های رندومی که اتومات تولید میشن استفاده کنید و بعد عنوان فایل رو داخل دیتابیس ذخیره کنید. حتی می‌تونید در فواصل زمانی معین این اسامی رو تغییر هم بدید. اینجوری احتمالش نزدیک به صفر هست کسی بتونه اسم فایل رو پیدا کنه و به تصویر دسترسی پیدا کنه. ولی اگر لینکش پخش بشه طبیعتا باز همون داستان خواهد بود.

2- راهکار دوم هم استفاده از response لاراول از نوع file به نحو زیر هست:

Route::get('/private-images/{file}', [ function ($file) {

    $path = storage_path('app/my_private_images/'.$file);

    if (file_exists($path)) {

        return response()->file($path, array('Content-Type' =>'image/jpeg'));

    }

    abort(404);

}]);
<img src="/private-images/1234.jpg" />

در کد بالا اول یک route برای بارگزاری تصاویر ایجاد کردیم. بعد اسم تصویر رو بصورت wildcard قرار دادیم. حالا اگر مسیر تعیین شده رو به المنت img بدیم مرورگر یک درخواست GET به اون آدرس ارسال می‌کنه و میاد داخل callback function که تعریف کردیم. تمامی اعتبار سنجی ها و ... رو میشه اونجا انجام داد و اگر همه چیز اوکی بود در پایان response()->file با مشخصات مورد نظر برمی‌گردونیم.


aqbbqa
تخصص : برنامه نویس
@mahdicmptr 3 سال پیش مطرح شد
0

@mhyeganeh ممنون از آقای یگانه عزیز بابت پاسخ کامل


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

@mahdicmptr
موفق و پیروز باشید.


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

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