13 نکته برای داشتن برنامه نویسی امن در جاوا

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

می توانیم نتایج را در لیست سالیانه رخنه های عمده امنیت داده ها مشاهده کنیم که در سال 2019 بیش از 3 میلیارد آسیب پذیری امنیتی گزارش شده است.

خبر خوب این است که جاوا یک پلتفرم توسعه دیرینه با بسیاری از ویژگی های امنیتی داخلی است. بسته های امنیتی جاوا مرتبا آزمایش شده و برای آسیب پذیری های امنیتی جدید به روز می شود. API جدید Java EE Security که در سپتامبر 2017 منتشر شد، آسیب پذیری های موجود در معماری کلود (Cloud) و ریز خدمات را بر طرف می کند. همچنین اکوسیستم جاوا شامل طیف گسترده ای از ابزار ها برای Profiling و گزارش مسائل امنیتی است.

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

نکته 1 : کد جاوا را تمیز و قوی بنویسید

آسیب پذیری ها و bug ها دوست دارند تا خود را در پیچیدگی های نرم افزار پنهان کنند. بنابراین کد خود را تا حد ممکن که به عملکرد برنامه نیز لطمه وارد نکند، ساده کنید. استفاده از الگو ها و طراحی های توسعه از قبل تست شده مانند DRY (Don’t Repeat Yourself) می تواند به شما کمک کند کدی بنویسید که بررسی آن برای پیدا کردن مشکلات آسان تر باشد.

پنهان کردن جزئیات پیاده سازی از کدی پشتیبانی می کند که هم قابل نگهداری و هم ایمن باشد.
رعایت 3 نکته زیر کمک می کند تا کد جاوا امن تری بنویسید:

  • از تعیین کننده های سطح دسترسی در جاوا به خوبی استفاده کنید: دانستن این نکنه که در مکان های مختلف کد از کدام تعیین کننده سطح دسترسی (public, private, protected) استفاده کنیم، می تواند در محافظت از امنیت برنامه به شما کمک کند. هر موجودیتی که باید به صورت خصوصی (private) تعریف شود را به صورت خصوصی تعریف کنید.
  • تا حد ممکن از reflection و intreospection استفاده نکنید: استفاده از این دو تکنیک می تواند انعطاف پذیری و قدرت زیادی به شما بدهد اما استفاده از reflection باعث می شود تا Strong typing از بین برود که در نتیجه می تواند منجر به نقطه ضعف و بی ثباتی در کد شما شود. مقایسه نام کلاس ها به عنوان رشته مستعد خطاست و می تواند به راحتی منجر به تداخل فضاهای نامی (namesapce) شود.
  • سعی کنید وابستگی اجزا و کامپوننت ها را به حداقل برسانید: در این صورت، اگر بخشی از سیستم دچار مشکل شود، سایر بخش ها به کار خود ادامه می دهند.

نکته 2 : از Serialization پرهیز کنید

برنامه نویسی امن در جاوا

برنامه نویسی امن در جاوا

این یک نکته دیگر در برنامه نویسی امن در جاوا است اما آنقدر مهم است که می تواند یک قاعده باشد. serialization یک ورودی را دریافت کرده و آن را تبدیل به یک شئ (object) جاوا می کند. این قابلیت اجازه می دهد تا جریانی از داده های ناشناخته در JVM اجرا شوند. در نتیجه، serialization جاوا عمیقا و ذاتا ناامن است.

شاید جالب باشد تا بدانید که Oracle برنامه های بلند مدتی برای حذف سریال سازی در جاوا دارد. مارک رینهولد، معمار ارشد گروه پلتفرم جاوا در اوراکل، گفته است که وی معتقد است یک سوم یا بیشتر آسیب پذیری های جاوا از سریال سازی نشأت می گیرد.

تا آن جا که ممکن است، از serialization/deserialization در کد خود استفاده نکنید، در عوض از فرمت های JSON یا YAML برای serialization استفاده کنید. هرگز یک نقطه پایانی (endpoint) شبکه را که جریان سریال سازی را دریافت و با آن ها کار می کند را بدون محافظت و در معرض خطر نگذارید.

نکته 3 : رمزنگاری داده های حساس

برنامه نویسی امن در جاوا

برنامه نویسی امن در جاوا

