۱۰ اشتباه رایج در برنامه نویسی

۱۰ اشتباه رایج در برنامه نویسی

در این مطلب به بررسی رایج ترین اشتباهات برنامه نویسی و کدنویسی میان توسعه دهندگان پرداخته ایم که به سرقت داده ها، نفوذ هکرها و خرابی سیستم منجر می شود. برخی از این اشتباهات به زبان های خاصی مثل C و C++ محدود می شوند اما تعدادی دیگر در زبان های مختلفی نظیر جاوا، جاوا اسکریپت، پایتون و غیره رواج دارند. لیستی که در ادامه می آید به ترتیب اهمیت مرتب شده و به شما توصیه می کنیم برای اجتناب از ارتکاب این اشتباهات به صورت مرتب آن را مرور کنید.



۱. سرریز بافر

سر ریز بافر زمانی رخ می دهد که داده پس از پایان یافتن هم در بافر نوشته می شود. این مشکل ممکن است ناشی از محاسبات اشتباه در مکان نوشتن یا نوشتن ممتد در بافر بدون بررسی طول آن باشد. سر ریز بافر فارغ از دلیل آن یکی از متداول ترین اشتباهات برنامه نویسان است که به درزهای اطلاعاتی گسترده منجر می شود. برای مثال می توان به کرم اینترنتی موریس در ۱۹۸۸، کرم W32/Nimda در ۲۰۰۱ و خطای Sendmail در ۲۰۰۳ اشاره کرد.

مثالی در زبان C

char array[6] = "hello";
strcat(array, ", joe"); /* <- This line causes a buffer overflow. */



۲. تکنیک SQL Injection

تکنیک SQL Injection تکنیکی برای وارد کردن دستورات SQL به ورودی کاربر است به گونه ای که این دستورات مستقیما توسط دیتابیس اجرا شوند. این کار به هکر اجازه اجرای حملاتی نظیر حذف جداول، غیرفعال کردن دیتابیس، سرقت داده و غیره را می دهد.
یکی از دلایل SQL Injection این است که نرم افزار مسئول پردازش ورودی کاربر قبل از ارسال آن به دیتابیس بررسی و ارزیابی کافی را روی داده انجام نمی دهد.

مثالی در جاوا:


// // The following is a parameter value with SQL injection
String username = "joe'; delete from user where username like '%";
Connection con = ...; // create connection to database
// When this statement is executed, all users are deleted from the database.
con.createStatement().execute("update user set logged_in = 1 where username = '" + username + "'");



۳. عملیات OS Command Injection

عملیات OS Command Injection زمانی اتفاق می افتد که ورودی کاربر توسط برنامه و بدون ارزیابی کافی مستقیما برای اجرا به سیستم عامل تحویل می شود. چنین حملاتی در صورتی رخ می دهد که در برنامه کاربردی یا وب سایت مخرب دستورات تزریق شده با امتیازاتی اجرا می شوند.
هنگامی که اپلیکیشن ورودی کاربر را بدون ارزیابی صحیح ارسال می کند، راه را برای اجرای کدهای مخرب توسط هکر هموار می سازد که می تواند به حذف فایل، سرقت داده، تغییر مجوزهای فایل ها و غیره منجر شوند.



۴. سرریز عدد صحیح

سرریز عدد صحیح زمانی به وقوع می پیوندد که نتیجه یک محاسبه از محدوده مجاز قابل پردازش فراتر می رود. در چنین شرایطی عدد حاصل کاهش یافته و نتیجه ای غیرقابل پیش بینی بدست می آید. برای مثال متغیری از نوع unsigned short توانایی ذخیره حداکثر مقدار ۶۵۵۳۵ را دارد و در صورتی که بخواهید دو مقدار ۶۵۵۳۰ و ۱۰ را جمع کرده و در چنین فضایی ذخیره کنید، سر ریز عدد صحیح رخ داده و رقمی غیر منتظره در آن آدرس ذخیره خواهد شد. در صورت استفاده از این عدد در عملیاتی دیگر با مشکل مواجه می شوید.
مثالی در C


short a = 65530, b = 10;
short c = a + b;
// on my computer, c has the unexpected value: 4



۵. اعتبار سنجی نامناسب اندیس آرایه

یکی دیگر از مشکلات متداول در نرم افزارها اعتبار سنجی نامناسب اندیس آرایه است و هنگامی رخ می دهد که برنامه نویس بخواهد با استفاده از اندیسی خارج از محدوده معتبر یک آرایه به آن دسترسی پیدا کند. زمانی که در پی دسترسی به خارج از محدوده معتبر یک متغیر هستید، با خطای دسترسی حافظه مواجه خواهید شد. اگر محل حافظه، درون محدوده داده اما بیرون از آرایه قرار گرفته باشد حین نوشتن چنین محلی با خطای تخریب حافظه مواجه خواهید شد.
خطاهای مورد بحث اغلب در زبان‌های C و ++C متداول هستند اما امکان مواجه با آن‌ها در هر زبان داری مدیریت حافظه خودکار مانند جاوا، جاوا اسکریپت، پایتون و غیره نیز وجود دارد. تنها راه جلوگیری از بروز این قبیل خطاها بالا بردن دقت حین کدنویسی است.



