PDA

View Full Version : امنیت آپلود فایل از طریق ftp



majid1605
پنج شنبه 01 خرداد 1393, 23:56 عصر
چندتا سوال در مورد امنیت آپلود فایل دارم امیدوارم که به جوابشون برسم.سوالها عمومی هستند ولی بنده از ftp برای آپلود میخوام استفاده کنم.
در ضمن تووی سایت هم کلی گشتم زیاد در این مورد مطلب مفیدی پیدا نکردم
تووی یک سایت چند مورد امنیتی در مورد فایل ها گفته بود که خیلی جالب بودن بیشترشون رو متوجه نشدم دقیقا چی هستند.
1-تغییر نام تووی ftp موقع استفاده از تابع put خیلی راحت انجام میشه و مشکلی نداره اما تووی اکثر سایتها ما وقتی فایلی رو دانلود می کنیم معمولا با همون نام واقعی و یا نامی که کاربری که آپلود کرده اونو دانلود می کنیم چون اگه قراره سیستم نام فایل رو تغییر بده معمولا یک نام درهم و نامفهوم است .
2-کلا فایلهای زبانهای برنامه نویسی به خصوص php خطرناک محسوب میشن تووی سایتهایی که مخصوص مدیریت پروژه هستند و کاربر کل پروژه رو آپ میکنه روی سرور چطور امنیت این سایتها با وجود این نوع فایلها تامین میشه؟نمونه مطرح github
3-محتوای فایل تست شده است و در صورت نیاز با یک آنتی ویروس و اسکنر بررسی دقیق شده است
منظور چی محتوا بررسی بشه ؟ چطور انجام بدیم ؟ برای فایلهای تصویر از کتابخونه gd میشه فایل رو خوند و دوباره بازنویسی کرد و اگه کدی همراهش باشه به احتمال زیاد حذف میشه امام یکجا خوندم اگه کدی به صورت حرفه ایی تووی عکسی جاسازی بشه این کتابخونه نمی تونه تشخیصش بده و یا فایل های دیگه هم ظاهرا کتابخونه های اینچنینی دارند.ولی اینکار خودش کلی بار اضافی داره
4-فایل‌های آپلود شده به پوشه قابل دسترسی مستقیم از طریق url منتقل نشده است
چطور دسترسی مستقیم رو بگیریم منظور همون راه ساده یک فایل index.html و یا فایل آپاچیه؟
5-فایل‌های آپلود شده، include نشده‌اند.
6-فایل‌های آپلود شده به وسیله سرآمد (header) امن Content-Disposition سرو شده‌اند (تا به عنوان فایل ضمیمه جهت دانلود ارائه شوند و تحت دامنه شما اجرا نشوند).
7-برنامه، سرآیند X-Content-Type-Options: nosniff را ارسال کرده است تا براوزر با توجه به محتوا mime_type را تعیین نکند و برخلاف میل شما آن را احتمالا اجرا کند
8-تا زمانی که ضرورتی درکار نبود، برنامه از ارسال فایل با هدر‌های application/octet-stream, application/unknown, plain/text اجتناب ورزیده است.
9-دسترسی به فایل‌ها، صرفا با مخفی کردن مسیر آنها انجام نشده است
10-فایل‌های راه دور (از آدرس هاستی دیگر) اینکلود نشده است

ممنون میشم توضیح بدید اگه با مثال باشه که چه بهتر

omidabedi
جمعه 02 خرداد 1393, 11:11 صبح
بعضی از ایتم هارو متوجه نشدم اما

1.میتونید یه کد تولید کنید و به اول نام فایل اضاف کنید و با خط فاصله از نام فایل جداش کنید اینجوری هم اسم فایل از بین نمیره هم .... برای دانلود هم میتونی همون کد رو پاک کنید و فایلو با نام اصلی ارائه بدید

2.اینگونه سایت ها و یا هاستینگ های رایگان نمیزارن هرکدی رو اجرا کنی یا من دیدم بوسیله ی انتی ویروس سرور شل هارو شناسایی میکنن و حسابت مسدود میشه

3.اینم که گفته با انتی ویروس چک شود خب شما میتونید از بعضی سایت های انلاین که با 10 12 تا انتی ویروسهای معروف چک میکنن فایل رو استفاده کنید و منظور از اسکنر اگر اسکنر نفوذ پذیری باشه برای ویندوز از acunitex میتونید استفاده کنید اگرم منظور ویروس یابی باشه که همون اسکن با انتی ویروس

4. متوجه نشدم اینو اما حدس میزنم که منظور شما اپلود فایل توی پوشه ای خارج از public_html باشه- خب وقتی اینجوری باشه فقط برنامه میتونه بهش دسترسی داشته باشه و برای دانلود یا ارائه ب کاربر میتونید یک کپی ازش رو وارد یه پوشه ای داخل public_html کنید و ارائه بدید و بعد حذفش کنید.

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

