بهترین راه‌های تضمین امنیت برنامه با ویژگی‌های جاوا

شنبه 22 شهریور 1399

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

بهترین راه‌های تضمین امنیت برنامه با ویژگی‌های جاوا

جاوا یکی از امن‌ترین و محبوب‌ترین زبان‌های برنامه‌نویسی در دنیا است. این زبان از اواسط دهه 1990 به طور مداوم رشد کرد به خصوص بعد از اینکه موفق شد بسیاری از مشکلات امنیتی و آسیب‌پذیری‌های زبان‌های C و C++ را از بین ببرد. با این حال، حتی اگر زبان برنامه‌نویسی امن‌ترین زبان هم باشد، باز هم از تهدیدات احتمالی امنیت سایبری معاف نیست. توسعه‌دهندگان هنوز باید کدهای امنیتی را ارائه دهند و مطمئن شوند که برنامه‌ها حتی در صورتی که با ویژگی‌های جاوا توسعه یافته است، از خطا محفوظ هستند. این 10 نکته برای اطمینان از امنیت برنامه با ویژگی‌های جاوا همیشه مفید خواهد بود.

1. استفاده از Java ME در پلت‌فرم‌های Pi

اگر از Raspberry Pi 4 به عنوان پلت‌فرم برای طراحی برنامه جاوا استفاده می‌کنید، نصب Java ME بر روی Pi به شما امکان می‌دهد ویژگی‌های امنیتی برنامه را بدون هیچ زحمتی جاسازی کرده و تست کنید، حتی برای دستگاه‌هایی که فضای حافظه یا دیسک کمی دارند. Java ME با زمان اجرای (runtime) مبتنی بر CLDC ساخته شده است و به آن امکان می‌دهد تا بر روی دستگاه‌هایی با حافظه بسیار محدود (تا 1 مگابایت) اجرا شود. اگر ظرفیت حافظه دستگاه شما 10 مگابایت یا بیشتر باشد، به Java ME با زمان اجرای مبتنی بر CDC نیاز خواهید داشت. فقط مطمئن شوید نسخه‌های Java ME ای که برای توسعه برنامه خود استفاده می‌کنید به طور خاص برای Raspberry Pi ساخته شده‌ باشند.

2. خودداری از کدنویسی به هم ریخته و پیچیده

Serialization از این جهت مفید است که به برنامه‌نویسان جاوا اجازه می‌دهد ورودی‌ها/آبجکت‌های از راه دور را به جریان بایت (byte stream) قابل حمل تبدیل کنند، که بعد می‌توانند به عنوان آبجکت‌هایی که به طور کامل ارائه شده‌اند در دیسک ذخیره شوند. این فرآیند را می‌توان معکوس کرد (از طریق Java deserialization) تا آبجکت‌های اصلی از جریان بایت ذخیره ‌شده دوباره ایجاد شوند.

با این حال، Java deserialization می‌تواند آسیب‌پذیر باشد زیرا ممکن است داده‌ها از طریق جریان بایت ذخیره‌شده فاش شوند. این یعنی اگر یک هکر یک آبجکت مخرب serializ شده را به برنامه شما بفرستد، شما باید ابتدا آن را رمزگشایی کنید، که به این موضوع اشاره دارد که شما آن را نمونه‌برداری کرده‌اید. داده‌های ناشناخته از قبل کد را در JVM اجرا می‌کنند.

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

3. رمزگذاری داده‌ها

تعداد زیادی کتابخانه open source وجود دارد که شامل تعداد زیادی تعریف کلاس (کد از پیش نوشته شده) اختصاص‌یافته برای توسعه جاوا است. آن‌ها شامل کتابخانه‌های لاگ (مثل Log4j، SLF4j، LogBack)، کتابخانه‌های تبدیل فرمت (مثل JSON) و کتابخانه‌هایی با اهداف عمومی (مثل Google Guava و Apache Commons) و سایر موارد هستند.

اما همه کتابخانه‌ها ایمن نیستند. برای اطمینان از قابل اعتماد بودن کتابخانه‌ها، موارد زیر را در نظر بگیرید:

اگر مستندات ضعیفی داشته باشند احتمالا ایمن نیستند.

آیا آن‌ها انجمنی با پشتیبانی فعال دارند؟

مستندات API آن چگونه است؟

آیا کتابخانه توسعه فعالی دارد؟ و اگر بله، چقدر پایدار و کارآمد است؟

