PDA

View Full Version : امنیت در آپلود فایل ها



olampiad
جمعه 17 مهر 1394, 14:33 عصر
سلام و خسته نباشید به دوستان عزیز
چند روزی بود در مورد مبحث آپلود امن فایل ها و جلوگیری از آپلود شل تحقیق میکردم.
به مطالبی مفیدی دست پیدا کردم ، در اینجا مطرح میکنم اگه چیزی از قلم افتاده بود بگین تا مطلبمون کامل بشه.
ممنون

هیچ گاه خود تصویر رو مستقیما آپلود نکنیم و با استفاده از توابع gd این کار رو انجام بدیم.(تو مطالب قدیمی تر این روش رو معرفی کرده بودن ولی تو ی جایی خوندم که این روش هم دیگه امن نیستش)

هر فایلی رو که آپلود میکنیم حتما با روش های مختلف تغییر نام بدیم.یعنی اگه فایل one.jpg بود به hajsdkjsd47as8asf.jpg تغییر دهیم.

با استفاده از $_file['img']['type'] نوع فایل رو تشخیص بدیم(این روش زیاد تاثیری نداره یعنی زیاد مهم نیست)

تو یه جایی میخوندم که با استفاده از htaccess در بعضی از فولدر ها اجازه اجرای فایل های php رو ندهم.یعنی تو فولدری که فقط عکس آپلودکردیم یا تو فولدری که فقط فیلم آپلود کردیم اجازی اجرای فایل های php رو ندهیم.

در مورد آپلود با توابع gd کد آماده یا کلاسی دارید که دیگه من دنبال توابع نباشم.

خواهشا اگه مطلبی دارید که کمکمان میکند بیان کنید.

kabootar_y
جمعه 17 مهر 1394, 19:34 عصر
وقتی توی سایت از قابلیت File Upload استفاده میکنیم باید چه نکات امنیتی را رعایت کنیم؟

