امنیت آپلود فایل و ثبت دیتابیس

- 1 ماه پیش
توسط علی آپدیت شد
علی سرلک ( 915 تجربه )
1 ماه پیش

سلام دوستان ، وقت بخیر

من سوال درمورد امنیت داشتم ، اسکریپتی نوشتم که تقریبا تازه کار هستم در php

  • یک قسمت هست که بصورت base64 تصویری رو از کاربر میفرستم و با @file_put_contents روی سرور ذخیره میکنم ، برای اینکه مشکل امنیتی نداشته باشه چطور چک کنم و بعد ذخیره کنم .

  • دو اینکه برای ثبت نام کاربر ، ورودی های $_POST رو به چه صورت چک کنم و بعد ذخیره کنم .

  • سوم برای چک کردن لاگین بودن و نگهداری سشن و کلا دسترسی به صفحات با نیاز لاگین چه شکلی این محدودیت رو اعمال کنم .

  • و مورد آخر اینکه من دیتابیسی برای کدتخفیف هر کاربر ساخته م که به اعضای هر یوزر بعد از یک اکشن یک کد از دیتابیس که استفاده نشده گرفته و به کاربر اختصاص بده ، برای اینکه کد رو از دیتابیس بگیرم که نه تکراری باشه و نه اینکه یوزر بتونه نفوذی داشته باشه ، چکاری انجام بدم .

باتشکر فراوان از راهنمایی‌هاتون : )

بهترین پاسخ انتخاب شده توسط علی سرلک
علی
1 ماه پیش

سلام
داداش سوال اولتون واضح نیست می خواین فایل از کاربر دریافت کنین؟؟
اما سوال دوم بسته به اینه ورودی هاتون چی باشن می تونید خیلی کار انجام بدین تما تحت هر شرایطی اول باید داده ها رو فیلتر کنین تا تر و تمیز باشن و دچار خطرات اس کیو ال اینجوشن و تزریق اسکریپت قرار نگیرین.
مثلا می تونین از توابع
Trim() برای حذف فضا های خالی
Strip_tags () برای حذف تگ های اچ تی ام و جاوا اسکریپت و...
Htmlintitis()
Htmispecialchars() برای یونیکد کردن تگ ها
حالا توابع دیگه ای هم وجود داره که می تونین استفاده کنین برای پاکسازی اولیه داده اما بعدش
مثلا شما می خواین شماره تماس بگیرین حتما باید چک کنید که ورودی کاربر عددی باشه و اینپوت خالی نباشه ... و مثلا حتما طول ورودی 11 کاراکتر باشه که این مورد رو می تونی با شرط ها و توابعی که موجودن انجام بدین یا از عبارات منظم استفاده کنین.
مثلا برای ایمیل دوباره همین جریان صادقه حتما بک فرمت قابل قبول رو برای ایمیل در نظر بگیرین تا حتما ایمیل حقیقی دریافت کنین بهترین حالت استفاده از عبارات منظم.
بعد از اینکه مراحل انجام شد می تونین کوئری insert رو اجرا کنین
اما سوال سوم اول باید داده ها رو از دیتابیس چک کنین : مثلا نام کاربری و ایمیلی که وارد میشه رو دریافت کنین برین در جدول کاربران دنبال رکوردی بگردین که اون نام کاربری و اینیل توسون وجود داشته باشه اگه وجود داشت یک رکورد بر می گرده یعنی یک کاربر وجود داره بهتره این مورد داخل شرط بررسی بشه اگه وجود داشت داخل بلاک شرط سشن رو ایجاد می کنین و مقدار می دین پس هر وقت داده ها درست بودن سشن ایجاد میشه و مثلا بهش مقدار true رو میدین حالا برای اینکه دسترسی به صفحات سایت رو محدود کنین به لاگین بودن کاربر اول باید توی اون صفحات با شرط مثلا if بررسی کنین ببینید ایا سشن مد نظر شما که همون سن یوزر ها خواهد بود وجود داره یا نه یا اصطلاحا isset شده یا نه اگر وجود داشت کاربر رو هدایت می کنین به صفحه دلخواهتون در غیر اینصورت به هر صفحه ای که خواستین مثلا صفحه لاگین.
اما سوال اخر
شما اگه می خواین کد های تخفیف رو داخل جدول جدا ذخیره کنید و به ازای هر اکشن یک تخفیف رو به کاربر ارسال کنین من پیشنهاد می کنم اینطوری کار کنین هر وقت اون اکشن مورد نظر شما انجام شد یک رشته تصادفی تولید کنین با تابع rand یا با md5 یا هر فرمت دیگه ای این رشته تصادفی رو همرا با id کاربر ببرین در دیتابیس داخل جدول تخفیفات ذخیره کنید اینطوری اولا به ازای هر کاربر یک کد تخفیف ست میشه و اینکه هیچکسی نمی تونه کد تخفیف شما رو حدس بزنه حالا اگه همین کاربر دوباره همون اکشن رو انجام دادا قبل از اینکه بخواین بهش کد تخفیف بدین اول بررسی کتین ببینین برای این کاربر توی جدول تخفیفات کد تخفیف ثبت شده یا نه ازid کاربر اینجا می تونین استفاده کنین اگر ثبت شده ای دی ها تطابق دارن شرط کوئری تون باید ایدی باشه و برای اینکه بدونین کدوم کد تخفیف استفاده شده توی همون جدول تخفیفات یه فیلد مثلا به اسمactive قرار بدین که مقدار پیش فرضش 0 باشه حالا هر وقت مثلا تو سبد خرید شما این کد تخفیف اعمال شد مقدار اتیو رو به 1 تغییر بدین و قبل از اعمال هر کد تخفیف فیلد active رو بررسی کنین که 0 باشه (یعنی استفاده نشده) و همچنین ای دی کاربر رو برای اینکه بدنین دقیقا این کد برای این کاربر ارسال شده تا بتونین کد های استفده شد ونشده رو تشخیص بدین .....

