فا

‫ برنامه‌نويسي امن با زبان جاوا – عدم استفاده از null در جايي كه يك شي لازم است- قانون EXP01-J

شماره:IRCAR201509272

تاريخ: 23/06/94
سومين موضوعي كه در برنامه نويسي امن با زبان جاوا مورد توجه قرار مي‌گيرد «عبارات» است. در ادامه به دومين قانون (EXP01-J) ذيل اين موضوع پرداخته خواهد شد.
قانون EXP01-J – عدم استفاده از null در حالتي كه يك شي لازم است
از مقدار null در هر موردي كه شي‌اي لازم است استفاده نكنيد. از جمله اين موارد عبارت است از:
- فراخواني متد نمونه براي شي null
- دسترسي يا تغيير فيلدي از شي null
- بدست آوردن اندازه null اگر آن شي از نوع آرايه باشد
- دسترسي يا تغيير عناصر شي null اگر آن شي از نوع آرايه باشد
- null Throwing اگر آن شي، يك مقدار Throwable باشد
استفاده از nullدر حالاتي كه يك شي لازم است، منجر به پرتاب NullPointerException مي‌گردد به طوري كه اجراي برنامه يا نخ (thread) را با وقفه مواجه مي‌كند. اين نوع كد با اين استاندارد برنامه نويسي منطبق نخواهد بود چراكه طبق قانون ERR08-J برنامه نويسي امن با جاوا (برنگرداندن NullPointException يا هر كدام از انواع آن)، NullPointerExceptionنبايد برگردانده شود.
يك نمونه ناسازگار با قانون
اين نمونه ناسازگار، خطايي را در نسخه 4.1.24 تامكت نشان مي‌دهد. متد cardinality() براي اين طراحي شده كه تعداد تكرار شي obj در مجموعه col را مشخص كند. يك استفاده صحيح از متد cardinality()، تعيين تعداد اشياي null در مجموعه است. با اين وجود، بدليل اينكه عضويت در مجموعه با عبارت obj.equals(elt) بررسي مي‌شود، هر زمان كه obj تهي باشد و elt تهي نباشد، اشاره گر تهي برگردانده خواهد شد.
راه حل سازگار با قانون
اين راه حل،اشاره گر تهي را بوسيله اضافه كردن يك بررسي صريح، حذف مي‌كند:
يك نمونه ناسازگار با قانون
در اين نمونه ناسازگار، متد isProperName()به گونه‌اي تعريف شده است كه اگر آرگومان String آن نامي معتبر باشد (يعني دو كلمه با حروف بزرگ باشند كه بوسيله يك يا چند فاصله از هم جدا شده اند) مقدار true را بر مي‌گرداند.
متد isProperName()ناسازگار با قانون است چراكه ممكن است با ورودي تهي فراخواني شده و منجر به اشاره گر تهي شود.
راه حل سازگار با قانون (روش تركيب چند جزء)
اين راه حل سازگار نيز همانند مثال ناسازگار قبلي، شامل پياده سازي از متدisProperName() است اما با اين تفاوت كه در اينجا متدي خصوصي با يك فراخواننده در كلاس حاوي آن است.
از طريق متد فراخواني كننده (testString()isProperName()همواره با اشاره گر رشته‌اي معتبر فراخواني خواهد شد. در نتيجه، اگرچه متدisProperName() با اين قانون تطابق ندارد اما كلاس با اين قانون مطابقت مي‌كند. كارهايي از اين نوع، مي‌تواند براي حذف ارجاع تهي استفاده شود.
راه حل سازگار با قانون (نوع انتخابي)
اين راه حل سازگار، از Optional String به جاي شي String كه ممكن است تهي باشد استفاده مي‌كند. كلاس Optional (java.util.Optional)، كه در جاوا 8 معرفي شده، مي‌تواند براي كاهش ارجاعات تهي استفاده شود.
كلاس Optionalحاوي متدهايي است كه از آنها مي توان براي كوتاه تر كردن برنامه استفاده كرد.
ارزيابي خطر
ارجاع به يك اشاره گر تهي مي‌تواند منجر به DoS شود. در برنامه‌هاي چند نخي، ارجاعات اشاره گر تهي مي‌تواند خط مشي‌هاي مرتبط با حافظه نهان را نقض و منجر به نشت منابع گردد.
تشخيص خودكار
ارجاعات اشاره گر تهي مي تواند در راه هاي وابسته به مسير اتفاق بيفتد. به دليل محدوديت در ابزارهاي تشخيص خودكار، بررسي دستي كد براي تشخيص نمونه‌هاي اشاره گر تهي مورد نياز است. يادداشت گذاري در كد برنامه براي پارامترهايي از متد كه نبايد تهي باشند ميتواند بوسيله كمك به تشخيص خودكار ارجاعات تهي، نياز به بررسي دستي را كاهش دهد؛ به همين جهت استفاده از يادداشت گذاري توصيه مي‌شود.
آسيب پذيري‌هاي مرتبط
در برنامه‌هاي كاربردي Java Web Start و اپلت‌ها بويژه نسخه 1.6 JDK، قبل از نسخه 4، اشكالي وجود دارد كه نتايج امنيتي قابل توجهي به بار مي‌آورد. در برخي موارد، تلاش برنامه يا اپلت براي برقراري اتصال HTTPS با سرور منجر به توليد NullPointerException مي‌شود. اين عدم موفقيت در برقراري ارتباط HTTPS ايمن با سرور منجر به DoS مي‌شود. كلاينت‌ها براي تبادل داده موقتاً مجبور به استفاده از كانال HTTP ناامن مي‌شوند.
جزييات پياده سازي در اندرويد
برنامه‌هاي كاربردي اندرويدي بدليل محدوديت در حافظه دستگاه همراه نسبت به NullPointerExceptionبيشتر حساس هستند. اعضاي استاتيك يا اعضاي يك Activity ممكن است زماني كه حافظه مورد استفاده قرار گيرد تهي بشود.
مطالب مرتبط:
منبع:


نظرات

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

نوشته

 
تاریخ ایجاد: 28 شهریور 1394

دسته‌ها

امتیاز

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