دسته بندی
Race Conditions
باگ Race Conditions به مشکلاتی در برنامهنویسی اشاره دارد که در آن ترتیب اجرای دستورات توسط برنامه توسط عوامل خارجی تعیین میشود. این موقعیتها به حملهکنندگان اجازه میدهند تا در مواقعی که همزمانی اجرای دستورات در حالی که از منابع مشترک استفاده میکنند، ضعیفی ایجاد کنند و به نحوی اطلاعات را تغییر دهند یا منابع را دسترسیپذیر کنند.مثال:
فرض کنید یک برنامه ساده با قسمتی برای افزایش موجودی حساب کاربری داریم. این برنامه به گونهای طراحی شده است که هر بار که یک کاربر درخواست افزایش موجودی حساب خود را میدهد، برنامه مقدار موجودی حساب را از دیتابیس بخواند، مقدار جدید را محاسبه و سپس در دیتابیس ذخیره کند.
حالا فرض کنید دو کاربر به طور همزمان درخواست افزایش موجودی حساب خود را میدهند. در صورتی که برنامه ما قابلیت همزمانی (
Concurrency) را به خوبی مدیریت نکند، دو کاربر ممکن است در همان لحظه مقدار موجودی را بخوانند، هر دو مقدار جدید را محاسبه کنند و در نهایت مقدار موجودی را با توجه به محاسبات خود به روزرسانی کنند. اینجاست که Race Conditions ایجاد میشود؛ اگر هر دو کاربر به همان زمان به دیتابیس نوشته خود دسترسی داشته باشند، ممکن است یکی از آنها تغییرات دیگری که توسط دیگری انجام داده شده است را پوشش ندهد.روشهای جلوگیری:
1- برای عملیاتهایی که به منابع مشترک دسترسی دارند، مکانیزمهای بهروزرسانی انحصاری (
Locking) را بهکار ببرید تا فقط یک نخ اجازه دسترسی و تغییر منبع را داشته باشد.2- در مواردی که از پایگاه داده استفاده میکنید، از تراکنشها برای محدود کردن دسترسیها و بهروزرسانیها استفاده کنید.
3- از مکانیزمهای
Semaphore و Mutex برای مدیریت دسترسیهای همزمانی در برنامهها استفاده کنید.4- در زبانهای برنامهنویسی که از نخها (
Threads) استفاده میکنند، از مکانیزمهای Thread-safe مانند synchronized استفاده کنید.5- در زبانهای برنامهنویسی که از متغیرهای اتمی پشتیبانی میکنند، از آنها برای جلوگیری از مشکلات
Race Conditions استفاده کنید.6- طراحی مناسب و اجرای کد با رعایت اصول همزمانی و بهروزرسانی منابع مشترک، مشکلات
Race Conditions را کاهش میدهد..