‫ برنامه‌نويسي امن با زبان جاوا – قانون اعلان‌ها و مقدار دهي اوليه- قانون DCL00-J – بخش اول

شماره:IRCAR201506262
تاريخ: 27/03/94
دومين موضوعي كه در برنامه نويسي امن با زبان جاوا مورد توجه قرار مي‌گيرد مربوط به اعلان‌ها و مقدار دهي اوليه است. در ادامه به اولين قانون (DCL00-J) ذيل اين موضوع پرداخته خواهد شد.
در بخش اول مقاله، اين قانون توضيح داده شده و به نمونه كد ناسازگار با قانون و راه حل آن اشاره مي‌شود. در بخش بعدي مقاله، دو نمونه ديگر از كد ناسازگار خواهد آمد.
قانون DCL00-J – جلوگيري از دورهاي مقدار دهي اوليه كلاس
با توجه به مشخصات زبان جاوا (JLS) (مشخصه شماره 12.4 "مقدار دهي اوليه كلاس‌ها و واسط‌ها"):
مقدار دهي اوليه كلاس شامل اجراي تخصيص دهنده‌هاي استاتيك آن و اجراي تخصيص دهنده‌ها براي فيلدهاي استاتيك تعريف شده در كلاس (متغيرهاي كلاس) مي‌باشد.
بنابراين، وجود فيلد استاتيك مقدار دهي اوليه كلاس را فعال مي‌كند. در عين حال، تخصيص دهنده فيلد استاتيك مي‌تواند مبتني بر مقدار دهي اوليه كلاسي ديگر باشد و اين كار احتمالاً دور مقدار دهي اوليه ايجاد مي‌كند.
علاوه بر اين، در مشخصه شماره 8.3.2.1 "تخصيص دهنده‌ها براي متغيرهاي كلاس" آمده است:
در زمان اجرا، ابتدا متغيرهاي استاتيك كه final بوده و با مقادير ثابت زمان كامپايل مقدار دهي اوليه شده‌اند مقدار دهي اوليه مي‌شوند.
اين عبارت درخصوص نمونه‌هايي كه از مقادير فيلدهاي استاتيك final استفاده مي‌كنند كه بعداً مقدار دهي اوليه مي‌شوند، صادق نيست. اعلان فيلد به صورت استاتيك final تضمين كننده مقداردهي اوليه آن قبل از خوانده شدن نيست.
به طور كلي، پيشنهاد مي‌شود برنامه‌ها – و برنامه‌هاي حساس به امنيت بايد- تمام دورهاي مقدار دهي اوليه كلاس را حذف كنند.
يك نمونه ناسازگار با قانون (دور درون كلاسي)
در اين مثال دور مقدار دهي اوليه درون كلاسي وجود دارد:
 
 
كلاس Cycle در مثال فوق داراي متغير خصوصي استاتيك final است كه اين متغير به نمونه جديدي از كلاس Cycle مقدار دهي اوليه مي‌شود. تخصيص دهنده‌هاي استاتيك حتماً قبل از اولين استفاده از عضو استاتيك كلاس يا اولين فراخواني سازنده، يك بار فراخواني مي‌شود.
هدف برنامه نويس، محاسبه مانده حساب از طريق كسر هزينه پردازش از مقدار سپرده است. اما مقدار دهي اوليه متغير c (كه از نوع كلاس است) قبل از مقداردهي اوليه فيلد deposit در زمان اجرا انجام مي‎‌شود، چراكه ظاهراً اين مقدار دهي قبل از مقدار دهي اوليه فيلد deposit است. در نتيجه، مقدار deposit ديده شده توسط سازنده –در زمان فراخواني درحين مقدار دهي اوليه متغير استاتيك c- به جاي مقدار تصادفي، داراي مقدار اوليه صفر است. به همين خاطر، مقدار balance هميشه برابر با 10- محاسبه مي‌شود.
مرحله سوم رويه مقدار دهي اوليه كه در JLS  شماره 12.4.2 شرح داده شده است، امكان پياده‌سازي بدون روبرو شدن با چنين دورهاي بازگشتي مقدار دهي اوليه را فراهم مي‌كند.
 
راه حل سازگار با قانون (دور درون كلاسي)
اين راه حل سازگاري، ترتيب مقداردهي اوليه كلاس Cycle را به گونه اي تغيير مي‌دهد كه فيلدها بدون ايجاد هرگونه دورهاي وابستگي مقدار دهي اوليه شوند. مقدار دهي اوليه c بعد از مقداردهي اوليه deposit قرار گرفته است؛ در نتيجه مقداردهي اوليه آن، بعد از مقداردهي اوليه كامل به deposit خواهد بود.
 
 
چنين دورهاي مقداردهي اوليه زماني كه تعداد فيلدها زياد باشد، مشكل ساز خواهد بود. بنابراين به طريقي بايد از فقدان چنين دورهايي در جريان كنترلي اطمينان حاصل كرد.
اگرچه اين راه حل سازگاري از دور مقداردهي اوليه جلوگيري مي‌كند، اما وابسته به ترتيب اعلان بوده و راه حل مطمئني نيست، چراكه ممكن است كساني كه مسئول نگهداري نرم افزار هستند از اهميت اين ترتيب كه براي حفظ صحت برنامه است اطلاع نداشته باشند. به همين خاطر چنين مواردي حتماً بايد صريحاً در كد مستند شوند.
در بخش بعدي مقاله، به دو نمونه ديگر از كدهاي ناسازگار با قانون و راه‌حل‌هاي سازگاري آن با قانون خواهيم پرداخت.
 
مطالب مرتبط:
برنامه‌نويسي امن با زبان جاوا - آشنايي
 
منبع:

نظرات

بدون نظر
شما برای نظر دادن باید وارد شوید

نوشته

 
تاریخ ایجاد: 27 خرداد 1394

دسته‌ها

امتیاز

امتیاز شما
تعداد امتیازها:0