۶. تخصیص منابع بدون محدودیت

تخصیص حافظه در C و C++ بسیار متداول است چرا که تمامی موارد مربوط به مدیریت حافظه در این زبان ها به صورت دستی انجام می شود. تخصیص حافظه بدون ارزیابی اندازه آن منجر به خطا در عملیات تخصیص خواهد شد. وقتی نتیجه تخصیص حافظه، بررسی نشده و عملیات تخصیص به صورت مستقیم صورت پذیرد، باید منتظر وقوع فاجعه باشید. بنابرین هنگام اختصاص آرایه ها در این زبانها باید دقت زیادی به خرج دهید.
یکی دیگر از دلایل این خطاها به ایجاد منابع دیگر مثل فایل هندل ها یا کانکشن هندل ها بدون بررسی کافی برمی گردد (هندل: شاخص منحصر به فردی که سیستم با استفاده از آن، به فایل باز شده و یا ابزار مورد استفاده، اشاره می کند). بستن غیر اصولی این منابع پس از اتمام استفاده از آن‌ها، شایع ترین راه ایجاد محدودیت منابع است.



۷. ارجاع مجدد به اشاره گر منقضی شده

در زبان‌هایی نظیر C و C++ پس از پایان کار با حافظه، امکان آزادسازی آن وجود دارد اما استفاده از اشاره گر برای این بلاک از حافظه که قبلا آزاد شده خطا محسوب می شود. چنین خطایی به خاطر عواقب شدید حتی در خبرهای مربوط به حفره های امنیتی بزرگ نیز گزارش شده؛ بنابرین با بررسی مجدد کد حتما از عدم وقوع این خطا اطمینان حاصل کنید.



۸. ارجاع مجدد به اشاره گر تهی

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



۹. فقدان مقدار دهی اولیه

متغیرهای محلی معمولا درون یک تابع یا بلوک کد تعریف شده و در انتهای بدنه تابع از دسترس خارج می‌شوند. این متغیرها به پشته اختصاص می یابند و پس از اولین تعریف، به صورت تصادفی پاک می شوند. مسئولیت شما به عنوان یک برنامه نویس این است که به محض تعریف این متغیرها، مقدار مناسبی را به آن‌ها اختصاص دهید چرا که استفاده از آنها پیش از مقداردهی اولیه صحیح باعث خطای فقدان مقداردهی اولیه شده و در بهترین حالت به از کار افتادن برنامه منجر خواهد شد.
مثالی در زبان C


int pos;
char buffer[] = "hello world";
// this line may print garbage and/or may crash the program since pos is not initialized.
printf("Value of character at pos %d is: %c\n", pos, buffer[pos]);



۱۰. الگوریتم رمزنگاری شده خطرناک یا ناقص

دنیای رمزنگاری پیوسته در حال تکامل است و آنچه که امروز قابل قبول است ممکن است فردا پذیرفتنی نباشد. دلیل این مساله به افزایش توان کامپیوترها برمی گردد، تا حدی که وظایف سنگینی که امروز پردازش آنها یکسال زمان می برد احتمالا در آینده نزدیک در چند دقیقه پردازش می شوند.
یکی دیگر از دلایل این مساله هم به احتمال پیدا شدن روش های جدید برای عبور از سد الگوریتم های امنیتی برمی گردد. بنابراین شما باید همیشه پیشرفت های رمزنگاری را دنبال کنید تا اگر برای الگوریتم های مورد استفاده آسیب پذیری یا روش نفوذ کشف شد، آنها را سریعا به به‌روزرسانی کنید.
برای مثال استفاده از الگوریتم هشینگ SHA-1 دیگر برای محاسبه هش ها توصیه نمی شود چرا که در سال ۲۰۰۵ حملاتی علیه این الگوریتم صورت گرفت و پس از آن کارشناسان استفاده از SHA-2 یا SHA-3 را پیشنهاد کردند. از این ررو اگر در هر قسمت از برنامه از SHA-1 استفاده شده و هنوز هم از برنامه استفاده می کنید، باید هرچه سریعتر نسبت به جایگزینی آن با الگوریتم مناسب اقدام کنید. در غیر این صورت کدتان را در معرض دسترسی هکرها قرار می دهید.



جمع بندی

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



می توانید از طریق دکمه زیر، مقاله را با دوستانتان در تلگرام به اشتراک بگذارید




منبع: 
10 Most Common Programming and Coding Mistakes
تاریخ درج: 1397/11/29