علی ( 1345 تجربه )
1 ماه پیش

سلام
داداش سوال اولتون واضح نیست می خواین فایل از کاربر دریافت کنین؟؟
اما سوال دوم بسته به اینه ورودی هاتون چی باشن می تونید خیلی کار انجام بدین تما تحت هر شرایطی اول باید داده ها رو فیلتر کنین تا تر و تمیز باشن و دچار خطرات اس کیو ال اینجوشن و تزریق اسکریپت قرار نگیرین.
مثلا می تونین از توابع
Trim() برای حذف فضا های خالی
Strip_tags () برای حذف تگ های اچ تی ام و جاوا اسکریپت و...
Htmlintitis()
Htmispecialchars() برای یونیکد کردن تگ ها
حالا توابع دیگه ای هم وجود داره که می تونین استفاده کنین برای پاکسازی اولیه داده اما بعدش
مثلا شما می خواین شماره تماس بگیرین حتما باید چک کنید که ورودی کاربر عددی باشه و اینپوت خالی نباشه ... و مثلا حتما طول ورودی 11 کاراکتر باشه که این مورد رو می تونی با شرط ها و توابعی که موجودن انجام بدین یا از عبارات منظم استفاده کنین.
مثلا برای ایمیل دوباره همین جریان صادقه حتما بک فرمت قابل قبول رو برای ایمیل در نظر بگیرین تا حتما ایمیل حقیقی دریافت کنین بهترین حالت استفاده از عبارات منظم.
بعد از اینکه مراحل انجام شد می تونین کوئری insert رو اجرا کنین
اما سوال سوم اول باید داده ها رو از دیتابیس چک کنین : مثلا نام کاربری و ایمیلی که وارد میشه رو دریافت کنین برین در جدول کاربران دنبال رکوردی بگردین که اون نام کاربری و اینیل توسون وجود داشته باشه اگه وجود داشت یک رکورد بر می گرده یعنی یک کاربر وجود داره بهتره این مورد داخل شرط بررسی بشه اگه وجود داشت داخل بلاک شرط سشن رو ایجاد می کنین و مقدار می دین پس هر وقت داده ها درست بودن سشن ایجاد میشه و مثلا بهش مقدار true رو میدین حالا برای اینکه دسترسی به صفحات سایت رو محدود کنین به لاگین بودن کاربر اول باید توی اون صفحات با شرط مثلا if بررسی کنین ببینید ایا سشن مد نظر شما که همون سن یوزر ها خواهد بود وجود داره یا نه یا اصطلاحا isset شده یا نه اگر وجود داشت کاربر رو هدایت می کنین به صفحه دلخواهتون در غیر اینصورت به هر صفحه ای که خواستین مثلا صفحه لاگین.
اما سوال اخر
شما اگه می خواین کد های تخفیف رو داخل جدول جدا ذخیره کنید و به ازای هر اکشن یک تخفیف رو به کاربر ارسال کنین من پیشنهاد می کنم اینطوری کار کنین هر وقت اون اکشن مورد نظر شما انجام شد یک رشته تصادفی تولید کنین با تابع rand یا با md5 یا هر فرمت دیگه ای این رشته تصادفی رو همرا با id کاربر ببرین در دیتابیس داخل جدول تخفیفات ذخیره کنید اینطوری اولا به ازای هر کاربر یک کد تخفیف ست میشه و اینکه هیچکسی نمی تونه کد تخفیف شما رو حدس بزنه حالا اگه همین کاربر دوباره همون اکشن رو انجام دادا قبل از اینکه بخواین بهش کد تخفیف بدین اول بررسی کتین ببینین برای این کاربر توی جدول تخفیفات کد تخفیف ثبت شده یا نه ازid کاربر اینجا می تونین استفاده کنین اگر ثبت شده ای دی ها تطابق دارن شرط کوئری تون باید ایدی باشه و برای اینکه بدونین کدوم کد تخفیف استفاده شده توی همون جدول تخفیفات یه فیلد مثلا به اسمactive قرار بدین که مقدار پیش فرضش 0 باشه حالا هر وقت مثلا تو سبد خرید شما این کد تخفیف اعمال شد مقدار اتیو رو به 1 تغییر بدین و قبل از اعمال هر کد تخفیف فیلد active رو بررسی کنین که 0 باشه (یعنی استفاده نشده) و همچنین ای دی کاربر رو برای اینکه بدنین دقیقا این کد برای این کاربر ارسال شده تا بتونین کد های استفده شد ونشده رو تشخیص بدین .....

