کتاب آموزش برنامه نویسی امن با زبان C++
در این بخش دانلود رایگان کتاب آموزش برنامه نویسی امن با زبان C++ را به صورت فایل PDF و به زبان فارسی آماده کرده ایم که در قالب ۱۰ فصل و ۳۲۷ صفحه توسط مرکز مدیریت امداد و هماهنگی عملیات رخدادهای رایانه ای (مرکز ماهر) تهیه و منتشر شده است. در ادامه به مقدمه ای از موضوع و معرفی این کتاب پرداخته و فهرست سرفصل ها به همراه لینک دانلود رایگان قرار داده شده است.
مقدمه
با گسترش روز افزون نرم افزارها روی پلتفرم های مختلف، امنیت نرم افزار بیش از پیش مورد توجه قرار گرفته است. وجود آسیب پذیری در یک نرم افزار می تواند اهداف یک مهاجم را تحقق بخشد؛ این اهداف می توانند شامل دسترسی به اطلاعات شخصی یک فرد در رایانه، دسترسی به شبکه خصوصی یک شرکت، سرقت اطلاعات موجود در تلفن همراه، مختل سازی یک سرور و صدها هدف دیگر باشند. شاید یک برنام های به ظاهر، کم اهمیت و ساده جلوه داده شود اما وجود آسیب پذیری در آن ممکن است به خطری جدی برای کاربران آن تبدیل شود. زیرا وجود آسیب پذیری مذکور، به تنهایی برای برآورده ساختن اهداف یک مهاجم کافی است. از این روی، برنامه نویسی ایمن یک برنامه در هر سطح و ابعادی، امری ضروری به شمار می رود.
با توجه به اهمیت امنیت نرم افزار، شرکت های بزرگ دنیا به ارائه راهکارهایی همچون طراحی زبان ها و محیط های برنامه نویسی، مفسر، و مترجم هایی با قابلیت های کنترل امنیتی و نیز، راهکارهای امنیتی روی سیستم عامل و بسیاری از راهکارهای دیگر پرداخته اند، اما با توجه به عدم توانایی راهکارها در کنترل تمامی موارد امنیتی، عدم امکان پیاده سازی راهکارهای امنیتی روی برخی ساختارها، ایجاد محدودیت برای دسترسی به برخی منابع و امکانات، و سایر مشکلات کوچک و بزرگ موجود، برنامه نویسی امن یک برنامه، بهترین راهکار برای محافظت از آن برنامه به شمار می رود.
یکی از زبان هایی که علاوه بر محبوبیت فراوان در میان برنامه نویسان، همیشه از زبان های پر بحث در برنامه نویسی ایمن بوده است، خانواده زبان C و به خصوص در میان آنها زبان C++ است. در این زبان ها، عمده مدیریت منابع به برنامه نویس واگذار شده است، که در صورت عدم مدیریت درست آنها، آسیب پذیری های مختلفی رخ میدهد.
رشد آسیب پذیری نرم افزارها
طبق گزارش های ارائه شده، آسیب پذیری ها در طی چند سال اخیر، رشد قابل توجهی داشته است. همچنین، آسیب پذیری های گزارش شده، در سال ۲۰۱۴ نسبت به سال ۲۰۱۳ ، با رشد ۱۱ درصدی همراه بوده است.
این آمار بیانگر روند صعودی تعداد آسیب پذیری های گزارش شده در سال های اخیر است، که البته رشد کمی نرم افزارها نیز در این بازه، قابل توجه است. بدیهی است که این روند افزایشی، زنگ خطری برای کاربران نرم افزارها محسوب می شود.
برنامه های نوشته شده به زبان سی (C) و سی پلاس پلاس (C++) از جایگاه ویژه ای در این آمار برخوردار هستند، زیرا این زبان ها جدا از محبوبیت، در اکثر محیط های برنامه نویسی و مفسرها، کنترل کامل روند اجرایی یک برنامه و تخصیص منابع را به برنامه نویس سپرده اند، که در صورت عدم مدیریت صحیح این موارد، برنامه با مخاطرات امنیتی جدی روبه رو خواهد شد. در این میان، نیاز است که برنامه نویسان با این مخاطرات آشنا شوند و برنامه را بر مبنای اصول امنیتی طراحی کنند.
ضرورت برنامه نویسی امن
همانطور که اشاره شد، راهکارهای بسیاری برای ایجاد امنیت نرم افزار ارائه شده است. همچنین، شرکت های بزرگ، بخش خاصی را جهت آزمودن سطح امنیتی نرم افزار و نیز برقراری امنیت آن بنا نهاده اند و یا با تکیه بر مکانیزم برون سپاری، نرم افزار را به شرکت های دیگری، که مجری چنین خدماتی هستند، واگذار نموده اند. در این راستا، برنامه ها توسط ابزارهایی خاص مورد سنجش امنیتی قرار می گیرند تا در صورت وجود آسیب پذیری، مالکان را مطلع گردانند. اما، هیچ یک از راهکار های فوق به طور کامل کارآمد نیستند. بهترین راهکار برای جلوگیری از بروز آسیب پذیری نرم افزارها، برنامه نویسی پدافندی و ایمن مبنای آن نرم افزار است.
امروزه این روش، از ارکان اصلی شرکت های نرم افزاری آموزش برنامه نویسی پدافندی و ایمن به برنامه نویسان به شمار می رود. همچنین، شرکت های ارائه دهنده راهکارهای امنیتی، سرویس های آموزش برنامه نویسی پدافندی و ایمن را به برنامه نویسان و شرکت های نرم افزاری ارائه می کنند. شایان ذکر است، برنامه نویسی پدافندی و ایمن یک برنامه تنها بدان معنی نیست که از بروز آسیب پذیری ها جلوگیری به عمل آورد، بلکه، در کنار توجه به فاکتورهای امنیتی، راهکاری برای نوشتن یک برنامه بر مبنای اصول برنامه نویسی است. حتی در صورتی که یک فاکتور به صورت مستقیم با آسیب پذیری مرتبط نباشد و یک خطر امنیتی محسوب نشود، رعایت کد نویسی امن مهم تلقی می گردد.
راهنمای سند مورد مطالعه
سند مورد مطالعه، قوانین را جهت کد نویسی امن در ایمن، قابل اعتماد و امن سیستم ها از طرق مختلف، مانند حذف رفتار های تعریف نشد های که می توانند منجر به برنامه های ناخواسته و نقاط آسیب پذیر قابل سوء استفاده شوند، است. تطابق قوانین کد نویسی تعریف شده در این سند، جهت تأمین و تضمین ایمنی، اعتماد پذیری، و امنیت سیستم های نرم افزاری توسعه یافته در زبان برنامه نویسی C++ لازم هستند اما کافی نیست. همچنین، باید یک طراحی امن و ایمن وجود داشته باشد. معمولا، سیستم حساس به ایمنی، دارای نیازمندی های دقیق تر و سخت گیرانه تری نسبت به استاندارد های کدنویسی است. به عنوان مثال، در این سیستم ها نیاز است که تمامی حافظه به صورت ایستا تخصیص داده شود. اگرچه، این استاندارد کدنویسی در سیستم های با کیفیت بالایی که قابل اعتماد، مستحکم و پایدار در برابر حملات هستند، کاربرد دارند.
هر قانون شامل یک عنوان، یک توصیف، نمونه کدهای ناسازگار، و راهحل های سازگار است. عنوان، یک اختصار است، اما گاهی به تنهایی قادر است کل مفهوم قانون را توصیف نماید. توصیف، نیازمندی های اصولی قانون را مشخص می کند. نمونه کدهای ناسازگار، مثال هایی از کد هستند که نقضی را در قانون ایجاد می کنند. راه حل های سازگار نیز، کدهای مشابه هستند که هیچ قانونی را در این استاندارد کدنویسی نقض نمی کنند. همانگونه که پیش از این مطرح شد، استاندارد کدنویسی مستند و اِعمال پذیر، مؤلفه ای ضروری از کد نویسی در زبان سی پلاس پلاس (C++) به شمار می رود.
استاندارد های کد نویسی، برنامه نویسان را ترغیب می کند تا به جای آنکه بر اساس تمایلات و ترجیحات شخصی خود عمل نمایند، از مجموعه قوانین یکنواخت مشخص شده مبتنی بر نیازمندی های پروژه و نیز سازماندهی آن پیروی کنند. وقتی این امر یکبار انجام پذیرد، استاندارد های مذکور می توانند با استفاده از فرآیند های دستی یا خودکار، به عنوان معیاری جهت ارزیابی کدهای منبع ارزیابی شوند.
کاربرد
هدف اصلی قوانین مورد مطالعه در این مستند، بهبود امنیت نرم افزار از طریق بهبود دانش، آگاهی، شیوه ها، کاربردها، و ابزار مورد استفاده توسعه دهندگان نرم افزار است. این استاندارد می تواند توسط پروژه ها و سازمان ها، جهت توسعه استاندارد های کد نویسی دنباله دار، استفاده شود و روشی مستمر را برای توسعه امنیت نرم افزار فراهم آورد. ممکن است قوانین مذکور توسط قوانین درون سازمانی گسترش یابند. این در حالی است که، قوانین مورد مطالعه در این مستند باید مطیع و منعطف باشند تا با استاندارد موردنظر تطابق یابند.
فهرست مطالب کتاب آموزش برنامه نویسی امن با زبان سی پلاس پلاس
فصل اول: مقدمه
- مقدمه
- رشد آسیب پذیری نرم افزارها
- ضرورت برنامه نویسی امن
- راهنمای سند مورد مطالعه
- کاربرد
- شناسه ها
- رفتار تعریف نشده
- نمونه کدهای ناسازگار و راه حل های سازگار
- استثنائات
- ارزیابی خطر
فصل دوم: اعلان ها و مقداردهی اولیه (DCL)
- DCL50-CPP یک تابع variadic سَبک C تعریف نکنید
- DCL51-CPP یک شناسه ذخیره شده را اعلان یا تعریف نکنید
- DCL52-CPP هرگز مرجع را از نوع const یا volatile توصیف نکنید
- DCL53-CPP اعلاناتی را که از نظر نحوی مبهم هستند، ننویسید
- DCL54-CPP توابع تخصیص و آزاد سازی را به عنوان خروجی در یک حوزه، سربار کنید
- DCL55-CPP از نشت اطلاعات هنگام گذر از یک شی کلاس در حیطه یک مرز اعتماد، جلوگیری نمایید
- DCL56-CPP از ایجاد چرخه ها در مقداردهی اولیه اشیای ایستا بپرهیزید
- DCL57-CPP به استثنائات اجازه ندهید از توابع مخرب یا آزادساز فرار کنند
- DCL58-CPP فضاهای استاندارد را تغییر ندهید
- DCL59-CPP یک فضای بدون نام را در یک فایل سرآیند تعریف نکنید
- DCL60-CPP از قانون تک توصیفی پیروی کنید
فصل سوم: اصطلاحات (EXP)
- EXP50-CPP به ترتیب ارزیابی برای تأثیرات جانبی وابسته نباشید
- EXP51-CPP یک آرایه را توسط یک اشاره گر نادرست حذف نکنید
- EXP52-CPP در عملوند های ارزیابی نشده، به تاثیرات جانبی وابسته نباشید
- EXP53-CPP حافظه مقدارده اولیه نشده را نخوانید
- EXP54-CPP پس از طول عمر یک شی، به آن دسترسی پیدا نکنید
- EXP55-CPP به یک شی cv-qualified توسط یک شی cv-unqualified دسترسی پیدا نکنید
- EXP56-CPP یک تابع را توسط یک پیوند زبانی نامنطبق فراخوانی نکنید
- EXP57-CPP اشاره گرهای کلاس های ناقص را تبدیل و یا حذف نکنید
- EXP58-CPP از یک شی نوع درست به va_start گذر کنید
- EXP59-CPP از offsetof در ارتباط با انواع و اعضای معتبر استفاده کنید
- EXP60-CPP شی نوع لای های غیراستاندارد را از مرزهای اجرا عبور ندهید
- EXP61-CPP نباید یک شی لاندا بیشتر از اشیایی رجوع شده به خود، عمر کند
- EXP62-CPP به بیت های یک ارائه شی، که بخشی از ارائه مقدار شی نیست، دسترسی پیدا نکنید
- EXP63-CPP به مقدار یک شی انتقال یافته تکیه نکنید
فصل چهارم: اعداد صحیح (INT)
- INT50-CPP به مقدار شمارشی خارج از محدوده تبدیل نکنید
فصل پنجم: کاراکترها و رشته ها (STR)
- STR50-CPP تضمین کنید که ذخیرهسازی برای رشته ها، دارای فضای کافی برای داده های کاراکتری و کاراکتر تهی است
- STR51-CPP اقدام به ساخت یک std::string از یک اشاره گر تهی نکنید
- STR52-CPP از ارجاعات، اشاره گرها و تکرارکننده های معتبر برای ارجاع به عناصر یک basic_string استفاده کنید
- STR53-CPP دسترسی به مولفه بررسی را محدوده بندی کنید
فصل ششم: مدیریت حافظه (MEM)
- MEM50-CPP به حافظه آزاد دسترسی پیدا نکنید
- MEM51-CPP منابع تخصیص یافته را درست آزاد کنید
- MEM52-CPP خطا های تخصیص حافظه را تشخیص دهید و به آنها رسیدگی کنید
- MEM53-CPP وقتی طول عمر اشیا به صورت دستی مدیریت می شود، به صراحت اشیا را بسازید و از بین ببرید
- MEM54-CPP توسط اشاره گر مرتب مناسب، جایابی جدید را برای ظرفیت ذخیره سازی کافی فراهم کنید
- MEM55-CPP به نیازمندی های مدیریت ذخیره سازی پویای جایگزینی اولویت دهید
- MEM56-CPP یک مقدار اشاره گر از پیش مالکیت یافته را در یک اشاره گر هوشمند غیر مرتبط ذخیره نکنید
فصل هفتم: ورودی و خروجی (FIO)
- FIO50-CPP به طور متناوب و بدون مداخله یک فراخوانی مکانیابی، از یک جریان فایل، ورودی و خروجی نگیرید
- FIO51-CPP وقتی دیگر به فایل ها نیاز ندارید، آنها را ببندید
فصل هشتم: اداره کردن استثنائات و خطاها (ERR)
- ERR50-CPP به یکباره برنامه را خاتمه ندهید
- ERR51-CPP تمامی استثنائات را اداره کنید
- ERR52-CPP از setjmp() یا longjmp() استفاده نکنید
- ERR53-CPP به کلاس های پایه و یا اعضای دادهای کلاس را در یک اداره کنندهی بلاک try سازنده یا مخرب ارجاع ندهید
- ERR54-CPP اداره کنندگان catch باید انواع پارامتری خود را از بیشترین اشتقاقی تا کمترین اشتقاقی، مرتب کنید
- ERR55-CPP به مشخصات استثنا اولویت دهید
- ERR56-CPP ایمنی استثنا را تضمین کنید
- ERR57-CPP هنگام اداره استثنائات، منابع را نشت ندهید
- ERR58-CPP پیش از آغاز اجرای main() تمامی استثنائات را اداره نمایید
- ERR59-CPP استثنایی را خارج از مرزهای اجرا ایجاد نکنید
- ERR60-CPP اشیای استثنا نباید از طریق کپی قابل ساخت، ایجاد شوند
- ERR61-CPP استثنا ها را به وسیله ارجاع مقدار سمت چپ بگیرید
- ERR62-CPP خطاها را هنگام تبدیل یک رشته به یک عدد تشتخیص دهید
فصل نهم: برنامه نویسی شی گرا (OOP)
- OOP50-CPP توابع مجازی را از طریق سازنده ها یا مخرب ها فراخوانی نکنید
- OOP51-CPP اشیای اشتقاقی را نبُرید
- OOP52-CPP یک شی چند ریختی را بدون مخرب مجازی حذف نکنید
- OOP53-CPP مقداردهنده های اولیه اعضای سازنده را به ترتیب استاندارد بنویسید
- OOP54-CPP به خوبی به تخصیص خود کپی رسیدگی کنید
- OOP55-CPP برای دسترسی به اعضایی که وجود ندارند، از عملگرهای اشاره گر به عضو استفاده نکنید
- OOP56-CPP به نیازمندی های نگهدارنده جایگزینی احترام بگذارید
- OOP57-CPP توابع عضو خاص و عملگرهای دچار سربارشده را به توابع کتابخانهی استاندارد C ترجیح دهید
- OOP58-CPP عملیات های کپی نباید شی منبع را جهش دهند
فصل دهم: همزمانی (CON)
- CON50-CPP یک میوتکس قفل شده را از بین نبرید
- CON51-CPP مطمئن شوید که قفل های برگزار شده فعال، در شرایط استثنایی آزاد می شوند
- CON52-CPP به هنگام دسترسی به فیلدهای بیتی چندین نخ، از رقابت های دادهای بپرهیزید
- CON53-CPP با قفل کردن به ترتیب از پیش تعیین شده، از بن بست اجتناب کنید
- CON54-CPP توابعی را که ممکن است به صورت جعلی در یک حلقه پدیدار شوند، بپوشانید
- CON55-CPP هنگام استفاده از متغیرهای شرطی، ایمنی و حیات نخ را حفظ کنید
- CON56-CPP یک میوتکس غیربازگشتی را که متعلق به فراخوانی نخ است، قفل نکنید
نوشته کتاب آموزش برنامه نویسی امن با زبان C++ به صورت PDF فارسی اولین بار در سورس سرا - آموزش برنامه نویسی. پدیدار شد.