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

هنگام توسعه اپلیکیشن باید دقت زیادی برای حفاظت از اطلاعات، مدیریت دسترسی و کنترل عملکرد کاربران به خرج داد.

توی این پست به یک سری از اقدامات مهمی که نیاز هست مد نظر قرار بدید اشاره می کنم:

  • اپلیکیشن را با دسترسی های 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 پرفورمنس رو کاهش میده و فقط در مواقع ضرورت از اون باید استفاده کرد

امیدوارم مفید بوده باشه
- علیرضا تاجی