4. استفاده از کوئری‌های پارامترسازی شده

تزریق یا همان Injection یکی از آسیب‌پذیرترین موارد امروزی برای برنامه‌ها است. هکرها از SQL injection در جاوا برای لینک کردن کوئری‌های sql در یک زنجیره استفاده می‌کنند و در نتیجه اجرای ناامنی از SQL را ایجاد می‌کنند. با استفاده از پارامترسازی کوئری می‌توانید از این عمل جلوگیری کنید. پارامترها مانع دسترسی هکر به قسمت ثابت یک کوئری می‌شوند، بنابراین آن‌ها نمی‌توانند اطلاعات مهم برنامه را به دست آورند.

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

5. استفاده از احراز هویت (authentication) سطح بالا

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

روش دیگر برای اطمینان از اینکه بی‌احتیاطی کاربر اعتبار برنامه شما را به خطر نمی‌اندازد، به حداقل رساندن ذخیره‌سازی داده‌های حساس درون برنامه است. حتی می‌توانید ذخیره اطلاعات محرمانه در سرورها را برای کاربران غیرممکن کنید.

6. نصب ویژگی‌های تشخیص مداخله

چندین ویژگی جاوا وجود دارد که به شما کمک می‌کند هر گونه تلاش برای مداخله و دست‌کاری را به سرعت تشخیص داده و خنثی کنید. در صورتی که کسی تلاش کند تا کدهای شما را اصلاح کرده یا تغییر دهد، این ویژگی‌ها به شما هشدار می‌دهند. توجه داشته باشید که برنامه‌نویسان مخرب همیشه به دنبال تزریق کدهای بد به برنامه شما هستند تا بتوانند برنامه شما را خراب کرده یا داده‌هایتان را به سرقت ببرند.

پیکربندی XML-parsers

این مورد به شما کمک می‌کند تا از eXternal Entity (XXE) برنامه خود جلوگیری کنید. گاهی اوقات هکرها XML های مخربی ایجاد می‌کنند و از آن‌ها برای خواندن محتوا در فایل‌های انتخاب‌شده در برنامه‌یتان استفاده می‌کنند. توجه داشته باشید که حملات XXE از مهمترین نقاط آسیب‌پذیر در برنامه‌نویسی جاوا هستند. همه نیازهای هکر Java SAX parser و پیاده‌سازی ساده XML-parsers شما است و آن‌ها به سادگی فایل‌های XML شما را تجزیه و تبدیل می‌کنند.

8. حفاظت از داده با استفاده از VPN

یک سرویس VPN معتبر باعث حفاظت از رمز عبور داده‌های برنامه شما می‌شود. هکرها نمی‌توانند داده‌های شما را سرقت، کپی یا به اشتراک بگذارند.

9. استفاده از Java Security Manager

Java Security Manager به شما امکان می‌دهد سیاست‌های امنیتی خود را کانفیگ کنید. می‌توانید از آن برای ایجاد این دو مورد استفاده کنید:

Blacklist: این لیست شامل عملیاتی است که برنامه شما در آن‌ها مجاز نیست. هر آنچه که در این لیست نیست مجاز است. بنابراین شما باید تمام تهدیدات امنیتی احتمالی خود را شناخته و آن‌ها را در لیست سیاه (blacklist) قرار دهید.

white list: این لیست فقط شامل عملیاتی است که برنامه را مجاز می‌سازد. همه عملیاتی که در این لیست نیستند، به طور پیش‌فرض، غیر مجاز هستند.

فایل سیاست‌های (policy) خود را بسازید و با داشتن قدرت محدود کردن مجوزهای لازم، اجرای برنامه را آسان سازید. Java security manager اساسا مسئولیت امنیت و آسیب‌پذیری برنامه شما را به عهده دارد.

10. ارزیابی کیفیت می‌تواند کمک‌کننده باشد

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

جمع‌بندی

پلت‌فرم جاوا با چندین ویژگی امنیتی داخلی اثبات‌شده و تست‌شده همراه است. این زبان همچنین برای آسیب‌پذیری‌های امنیتی جدید مرتبا آپدیت می‌شود؛ که شامل ابزارهای مختلفی برای شناسایی و گزارش مسائل امنیتی است. این بدان معناست که توسعه برنامه شما در جاوا باعث از بین رفتن بسیاری از مشکلات امنیتی برنامه می‌شود.

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

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

نویسنده 3355 مقاله در برنامه نویسان

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

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید