cpp-05-03 - مواظب مشکلات امنیتی باش

بازدید : 20

1

اشتراک

cpp-05-03 - مواظب مشکلات امنیتی باش

توضیحات :

بیایید یک برنامه‌ی ساده با هم بنویسیم.
فرض کن یک آرایه تعریف می‌کنیم:

int a[2];

یعنی آرایه‌ای داریم به نام a که دو خانه بیشتر ندارد:
خانه‌ی 0 و خانه‌ی 1.

تا اینجا همه‌چیز درست است.
می‌توانی به‌صورت دستی مقدار بدهی:

a[0] = 10; a[1] = 30;

اما در برنامه‌های واقعی نمی‌خواهیم تک‌تک اعضا را دستی مقداردهی کنیم.
پس از حلقه استفاده می‌کنیم تا مقدارها را از ورودی بگیریم.


اشتباه رایج: مقداردهی بیشتر از ظرفیت آرایه

کدی شبیه این را بررسی کنیم:

int a[2]; int i = 0; while(i < 4) { cin >> a[i]; i++; }

مشکل چیست؟
حلقه ۴ بار اجرا می‌شود ولی آرایه فقط ۲ خانه دارد!

پس حلقه سعی می‌کند این خانه‌ها را مقداردهی کند:

  • a[0]

  • a[1]

  • a[2] ❌

  • a[3] ❌

درحالی‌که a[2] و a[3 اساساً وجود ندارند.


چرا C++ جلویت را نمی‌گیرد؟

اینجاست که قدرت و خطر C++ را می‌بینی.
این زبان مثل پایتون یا جاوا نیست که جلویت را بگیرد و بگوید:

«خطا! اندیس خارج از محدوده است.»

C++ به تو اعتماد می‌کند.
مقدار را در خانه‌ای از حافظه می‌نویسد که متعلق به آرایه نیست.
ورودی‌ها را می‌گیرد. برنامه کامپایل می‌شود.
اما در لحظه‌ی اجرا (RunTime) ناگهان برنامه کرش می‌کند.

این یک RunTime Error است؛
یکی از خطرناک‌ترین خطاها در زبان‌های سطح پایین.


چرا این مشکل خطرناک است؟

چون خارج شدن از محدوده‌ی آرایه می‌تواند باعث:

Buffer Overflow (سرریز بافر)

یعنی بیشتر از فضای حافظه‌ای که سیستم برایت در نظر گرفته استفاده می‌کنی.

Memory Leak (نشت حافظه)

یعنی بخش‌هایی از حافظه آزاد نمی‌شوند و سیستم به تدریج کند یا دچار مشکل می‌شود.

Security Holes (حفره‌های امنیتی)

بله! این خطاها مسیر نفوذ هکرها هستند.
بسیاری از باگ‌های امنیتی معروف دنیا از همین اتفاق ساده شروع می‌شوند.


نمایش عملی در Visual Studio

اگر همین کد را در Visual Studio اجرا کنی:

  1. ورودی اول → می‌رود در a[0]

  2. ورودی دوم → می‌رود در a[1]

  3. ورودی سوم → وارد حافظه‌ای می‌شود که مال آرایه نیست

  4. ورودی چهارم → باز هم خارج از محدوده می‌نویسد

برنامه چند لحظه بعد Freeze می‌کند، چشمک می‌زند یا کامل کرش می‌کند.

در نهایت باید Debug را متوقف کنی.


چرا این موضوع مهم است؟

تصور کن این برنامه کوچک نباشد.
فرض کن داری:

  • یک سیستم بانکی می‌نویسی

  • یا یک سامانه‌ی کنترل خودرو

  • یا یک ربات که واقعاً در دنیای واقعی حرکت می‌کند

یک خطای کوچک در آرایه می‌تواند منجر به:

  • خطای محاسباتی

  • از دست رفتن داده‌ها

  • رفتار غیرقابل پیش‌بینی

  • یا حتی خرابکاری امنیتی


جمع‌بندی نکته‌ی مهم

در کار با آرایه‌ها همیشه حواست باید باشد:

  • Lower Bound = 0

  • Upper Bound = تعداد اعضا - 1

کوچک‌ترین اشتباه در رعایت محدوده، باعث:

  • کرش

  • باگ‌های خطرناک

  • مشکلات امنیتی

می‌شود.

در بخش بعدی می‌رویم سراغ اینکه چطور اندازه‌ی درست آرایه را مدیریت کنیم و از این خطاهای مرگبار جلوگیری کنیم.

لطفا برای گذاشتن نظرات خود وارد شوید

نظرات شما عزیزان