‫ برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها – قانون IDS01-J

IRCAR201311191
 
اولين موضوعي كه به طور كلي در برنامه نويسي امن (رجوع شود به مقاله اصول برنامه نويسي امن) و همچنين در برنامه نويسي امن با زبان جاوا مورد توجه قرار مي گيرد مربوط به اعتبار سنجي ورودي و پاكسازي داده ها است. در اين موضوع چهارده قانون معرفي مي گردد كه سطوح امنيتي مختلفي دارند (رجوع شود به مقاله برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجيورودي و پاكسازي داده‌ها - آشنايي).دومين قانون از اين موضوع داراي داراي سطح امنيتي يك (L1) بوده و از بالاترين اولويت (P12) برخوردار مي باشد.
 
قانون IDS01-Jرشته ها را قبل از اعتبارسنجي نرمال سازي كنيد.
 
بسياري از برنامه هاي كاربردي كه رشته هاي ورودي نامطمئن را قبول مي كنند از مكانيزم هاي فيلتر كردن ورودي و اعتبار سنجي بر اساس داده هاي كاراكتري استفاده مي كنند. براي مثال، استراتژي يك برنامه براي اجتناب از آسيب پذيري هاي اسكريپت بين سايتي (XSS) ممكن است حاوي ممنوعيت برچسب <script> باشد. استراتژي هاي ليست سياه بخش مهمي از استراتژي امنيتي را تشكيل مي دهند، با اين وجود اين نوع از استراتژي ها براي اعتبارسنجي و پاكسازي كامل ورودي ناكافي هستند. در پياده سازي، اين شكل از اعتبارسنجي بايد بعد از نرمال سازي ورودي اجرا شود.
اطلاعات كاراكترها در جاوا SE 6 مبتني بر يونيكد استاندارد نسخه 4 (Unicode 2003) است. اطلاعات كاراكترها در جاوا SE 7 مبتني بر يونيكد استاندارد نسخه 6 (Unicode 2011) است.
با توجه به يونيكد استاندارد (Davis 2008annex #‫15  نرمال سازي يونيكد عبارت است از:
 
زماني كه پياده سازي ها رشته ها را در شكل نرمال شده نگاه مي دارند، مي توان مطمئن بود كه رشته هاي معادل داراي يك نمايش يكسان باينري هستند.
اشكال نرمال سازي شده KC و KD نبايد كوركورانه در مورد يك رشته دلخواه به كار برده شوند. زيرا آنها بسياري از تمايزات قالب بندي را پاك مي نمايند، مانع از تبديل دوطرفه بين مجموعه اي از كاراكترها مي شوند و در صورتي كه با يك قالب بندي مناسب جايگزين نشوند، ممكن است تمايزاتي را كه از لحاظ معنايي براي متن مهم است، پاك نمايد. بهترين روش اين است كه اين نرمال سازي ها را به صورت نگاشت هاي حروف بزرگ و كوچك در نظر بگيريم: در مواقع خاصي براي مشخص كردن معناي اصلي مفيد هستند ولي تغييراتي را در متن ايجاد مي كنند كه ممكن است مناسب نباشد. آنها مي توانند در دامنه هايي كه مجموعه كاراكترهاي محدودي دارند آزادانه تر مورد استفاده قرار گيرند.
 
 
اغلب مناسب ترين شكل نرمال سازي براي اجراي اعتبارسنجي ورودي بر روي رشته هاي دلخواه KC(NFKC) است زيرا نرمال سازي با KC، ورودي را تبديل به شكل معادل استانداردي مي كند كه مي تواند به صورت امن با شكل رشته مورد نياز مورد مقايسه قرار گيرد.
 
يك نمونه ناسازگار با قانون
 
اين نمونه ناسازگار با قانون سعي بر اعتبار سنجي string قبل از اجراي نرمال سازي دارد. در نتيجه، منطق اعتبارسنجي نمي تواند به درستي ورودي هايي را كه بايد ريجكت كند، شناسايي كند، زيرا براكت نمي تواند نمايش هاي جايگزين Unicode را تشخيص دهد.
 
// String s may be user controllable
// \uFE64 is normalized to < and \uFE65 is normalized to > using NFKC
String s = "\uFE64" + "script" + "\uFE65";
 
// Validate
Pattern pattern = Pattern.compile("[<>]"); // Check for angle brackets
Matcher matcher = pattern.matcher(s);
if (matcher.find()) {
  // Found black listed tag
  throw new IllegalStateException();
} else {
  // ...
}
 
// Normalize
s = Normalizer.normalize(s, Form.NFKC);
 
تابع normalize() رشته Unicode را به شكل معادل تركيب شده يا تجزيه شده آن درآورده و اجازه جستجوي آسان تر متن را مي دهد. تابع normalize() شكل هاي نرمال سازي استاندارد را پشتيباني مي كند.
 
راه حل سازگار با قانون (عبارت از پيش تعريف شده)
 
اين راه حل سازگار رشته را قبل از اعتبارسنجي، نرمالسازي مي كند. نمايش هاي جايگزين رشته در بين بدو براكت مجتمع شده است. در نتيجه، اعتبارسنجي ورودي به درستي ورودي هاي خرابكار را تشحيص داده و IllegalStateExceptionرافراخواني مي كند.
 
String s = "\uFE64" + "script" + "\uFE65";
 
// Normalize
s = Normalizer.normalize(s, Form.NFKC);
 
// Validate
Pattern pattern = Pattern.compile("[<>]");
Matcher matcher = pattern.matcher(s);
if (matcher.find()) {
  // Found blacklisted tag
  throw new IllegalStateException();
} else {
  // ...
}
 
ارزيابي خطر
 
اعتبارسنجي ورودي قبل از نرمال سازي براي مهاجمان فرصت عبور از فيلترها و ديگر مكانيزم هاي امنيتي را فراهم مي سازد. اين موضوع مي تواند منجر به اجراي كد دلخواه گردد.
 
 
تشخيص اتوماتيك
 
 
 
مطالب مرتبط:
برنامه‌نويسي امن با زبان جاوا - آشنايي
برنامه‌نويسي امن با زبان جاوا - اعتبارسنجي ورودي و پاكسازي داده‌ها
برنامه‌نويسي امن با زبان جاوا – نشت اطلاعات حساس
برنامه‌نويسي امن با زبان جاوا – نشت قابليت ها
برنامه‌نويسي امن با زبان جاوا – انكار سرويس
برنامه‌نويسي امن با زبان جاوا – ارتقاي حقدسترسي
برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجيورودي و پاكسازي داده‌ها - آشنايي
برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها – قانون IDS00-J قسمت دوم
برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها – قانون IDS00-Jقسمت اول

نظرات

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

نوشته

 
تاریخ ایجاد: 18 مرداد 1393

دسته‌ها

امتیاز

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