علی سرلک ( 915 تجربه )
1 ماه پیش

@sardar
واقعا ممنونم از وقتی که گذاشتین و انقدر خوب و واضح توضیح دادین !

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

  • و اینکه بنظرتون برای اینکه درخواستای ایجکسی که میاد رو به چه صورت محدود کرد که مثلا برای درخواست ارسال کد تایید پیامک یوزر نتونه توی لوپ پشت هم ریکوئست بزنه .

باز هم تشکر میکنم از وقت و صبری که گذاشتین .

علی سرلک ( 915 تجربه )
1 ماه پیش

دوستان لطفا بهم بگین برای آپلود تصویری که بصورت base64 به صورت ایجکس پاس داده میشه برای اپلود چه مواردی رو از نظر امنیتش چک کنم که فایل مخرب و .. ارسال نشه .

باتشکر

علی ( 1345 تجربه )
1 ماه پیش

خوب تصویر رو از ارایه فایل باید بگیری و کلی کار هم روش انجام بدی😕😕😕😕
اولا باید بدونی ما در هر تصویری که از اینپوت از نوع فایل دریافت می کنیم یک ارایه داخل ارایه ی files قرار می گیره که شامل : اسم فایل ، پسوند یا type , error , size , مسیر موقت آپلود برای اینکه از هر نظر امنیت فرم رو برقرار کنی باید همه ی موارد رو برسی کنی
1 : فرمت فایل یا همون تایپ مثلا .exe نباشه و امثال اینها که باید با استفاده از mimtype ها بررسی بشن
2 : سایز فایل ها رو بررسی کنین که از مقادیر مورد نظر شما بیشتر نباشه
3 : ارور ها رو بررسی کنین حدودا باید 7 تا سطح خطا برای اپلود فایل رو بررسی کنین ازswitch می تونین برای بررسی عنصر error ارایه فایلز استفاده کنین
4 : فرمت های قابل قبول برای اپلود رو مشخص کنید بهتره یه ارایه از فرمت های قابل قبول بسازین و در هرباری که فایل آپلود میشه mimtype فایل رو با فرمت هایی که داخل ارایه شما هست بررسی کنید که اگر فرمت ها داخل ارایتون بود یعنی فرمت درسته
5 : اسم فایل هاتون رو باید بررسی کنید کلا اسم فایل رو باید تغییر بدین مثلا از micritime می تونین همراه با md5 و time استفاده کنین
6 : جلوگیری کنین از اوررایت شدن یا بازنویسی فایل یعنی اجازه ندین فایل های هم نام اپلود بشن
♤♤♤○○○=》》》محدود بودن درخواست های ایجکس بستگی داره به نوع درخواست مثلا کاربر فقط می تونه یک بار روی دکمه لایک کلیک کنه بار دوم اگه کلیک کرد در حقیقت میشه dislike برای اینکه پشت سر هم یه همچین اتفاقی نیوفته و تکرار نشه بابد بر حسب زمان محدودیت قرار بدین

برای ارسال پاسخ باید وارد سایت شوید