انجمن گروه موج سازان

نسخه‌ی کامل: برنامه‌نویسی امن با زبان جاوا - اعتبارسنجی ورودی و پاكسازی داده‌ها
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
برنامه‌های نرم‌افزاری معمولاً دارای چندین جزء مختلف هستند كه با یكدیگر تعامل كرده و هر كدام از آنها در یك یا چندین دامنه قابل اعتماد فعالیت می‌كنند. برای مثال، یك جزء ممكن است به فایل‌های سیستمی دسترسی داشته باشد، اما به شبكه دسترسی نداشته باشد، در حالی كه جزئی دیگر به شبكه دسترسی دارد ولی به فایل‌های سیستمی دسترسی ندارد. "سوءظن در تجزیه" و "تفكیك حق دسترسی" نمونه‌هایی از الگوهای طراحی امن هستند كه با استفاده از طراحی سیستمی كه دارای اجزای دو به دو نامعتمد به یكدیگر است، میزان كدهایی كه با حق دسترسی‌های خاص اجرا می‌شوند را كاهش می‌دهد.

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


حملات تزریق SQL

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

[عکس: java_secure_coding_1.PNG]

برنامه‌های نرم‌افزاری لازم است داده‌هایی را كه وارد مرزهای معتمد آنها می‌شوند مورد بررسی قرار داده و از خرابكار نبودن آنها اطمینان حاصل كنند. این امر مستلزم رعایت گام‌های زیر است:

1- اعتبارسنجی
اعتبارسنجی به منظور حصول اطمینان از اینكه داده‌های ورودی در دامنه مورد انتظار و معتبر برنامه قرار دارند، انجام می‌شود. این امر مستلزم اینست كه ورودی‌ها، نیازمندی‌های نوع و دامنه عددی را رعایت كرده و همچنین مطابق با متغیرهای كلاس یا زیرسیستم مربوطه باشند.

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

3- استانداردسازی و نرمال‌سازی
استانداردسازی پروسه‌ كاهش ورودی بدون از دست دادن جزئی از آن است به طوری كه معادل ورودی را با ساده‌ترین شكل ممكن خواهیم داشت. نرمال‌سازی پروسه تبدیل ورودی به ساده‌ترین شكل با از دست دادن بخش‌هایی از ورودی است. استانداردسازی و نرمال‌سازی باید قبل از اعتبارسنجی ورودی انجام شود تا از سوءاستفاده مهاجمین از روتین اعتبارسنجی برای ارسال كاراكترهای نامعتبر و در نتیجه ایجاد یك توالی نامعتبر كاراكترها جلوگیری به عمل آید. نرمال‌سازی باید تنها بر روی ورودی كامل انجام شود و هیچگاه نباید ورودی نرمال‌سازی شده با ورودی نرمال نشده تركیب گردد.

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

در ادامه نمونه‌هایی از زیر‌برنامه‌هایی آورده شده است كه می‌توانند دستورات را تفسیر نمایند:
  • مفسر دستور سیستم عامل
  • یك پایگاه داده با واسط كاربر SQL
  • تجزیه‌گر XML
  • ارزیاب‌های XPath
  • سرویس دایركتوری LDAP
  • موتورهای اسكریپت
  • كامپایلرهای عبارات ( regular regex )

زمانی كه داده‌ای به بخش دیگری از برنامه با حدود معتمد متفاوتی ارسال می‌شود، ارسال كننده باید از مناسب بودن داده برای مرزهای معتمد دریافت‌كننده اطمینان حاصل كند و باید داده‌هایی كه بین دو مرز معتمد جابجا می‌شوند رمزگذاری شوند. به این ترتیب در صورتی كه برای مثال یك بخش از برنامه توسط كدهای خرابكار مورد نفوذ قرار گیرد، بسیاری از حملات به علت اینكه خروجی‌های سیستم به صورت مناسب رمزگذاری می‌شوند، ناكام می‌مانند.