هنگامی که کاربر یک پسورد یا رمز عبور را به سرور ارسال می کند، آن داده به عنوان یک متن ساده ارسال می شود. در اینجا 2 مورد وجود دارد که می تواند اطلاعات کاربر را به خطر بیاندازد.

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

نکته 4 : استفاده از کتابخانه های شناخته و تست شده

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

نکته 5 : نسبت به داده های ورودی خود حساس باشید

ورودی شما چه از طریق یک فرم، پایگاه داده و یا API باشد، هیچگاه به آن اعتماد نکنید.

حملات SQL Injection و XSS که احتمالا در مرود آن ها نیز اطلاعاتی داشته باشید، ناشی از عدم مدیریت صحیح ورودی/خروجی هستند. یک مثال کمتر شناخته شده دیگر، حمله billion luaghs است که به موجب آن، با استفاده از XML parser هدف، باعث حمله DOS به سرور می شوند.

نکته 6 : همیشه از دستورات آماده برای رسیدگی به پارامتر های SQL استفاده کنید

برنامه نویسی امن در جاوا

برنامه نویسی امن در جاوا

هر زمان که یک دستور SQL را می سازید، ریسک این را که یک قطعه کد قابل اجرا را در کد خود قرار دهید، به جان می خرید.

با دانست این نکته، تمرین خوبی است تا از این به بعد از کلاس java.sql.PreparedStatement برای ایجاد دستورات SQL استفاده کنید.

نکته 7 : اطلاعات مهم را از طریق پیام های خطا افشا نکنید

برنامه نویسی امن در جاوا

برنامه نویسی امن در جاوا

پیام های خطا یا هشداری که برای کاربران نمایش می دهید، می تواند منبع اطلاعات مهمی برای مهاجمان باشد. به ویژه Stack trace ها می توانند اطلاعات مهمی را درباره فناوری های به کار رفته و نحوه استفاده از آن ها را نشان دهند. بنابراین از آشکار کردن آن ها برای کاربران نهایی خودداری کنید.

نکته 8 : نسخه های امنیتی را به روز نگه دارید

از سال 2019، اوراکل یه طرح مجوز جدید و زمان بندی انتشار ها و نسخه ها را پیاده سازی کرده است.

با بررسی منظم سایت oracle برای هشدار های امنیتی، بررسی کنید تا چه Patch های مهمی در دسترس هستند. هر سه ماه یکبار، اوراکل برای بروزرسانی فعلی LTS (پشتیبانی طولانی مدت) از جاوا، یک به روز رسانی خودکار Patch ارائه می دهد. البته این Patch تنها در صورتی که شما هزینه پشتیبانی جاوا را پرداخت کرده باشید، در دسترس است.

اگر شرکت شما هزینه چنین مجوزی را که پرداخت نمی کند، احتمالا بخواهید از OpenJDK استفاده کنید. در این صورت خودتان باید Patch ها را نصب کنید. همچنین می توانید به سادگی نسخه OpenJDK خود را آپدیت کنید.

نکته 9 : آسیب پذیری های وابستگی را پیدا کنید

ابزار های زیادی برای اسکن خودکار پایگاه کد و وابستگی ها برای آسیب پذیری در دسترس است.

OWASP یا Open Web Application Security Project، سازمانی است در زمینه بهبود امنیت کد فعالیت می کند. این سازمان چندین ابزار اسکن خودکار کد را برای پلتفرم های مختلف توسعه داده است.

نکته 10 : فعالیت کاربران را مانیتور و ثبت کنید

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

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

نکته 11 : مراقب حملات منع سرویس (DoS) باشید

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

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

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

نکته 12 : استفاده از Java Security Manager را درنظر بگیرید

برنامه نویسی امن در جاوا

برنامه نویسی امن در جاوا

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

نکته 13 : اسفاده از سرویس احراز هویت ابری خارجی را در نظر بگیرید

مزیت چنین سرویس ها و خدماتی این است که آن ها مسئول تأمین امنیت داده های حساس کاربران هستند، نه شما. از طرف دیگر، استفاده و اضافه کردن سرویس احراز هویت می تواند به پیچیدگی سیستم و برنامه شما بیافزاید. از جمله شرکت هایی که این نوع خدمات را ارائه می دهند، می توان به Firebase اشاره کرد.

QR:  13 نکته برای داشتن برنامه نویسی امن در جاوا
به اشتراک بگذارید