اجتناب از اشتباهات رايج در منطق برنامه‌های تحت‌وب

اجتناب از اشتباهات رايج در منطق برنامه‌های تحت‌وب

تاریخ ایجاد

IRCAR201101085
تاريخ: 89/10/27
شماره: IRCAR201101085
تمام برنامه هاي كاربردي تحت وب از منطق خاص خود براي عملياتي كردن وب سايت مربوطه استفاده مي كنند. نوشتن كد با استفاده از يك زبان برنامه نويسي در اصل چيزي به جز شكستن پروسه هاي پيچيده به گام هاي منطقي كوچك، نيست. البته ترجمه يك عمليات كوچك كه براي انسان معنادار است به ترتيبي از دستورات كه براي كامپيوتر قابل اجرا باشند، كاري است كه نياز به تجربه و مهارت فراواني دارد و از طرف ديگر نوشتن كد مذكور به صورتي كه امن و قابل اعتماد باشد، نيز كاري به مراتب دشوارتر است. زماني كه تعداد زيادي طراح و برنامه نويس به صورت موازي بر روي يك برنامه كاربردي كار مي كنند، به احتمال بسيار زياد مشكلات امنيتي متعددي بروز خواهند كرد. حتي در ساده ترين برنامه هاي تحت وب نيز منطق گسترده اي در هر گام برنامه وجود دارد و اين امر منجر به ايجاد سطح حمله اي مي شود كه اغلب از آن چشم پوشي مي گردد. بسياري از تست نفوذها و مرور كدها بر روي آسيب پذيري هاي اصلي همچون تزريق SQL و يا cross-site-scripting تمركز مي كنند، زيرا آسيب پذيري هاي مذكور داراي امضاي قابل تشخيص بوده و در مورد بردارهاي حمله آنها به اندازه كافي تحقيق شده و اطلاعات وجود دارد. در نقطه مقابل، شناسايي آسيب پذيري هاي موجود در منطق برنامه بسيار سخت است، زيرا هر نمونه آسيب پذيري ممكن است تنها يك بار و براي يك برنامه خاص اتفاق بيفتد كه قابل تشخيص توسط ابزارهاي اتوماتيك شناسايي آسيب پذيري ها نيست. به همين دليل به آسيب پذيري هاي مذكور چندان توجه نشده و اين امر موجب مي شود علاقه هكرها به شدت جلب اين دسته از نقص هاي امنيتي شود.
در دو مقاله قبلي در مورد انواع نقص هاي منطقي كه اغلب در برنامه هاي كاربردي تحت وب وجود دارند، با آوردن مثال صحبت كرديم. در اين مقاله به عادت هايي اشاره مي كنيم كه مي توانند تا حد زيادي از بروز اشتباهات منطقي در برنامه هاي تحت وب جلوگيري به عمل آورند.
همان طور كه گفته شد نقص هاي امنيتي در برنامه هاي كاربردي تحت وب، بسيار متفاوت از يكديگر هستند. برخي از آنها ممكن است به راحتي قابل تشخيص و برطرف كردن باشند و برخي ديگر ممكن است از انواع تست نفوذها و مرور كدها جان سالم به در برند. اين آسيب پذيري ها بر خلاف آسيب پذيري هاي تزريق SQL و يا cross-site-scripting داراي امضاها و رفتارهاي مشخص نيستند. تنها ويژگي مشترك در آنها ناقص بودن منطق برنامه است كه در اغلب موارد به علت پيش فرض هاي واضح و يا نهان برنامه نويسان به وجود مي آيد. در حالت كلي يك برنامه نويس ممكن است استنتاج كند كه " اگر "A" اتفاق بيفتد، آنگاه "B" اتفاق مي افتد و من بايد "C" را انجام بدهم، اما برنامه نويس از خود سوال كاملاً متفاوتي نمي كند كه "چه روي خواهد داد اگر "X" اتفاق بيفتد؟" و به اين ترتيب نمي تواند سناريويي را كه از فرض مورد نظر پيروي نمي كند، مديريت نمايد. در موقعيت هاي مختلف فرض ناقص مي تواند منجر به بروز آسيب پذيري هايي با درجه اهميت متفاوت شود. به همين دليل و از آنجايي كه امضاي يكساني براي اين نوع آسيب پذيري ها وجود ندارد در نتيجه نسخه يكساني نيز براي پيشگيري از آسيب پذيري هاي مذكور وجود ندارد. با اين وجود، چند عادت خوب در طراحي و پياده سازي برنامه هاي تحت وب وجود دارد كه در صورت عمل كردن به آنها مي توان تا حد بسيار زيادي از بروز اينگونه آسيب پذيري ها جلوگيري كرد. در ادامه اين عادت ها را توضيح مي دهيم.

  • اطمينان حاصل كنيد كه تمام جنبه هاي طراحي برنامه كاربردي تحت وب، با جزئيات كافي مستندسازي شده اند، به طوري كه يك فرد بيروني نيز بتواند تمام فرض هايي را كه توسط طراحان در نظر گرفته شده اند، متوجه شود. چنين فرض هايي بايد به صورت واضح و روشن در مستندات گنجانده شوند.
  • تمام كد منبع بايد به صورت واضح كامنت گذاري شود، به طوري كه كامنت ها اطلاعات زير را پوشش دهند:
    • هدف و موارد استفاده هر قطعه برنامه
    • فرض هايي كه قطعه برنامه مذكور درباره چيزهايي كرده است كه خارج از كنترل مستقيم خودش قرار دارند.
    • ليست تمام اجزاء ديگر برنامه كه از اين قطعه كد استفاده مي كنند.
  • در حين مرور امنيتي طراحي برنامه كاربردي بر روي فرض ها تمركز كرده و سعي كنيد حالت هايي را متصور شويد كه فرض هاي مذكور نقض شود. مخصوصاً روي فرض ها و شرايطي تمركز كنيد كه كنترل آن در دستان كاربر است.
  • در زمان مرور امنيتي در مورد دو نكته كليدي به خوبي فكر كرده و آنها بررسي كنيد: 1- به راههايي كه توسط آن رفتار يا ورودي غير منتظره كاربر توسط برنامه كاربردي مديريت مي شود. 2- عوارضي كه بر اثر وابستگي ها و تعاملات بين اجزاي مختلف برنامه و عمليات هاي مختلف پيش مي آيد.
  • زماني كه در حال پياده سازي توابعي هستيد كه داده هاي نشست را بر اساس داده هاي جديدي كه از كاربر گرفته است يا بر اساس عملياتي كه كاربر انجام داده است، به روز مي كند، به خوبي بر روي تأثيراتي كه داده هاي به روز شده بر روي ديگر قسمت هاي برنامه دارد متمركز شويد و آنها را مشخص كنيد. دقت داشته باشيد كه معمولاً عوارض غير قابل انتظار براي اجزاي ظاهراً بي ربط و يا قطعه كدهايي اتفاق مي افتد كه يك برنامه نويس ديگر و يا يك تيم توسعه ديگر ايجاد كرده اند.
  • با توجه به مثال رمز عبور و پروسه هاي چند مرحله اي به برنامه نويسان توصيه مي شود حالت هاي مختلف وجود و يا عدم وجود اطلاعات براي هر پارامتر را در نظر گيرند. بايد برنامه نويسان كاملاً به جنبه هايي كه در كنترل كاربران است توجه كرده و در نظر بگيرند كه آيا آنها مي توانند عمليات هاي چند مرحله اي را به هر ترتيبي كه بخواهند انجام دهند يا خير. همچنين كاربران ممكن است پارامترهايي را ارسال كنند كه برنامه از آنها درخواست نكرده است، حتي ممكن است برخي پارامترها را حذف كنند و ممكن است مقادير نادرست را وارد كنند.
  • باز هم با توجه به مثال رمز عبور به برنامه نويسان توصيه مي شود، فرض هايي را در مورد حق دسترسي كاربر بر اساس الگوهاي ديگري كه در درخواست وجود دارند، در نظر نگيريد.
  • با توجه به مثال محدوديت هاي عددي به برنامه نويسان توصيه مي شود در به كارگيري محدوديت هاي عددي نهايت دقت را به كار برند، زيرا در صورتي كه يك كاربر خرابكار بتواند به نوعي در شرط هاي مذكور تقلب كند، ممكن است منجر به حملات مختلف و يا نشت اطلاعات شود. در اين مورد بايد اعتبارسنجي داده هاي ورودي با دقت، سخت گيري و وضوح انجام شود، براي مثال در صورتي كه ورودي عدد منفي انتظار نمي رود، در منطق برنامه نيز به وضوح درخواست هايي كه حاوي عدد صحيح هستند، رد شوند.
  • با توجه به مثال پاك كردن ركوردهاي ثبت وقايع به برنامه نويسان توصيه مي شود در مورد پياده سازي هر نوع تابعي كه به كاربر امكان پاك كردن ركوردي از ثبت وقايع را مي دهد بسيار دقيق عمل كرده و نهايت توجه را مبذول دارند. همچنين تأثيرات احتمالي اينكه يك كاربر با حق دسترسي بالا بتواند حساب كاربري ديگري با حق دسترسي مشابه را ايجاد كند حتي در برنامه هايي كه به دقت و به صورت سنگين به ثبت وقايع سيستم مي پردازند، مورد مطالعه دقيق قرار دهيد.
  • با توجه به مثال تقلب در تخفيف توصيه مي شود، در زماني كه تخفيف ها با توجه به حجم موارد خريداري شده انجام مي گيرد، ابتدا نسبت به نهايي شدن درخواست خريد اطمينان حاصل كرده و سپس تخفيف ها را اعمال كنيد. همواره فرض كنيد كه كاربران ممكن است مسير نرمال استفاده از يك ابزار را طي نكنند و در نتيجه لازم است همه احتمالات مورد بررسي قرار گيرد.
  • همواره نسبت به وجود فضاي حافظه كافي براي نگهداري داده هاي مربوط به كاربر، چه در نشست و چه در پروفايل كاربر، اطمينان حاصل كنيد.

آسيب پذيري هاي موجود در منطق برنامه تنها نوعي از آسيب پذيري ها هستند كه به صورت كامل قابل اجتناب نيستند، اما راهكارهايي وجود دارد كه بتوان آنها را به حداقل رساند. در صورتي كه به توصيه‌هاي فوق عمل كنيد مي توانيد تا درصد زيادي از بروز آسيب پذيري هاي منطقي جلوگيري به عمل آوريد.

برچسب‌ها