majid1605
جمعه 02 خرداد 1393, 13:24 عصر
گفتم که از شماره 3 به بعد مواردی بود که تووی سایت نوشته شده بود و خودم هم متوجه نمیشم منظورش چیه وگرنه خیلی راحت می تونستم تووی نت سرچ کنم ولی متاسفانه فقط این موارد رو ذکر کرده بودند بدون هیچ توضیح اضافی

omidabedi
جمعه 02 خرداد 1393, 18:41 عصر
میشه یه ادرسی بدید؟
اینا همش حالت خبری دارن ک :لبخند::متفکر:

majid1605
جمعه 02 خرداد 1393, 20:02 عصر
http://9px.ir/learn/php-application-security-checklist
یه سایت خارجی هم بود متاسفانه هیستوری مرورگر رو پاک کردم ادرسش رو ندارم تقریبا همینها رو با یکم اختلاف گفته بود

omidabedi
جمعه 02 خرداد 1393, 21:17 عصر
نوع فایل بر اساس mime_type اعتبار سنجی شده و فقط به پسوند آن بسنده نشده است
همچنین این نکته لحاظ شده که فایلی با mime_type تصویری gif باز هم ممکن است دارای اطلاعات غیرمترقبه باشد



این گفته که باید نوع فایل رو علاوه بر اینکه از روی پسوند چک میکنیم باید mime_type هم چک و مطابقت داده شوند






اگر فایل آپلود شده یک فایل html است، حتما به صورتی امن نمایش داده شده است



خب بعضی مواقع ما فایل html نیاز هست اپلود و نمایش داده بشن مثل همین rich text editor ها
خب اینجا باید بعضی از تگ های خطرناک مثل <script> مثل <embed> مثل <iframe> رو از متن شناسایی و حذف کنیم
و از تابع htmlentities بگذرونیم تا کارکتر ها تغییر کنن و خنثی بشن





فایل‌های آپلود شده، include نشده‌اند



فایلهایی که اپلود میشن بصورت مستقیم در صفحه include و جایگذاری نشده باشن





فایل‌های آپلود شده به وسیله سرآمد (header) امن Content-Disposition سرو شده‌اند (تا به عنوان فایل ضمیمه جهت دانلود ارائه شوند و تحت دامنه شما اجرا نشوند)



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





تا زمانی که ضرورتی درکار نبود، برنامه از ارسال فایل با هدر‌های application/octet-stream, application/unknown, plain/text اجتناب ورزیده است



تا وقتی لازم نباشه نباید هدر رو به این صورت تغییر بدید

majid1605
جمعه 02 خرداد 1393, 22:57 عصر
میشه در مورد سه تای آخر مثال های کاربردی بزنید ممنون

omidabedi
شنبه 03 خرداد 1393, 01:27 صبح
فایل‌های آپلود شده، include نشده‌اند





include('uploaded file.ext');






فایل‌های آپلود شده به وسیله سرآمد (header) امن Content-Disposition سرو شده‌اند (تا به عنوان فایل ضمیمه جهت دانلود ارائه شوند و تحت دامنه شما اجرا نشوند)



خب شما هر فایلی که فراخوانی شده و شما میخواید نمایش بدید توی php هدر رو تنظیم میکنی
یچیزی مثل این
اینجوری مرورگر مجبور میشه فایل رو دانلود کنه و در سرور اجرا نمیشه



header('Content-Disposition: attachment; filename="file.mp3"');








تا زمانی که ضرورتی درکار نبود، برنامه از ارسال فایل با هدر‌های application/octet-stream, application/unknown, plain/text اجتناب ورزیده است



اینم باز header هست که نوع فایل رو مشخص میکنه که اجرا بشه
این کد مشخص میکنه که چه فایلی میتونه اجرا بشه

application/octet-stream, application/unknown, plain/text یعنی هر گونه application و هرگونه فایلی اجرا بشه


header('Content-type:application/octet-stream, application/unknown, plain/text');

majid1605
شنبه 03 خرداد 1393, 23:20 عصر
میتونید یه کد تولید کنید و به اول نام فایل اضاف کنید و با خط فاصله از نام فایل جداش کنید اینجوری هم اسم فایل از بین نمیره هم .... برای دانلود هم میتونی همون کد رو پاک کنید و فایلو با نام اصلی ارائه بدید

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

omidabedi
یک شنبه 04 خرداد 1393, 10:17 صبح
بله این راه حل واسه زمانی که فقط میخوایم اجازه دانلود بدیم خوبه و احتمالا ماثر چون کاربر فقط اجازه دانلود داره نه اجرای فایل اما وقتی فایل عکس باشه و قرار باشه بین مطالب نمایش داده بشه چی ؟

تغییر نام تنها هدفش اینه که کسی که اپلودش کرده نتونه دسترسی مستقیم بهش داشته باشه و اصلا ربطی به امنیت کدی نداره.

فایل عکس باید با توابع GD بازنویسی بشه و بعد نمایش داده بشه