(http://www.geekfarsi.com/وقتی-توی-سایت-از-قابلیت-file-upload-استفاده-میکن/377)

خیلی از مواقع پیش میاد که ما توی وب سایتی که توسعه میدیم نیازمند ارسال فایل بواسطه کاربر هستیم. مثل مواقعی که نیاز داریم کاربر عکس پروفایل یا رزومه‌اش را ارسال کنه. اگرچه پروسه ارسال فایل کلاً موضوع پیچیده‌ای نیست اما یکسری مسائل امنیتی هست که حتماً باید رعایت بشه.


http://www.geekfarsi.com/wp-content/uploads/2015/05/99.jpg


۱ – یکی از مواردی که اهمیت داره این هست که فایل را با نام اصلیش ذخیره نکنیم و اگه در آینده نیاز به بازیابی فایل با همون نام اصلیش هست فقط کافیه در زمان ذخیره فایل نامش را توی پایگاه داده نگهداری کنیم. نام فایل جدید میتونه یک MD5 HASH یا حتی شماره رکورد با اندکی تغییرات منطقی باشه.
۲ – بهتره فایل را خارج از Document Root ذخیره کنیم. در این صورت هیچ‌کس امکان دسترسی از طریق وب به مسیر ذخیره شده را نداره.
۳ – حتماً توی برنامتون برای فایل‌ها محدودیت حجم بگذارین ، قطعاً وقتی یک عکس پروفایل در فرمت JPG و سایز ۱۲۰×۱۰۰ در DPI ۷۲ مورد نیاز هست در نتیجه حجم ارسالی نباید مثلاً از ۱۰۰ کیلوبایت بیشتر بشه.
۴ – علاوه بر محدودیت حجم حتماً محدودیت تعداد فایل در یک Request را از طریق max_file_uploads اعمال کنید تا از حملات DOS در امان باشین.
۵ – توجه داشته باشین که پسوند فایل‌ها نشون دهنده این نیستند که فایل واقعاً کارایی مرتبط با پسوندش را داره. یک فایل ممکنه با پسوند jpg ارسال بشه ولی واقعاً یک فایل عکس نباشه و سمت سرور یا کلاینت بتونه مشکلات امنیتی به وجود بیاره. شما حتما باید با استفاده از ابزار و توابع موجود بررسی عمیق‌تر از پسوند فایل انجام بدین. مثلاً در مورد فایل‌های عکس میتونین با استفاده از تابع getimagesize اطلاعات بیشتری را نسبت به فایل بدست بیارین و کاملاً مطمئن بشین اون فایل یک عکسه.
۶ – متأسفانه با وجود بررسی پسوند و Header و استفاده از ابزار شناسایی دیگه باز هم امکان داره فایل مورد نظر آلوده به Bug ها و Exploit های فایل‌های مختلف از جمله همون عکس‌ها باشه.در این رابطه بهترین کار این هست که از طریق یک نرم‌افزار Malware Scan بررسی های بیشتری انجام بدیم. این کار را میشه با ارسال فایل (با استفاده از CURL) به سایت‌های Malware Scan آنلاین مثل virustotal.com انجام داد ، خودتون هم میتونید میزبانی اختصاصی بگیرین و نرم‌افزار مورد نظرتون را نصب کنید و از طریق ابزار اون فایل‌ها را بررسی کنید.
۷ – پس از Upload فایل روی سرور حتماً سطح دسترسی به فایل را کنترل کنید. البته مدیر سیستم عموما موارد امنیتی را انجام داده و مانع از دسترسی های غیر ضروری مثل اجرایی بودن شده اما شما هم میتونید این دسترسی ها را کنترل کنید. این کنترل هم میتونه روی خود فایل باشه یا روی پوشه ای که فایل در اون ذخیره میشه.
امیدوارم با رعایت موارد بالا امنیت بخش ارسال فایل سایت شما بهبود پیدا کنه.

منبع: http://www.geekfarsi.com (http://www.geekfarsi.com/وقتی-توی-سایت-از-قابلیت-file-upload-استفاده-میکن/377)

olampiad
جمعه 17 مهر 1394, 19:57 عصر
منظور از این متن چیست؟
۲ – بهتره فایل را خارج از Document Root ذخیره کنیم. در این صورت هیچ‌کس امکان دسترسی از طریق وب به مسیر ذخیره شده را نداره.
خارج از document root چیست؟
مرسی

hamedarian2009
جمعه 17 مهر 1394, 21:17 عصر
منظورش خارج از پوشه public_html در هاست هست که پوشه آپلود فایل هاتون داخل اون باشه اونوقت دیگه کسی نمیتونه بهش دسترسی داشته باشه

pbm_soy
جمعه 17 مهر 1394, 23:12 عصر
منظورشون خارج از فولدر وب سایت در سرور هاست است
برای اینکه برای یک سایت فضایی داده بشه یک فولدر در سرور ایجاد میشه و آن فولدر را فولدر وب سایت موردنظر معرفی میکنند در وب سرور
حالا دوستمون گفته که شما برای امنیت بالا فایلها را در داخل فولدر وب سایت و یا زیرفولدرهای آن ذخیره نکنید فایلها را بیرون از فولدر وب سایت ذخیره کنید مثلا یک فولدر عقب تر ویا همان در فولدر والدین
برای اینکار شما باید به سرور دسترسی کاملی باید داشته باشید چون وقتی هاست میگیرید فقط به فولدر خود سایت وزیرفولدرهای آن دسترسی دارید البته این مورد بطور استاندارد گفته میشود و حالا کاری ندارم با مباحث هک و غیره که میتوان آنرا دور زد و به بیرون از فولدر هاست هم میتوان دسترسی داشت
تقریبا این روشی که گفتن بهترین حالت امنیت فایلها میباشد
برای امنیت میتوانید فایلها را در دیتابیس میتوانید ذخیره کنید این روش هم از لحاظ امنیتی دست کمی از روش گفته شده ندارد مضافا براینکه امنیت دیتابیس سرور هم یک لایه به امنیت فایلها اضافه میکند و میتوانید موارد امنیتی دیتابیس را بالاتر ببرید البته این روش زمانی خوب است که حجم فایلها زیاد نباشد درغیراینصورت حجم دیتابیس بالا میرود و امکان دارد کارایی دیتابیس پایین بیاید مگر اینکه سرور دیتابیس منابع خوبی داشته باشد

pbm_soy
جمعه 17 مهر 1394, 23:37 عصر
یک مورد دیگه یادم آمد که بد نیست بگم آنهم اینه که شما با آپلود فایل در فولدر بیرون از فولدر هاست قدرت اجرای مستقیم آن از طریق وب سرور را خواهید گرفت
تمام موارد گفته شده در پست اول و دوم خوب هستند هرکدام از این روشها یک لایه به امنیت فایلها و خود وب سایت اضافه میکند
حالت بهتر این الگوریتم این است که شما فایلها را در سروری دیگر آپلود کنید و نگهداری کنید دراینصورت با هک شدن وب سایت و یا حتی این سرور میتوانید از امن بودن فایلها در سروری دیگر مطمین باشید البته این مورد هم همیشه قطعی نیست! برای اینکار هم میتوانید در سروری دیگر یک هاست بگیرید که در آن فقط فایل نگهداری کنید در واقع یک هاست فایل یا یک هاست ftp و هیچ کدی در آن نمیگذارید چون کدی در آن قابل اجرا نیست
البته میتوانید یک هاست معمولی وب بگیرید و در آن فقط یک فایل indexخالی بگذارید و فایلها را از طریق ftp آن به آن آپلود کنید

در ضمن توجه کنید که کار آپلود کردن در سرور دیگر از طریق وب سایت خودتان صورت میگیرد و هیچ کدی در سرور دوم یا هاست دوم وجود ندارد با استفاده از دستورات ftp فایل را از راه دور از هاست خودتان به آن هاست میفرشتید و فایل آپلود شده در هاست خودتان را نیز حذف میکنید وهرگاه به آن فایل نیاز بود دوباره توسط دستورات ftp آن فایل را به هاست وب سایت و یا همان فولدر سایت دانلود میکنید و در سایت آنرا نمایش میدهید و یا دانلود میدهید و بعداز آنکه کار کابری با آن تمام شد دوباره آن فایل را از هاست وب سایت حذف میکنید
Ftp server هم همیشه با نام کاربری و رمزعبور محافظت میشود مگر اینکه بدون محافظت گذاشته شده باشد
در مورد نوع فایلهای آپلودی هم دوستمون در پست دوم تقریبا تمام و کمال گفتن فقط من روشی که خودم استفاده کردم را اینجا عرض میکنم
برای نوع فایل پسوند فایل را چک میکردم و سپس در هدر فایل امضای فایل را بررسی میکردم که متناسب با پسوند و محتوای که میخوام باشند معمولا دو یا سه بایت اول فایلها امضای فایل است مثلا فایلهای تصویری bitmap دو بایت اولش BM است و بقیه فایلها هم اینگونه هستند سپس سعی میکردم محتوای فایل را اسکن کنم و دنبال بایتهای مخرب باشم به عنوان مثال داخل فایل تصویر امکان دارد در انتهای یک فایل تصویر یک اجرایی php گذاشته باشند و یا جاهای دیگر گذاشته باشند و یا حتی کدهای ماشین bind کرده باشند
درکل روشی که دوستمون گفتن استفاده از virustotal.com خوب و عالی است فقط باید دید از لحاظ سرعت چطور عمل میکند

H:Shojaei
شنبه 18 مهر 1394, 09:34 صبح
یک مورد دیگه یادم آمد که بد نیست بگم آنهم اینه که شما با آپلود فایل در فولدر بیرون از فولدر هاست قدرت اجرای مستقیم آن از طریق وب سرور را خواهید گرفت
تمام موارد گفته شده در پست اول و دوم خوب هستند هرکدام از این روشها یک لایه به امنیت فایلها و خود وب سایت اضافه میکند
حالت بهتر این الگوریتم این است که شما فایلها را در سروری دیگر آپلود کنید و نگهداری کنید دراینصورت با هک شدن وب سایت و یا حتی این سرور میتوانید از امن بودن فایلها در سروری دیگر مطمین باشید البته این مورد هم همیشه قطعی نیست! برای اینکار هم میتوانید در سروری دیگر یک هاست بگیرید که در آن فقط فایل نگهداری کنید در واقع یک هاست فایل یا یک هاست ftp و هیچ کدی در آن نمیگذارید
واسه این مورد که تو سرور دیگه عکس آپلود بشه یه سوال دارم این که مگر غیر از این نیست که فایل عکس بالاخره آدرس دهی میشه به همین سایت مرجع که نشون داده بشه!؟
تو این مورد آیا فایل اگر مخرب باشه اجرا میشه تو سروری که آدرس دهی شده یعنی تو سایت ما؟ یا اصلا این کار روی امنیت این که فایل توی سایت اجرا نشه انجام میشه یا این که صرفا یک پشتیبان فایل داشته باشیم!؟

us1234
شنبه 18 مهر 1394, 17:01 عصر
واسه این مورد که تو سرور دیگه عکس آپلود بشه یه سوال دارم این که مگر غیر از این نیست که فایل عکس بالاخره آدرس دهی میشه به همین سایت مرجع که نشون داده بشه!؟
تو این مورد آیا فایل اگر مخرب باشه اجرا میشه تو سروری که آدرس دهی شده یعنی تو سایت ما؟ یا اصلا این کار روی امنیت این که فایل توی سایت اجرا نشه انجام میشه یا این که صرفا یک پشتیبان فایل داشته باشیم!؟

فایل در جایی که قرار دارد اجرا میشود ( به شرط اینکه هاست حتما وب سرویس داشته باشد و قابلیت اجرا کردن فایل های php یا فایل های دیگر را داشته باشد )
اینکه یک فایل در یک صفحه دیگر لود شود برای نمایش دهنده خطری ندارد مگر در شرایط خاص
مثلا اگر اون فایل که لینک داده شده است جاوا اسکریپت باشد میشود کوکی های کاربر را با آن دزدید ...

اصولی ترین کار برای آپلود عکس استفاده از توابع GD است . ( ساخت یک کپی از تصویر و ذخیره آن )

H:Shojaei
شنبه 18 مهر 1394, 22:36 عصر
فایل در جایی که قرار دارد اجرا میشود ( به شرط اینکه هاست حتما وب سرویس داشته باشد و قابلیت اجرا کردن فایل های php یا فایل های دیگر را داشته باشد )
اینکه یک فایل در یک صفحه دیگر لود شود برای نمایش دهنده خطری ندارد مگر در شرایط خاص
مثلا اگر اون فایل که لینک داده شده است جاوا اسکریپت باشد میشود کوکی های کاربر را با آن دزدید ...

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