نکات امنیتی که حین توسعه حتما باید رعایت کنید

هنگام توسعه اپلیکیشن باید دقت زیادی برای حفاظت از اطلاعات، مدیریت دسترسی و کنترل عملکرد کاربران به خرج داد.توی این پست به یک سری از اقدامات مهمی که نیاز هست مد نظر قرار بدید اشاره می کنم:اپلیکیشن را با دسترسی های root اجرا نکنیدیکی از اصول امنیتی که همیشه باید رعایت بشه دادن حداقل دسترسی های مورد نیاز به کاربران برای انجام کارشان هست. هنگام اجرا کردن اپ با دسترسی root ریسک حملات command injection رو افزایش میدید (در این نوع از حمله مهاجم یک اسکریپت به عنوان ورودی در محلی از برنامه که با هدف اجرا کردن کامند توسعه داده شده وارد می کند)هدر x-powered-by را غیر فعال کنیدبا انجام این کار شانس تشخیص فریم ورکی که با استفاده از آن API خود را توسعه دادید پایین تر میاوریدقرار ندادن پسورد ها، توکن ها و سایر اطلاعات مهم اپ داخل گیت پروژهبه هیچ عنوان اطلاعات مهم امنیتی رو داخل ریپازیتوری گیت نیارید (اطلاعاتی مثل یوزر پسورد دیتابیس ها، توکن سرویس های thrid party و ...) و اون ها رو به عنوان متغیر های محیطی ذخیره کنید و به اپلیکیشن بدید (environment variables)جلوگیری از حملات DDoSبا ست کردن rate limit تعداد درخواست های کاربران را مدیریت کنیدDDoS به حملاتی گفته می شود که مهاجم با ایجاد اختلال در ارتباط با سرور به وسیله درخواست های بیش از حد، ارتباط دیگر کاربران را دچار تداخل می کندrate limit عملیاتی هست که تعداد درخواست های کاربر را در بازه زمانی معین کنترل می کندجلوگیری از password guessingهنگامی که کاربر پسورد خود را ثبت می کند باید ساختار آن را کنترل کنید تا ساده نباشد با اینکار شانس پیدا کردن پسورد رو برای مهاجم ها سخت تر می کنید برای لاگین rate limit جداگانه و با محدودیت بیشتر ست کنید با اینکار از حملات brute force جلوگیری می کنیدجلوگیری از XSSمهاجم داخل ورودی ها کد جاوااسکریپت می گذارد و مرورگر آن کد را هنگام نمایش اجرا می کندنکته: اگر از ری اکت برای توسعه فرانت اند استفاده می کنید با این نوع حملات مواجه نمی شویدبرای جلوگیری از این حملات باید ورودی های کاربر را validate کنیدحمله insecure DORهنگام دریافت اطلاعات کاربر، آیدی کاربر را از توکن کاربر بگیرید نه از طریق دیتای درخواست.هنگام دانلود فایل های حساس، دسترسی کاربر به آن فایل رو چک کنید و به hash کردن نام فایل اکتفا نکنید.محدود کردن سایز body درخواست هایک محدودیت حجمی برای سایز درخواست های http بگذارید (مثلا ۱ مگابایت برای json body و ۱۰ مگابایت برای فایل)جلوگیری از sql injectionدر این نوع از حملات مهاجم در کنار ورودی ای که به اسکریپت sql خود میدهید یک اسکریپت دیگری وارد می کند که منجر به دسترسی به دیتاهایی خارج از دسترسی کاربر می شودSELECT * FROM Users WHERE UserId = &quot + userId; // userId = 3 OR 1=1در مثال بالا با پاس دادن مقدار کامنت شده به جای userId می توانیم لیست تمام کاربران رو بگیریمنکته: orm ها با استفاده از parametrized-query ها از این حمله جلوگیری می کنند اما زمانی که raw query میزنید باید ورودی های کوئری کاربر را validate کنیداستفاده از CSRF توکنهنگامی که توکن رو با session یا کوکی های سمت سرور (http only) ذخیره می کنید حتما باید برای api ها توکن csrf ست کنید، در غیر این صورت با ارسال یک ایمیل مخرب و باز کردن آن توسط شما، مهاجم می تواند با توکن شما درخواست بزند(توضیحات نحوه اتفاق افتادن این حمله طولانیه شاید توی یک پست دیگه توضیح بدم)هش کردن دیتای حساسهنگامی که اطلاعات احراز هویتی حساسی را از کاربر ذخیره می کنید، آن ها را به صورت یک طرفه hash کنید (با این کار دیگر نمی توان به دیتای اصلی دست پیدا کرد و فقط امکان مقایسه یکسان بودن دیتای اصلی با دیتای hash شده وجود دارد) اطلاعاتی مثل پسورد، access token (در صورت ذخیره کردن روی دیتابیس) و ... با این کار عواقب لو رفتن دیتا های دیتابیس به مراتب کمتر می شوداستفاده از توکن checksumدر سیستم هایی که اطلاعات احراز هویتی از اهمیت بسیار بالایی برخوردار هستند، اطلاعات حساس کاربر (یوزرنیم، شماره تماس، پسورد و ...) را در کنار هم قرار می دهیم و آن عبارت را hash می کنیم و به عنوان ستون checksum داخل دیتابیس نگه میداریم و هنگام درخواست های کاربر هر بار اطلاعات را با توکن مقایسه می کنیم و در صورت مقایرت داشتن اپلیکیشن را shutdown می کنیم(وقتی که یک نفر مستقیما از طریق دیتابیس یکی از اطلاعات کاربر را تغییر دهد این مغایرت رخ می دهد)نکته: استفاده از checksum پرفورمنس رو کاهش میده و فقط در مواقع ضرورت از اون باید استفاده کردامیدوارم مفید بوده باشه- علیرضا تاجی