PDA

View Full Version : سوال: چرا ()gets خطرناک است ؟!



Sundown
پنج شنبه 24 اردیبهشت 1388, 11:41 صبح
درود

اریک ریموند (ع) میفرمایند : هرگز از ()gets در برنامه هایتان استفاده نکنید چون به زودی شیاطین به سراغ برنامه یتان خواهد آمد.

این حدیث را چند وقت پیش خوندم ( توی بحار الانوار:بامزه: ) ولی چون به این تابع عادت کرده بودم نمیتونستم کنار بگذارمش. تا هیمن چند روز پیش توی gcc یک برنامه با این تابع نوشتم و در هنگام کامپایل یک وارنینگ داد که شما در این برنامه از ()gets استفاده کردید که تابعی خطرناک هست. دقیقا از همین لفظ استفاده کرد. کنجکاو شدم که چرا این تابع خطرناک است که این قدر استفاده از اون نهی شده ؟!

Nima_NF
جمعه 25 اردیبهشت 1388, 22:11 عصر
در حال حاضر هر تابعی که بدون توجه به تعداد کارکترهای رشته ما، از ورودی داده بگیرید خطرناک هست. مثلا یک رشته با طول 10 کارکتر، اما از ورودی به اندازه 50 کارکتر دریافت کنیم. به این شکل خطای buffer overrun پیش می آید. با این خطا هکرها می توانند به کامپیوتر کاربر برنامه حمله کنند و این یعنی یک bug امنیتی شدید در برنامه شما.

مایکروسافت اکثر این توابع را منسوخ کرده است (همچنان قابل استفاده اند اما با اخطار) و توصیه می کند که از انواع امنیتی استفاده کنید مانند gets_s.
اگر از فایل می خوانید می توانید از fgets استفاده کنید، نمی دانم در لینوکس معادل gets_s چیزی هست یا نه.